neetob 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0efeb267893c2c4b205174f5c8e98f995b96ecb9c897802a7a6ebb69b35c948b
4
- data.tar.gz: b67600bfdfbb52cc703ca194db5d68e2353dc0d3533f038b2a2a3085a4ab37b6
3
+ metadata.gz: 9fd60283a5ac6d285fe20a16357e39d0c72d9c48964d44016915eda55cd41a41
4
+ data.tar.gz: dc89a8882804bd9d774c6ae8e7f91760fb15ad000a7d0eb6ec89d7bb447c717d
5
5
  SHA512:
6
- metadata.gz: 37aaf0fc506ab02bf04450e54de083cefe1b953620f8ec73ad08e0dbb35dc245420af2b98fdd1cc4acb3c4ee5b58ddf377dd5c7ae7f4af9a43bb812eb12edcfe
7
- data.tar.gz: e09bebaa6f439bcbb217de61a9822df674bfaab52f1a22680b4eccb45a0bd2d759122c257a487bacb582c4a8ae5d815c7ed0359e53a2dbe6630c0d7ca84e3b83
6
+ metadata.gz: 3a373c5ca6a6e9a77071e5714d7b08c9ebdd03e2c0567ac1b7280233d28659c7491255ede9d20a185bdb5764b7d6b6746ce31a0ab43333a02f4f16fce77edf55
7
+ data.tar.gz: 1208e7c0d1dc21e242bbcaa68b58e07f4e4d544f39e63582599b85597c0340effa7fb8ff10a78fce4f0456b20569eba442d85a2f077772b57a437b9b7d1db01b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ### [0.4.3](https://www.github.com/bigbinary/neetob/compare/v0.4.2...v0.4.3) (2023-04-25)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * Added frontend packages option for make-pr command ([#255](https://www.github.com/bigbinary/neetob/issues/255)) ([a884e24](https://www.github.com/bigbinary/neetob/commit/a884e24a5160ba28cae90ba73e9a4853587be4e6))
9
+
10
+ ### [0.4.2](https://www.github.com/bigbinary/neetob/compare/v0.4.1...v0.4.2) (2023-04-14)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * Allow regex values for path and keyword in github search command. ([#233](https://www.github.com/bigbinary/neetob/issues/233)) ([f6866db](https://www.github.com/bigbinary/neetob/commit/f6866dbe3decf897c483a5b77aaa8989a21192d4))
16
+
3
17
  ### [0.4.1](https://www.github.com/bigbinary/neetob/compare/v0.4.0...v0.4.1) (2023-04-05)
4
18
 
5
19
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- neetob (0.4.1)
4
+ neetob (0.4.3)
5
5
  brakeman (~> 5.0)
6
6
  chronic
7
7
  dotenv (~> 2.8.1)
@@ -148,9 +148,9 @@ GEM
148
148
  net-smtp (0.3.3)
149
149
  net-protocol
150
150
  nio4r (2.5.8)
151
- nokogiri (1.13.10-x86_64-darwin)
151
+ nokogiri (1.14.3-x86_64-darwin)
152
152
  racc (~> 1.4)
153
- nokogiri (1.13.10-x86_64-linux)
153
+ nokogiri (1.14.3-x86_64-linux)
154
154
  racc (~> 1.4)
155
155
  octokit (4.25.1)
156
156
  faraday (>= 1, < 3)
@@ -166,7 +166,7 @@ GEM
166
166
  coderay (~> 1.1)
167
167
  method_source (~> 1.0)
168
168
  public_suffix (5.0.0)
169
- racc (1.6.1)
169
+ racc (1.6.2)
170
170
  rack (2.2.6.4)
171
171
  rack-test (2.0.2)
172
172
  rack (>= 1.3)
data/README.md CHANGED
@@ -164,6 +164,16 @@ Searches for keywords across multiple neeto projects within specified files by u
164
164
  neetob github search --keyword neeto --path README.md --repos "neeto-*-staging"
165
165
  ```
166
166
 
167
+ We can also use regular-expressions as the value for both the keyword and the path of the file.
168
+
169
+ ```sh
170
+ neetob github search --keyword "ne*to" --path ".*\.md$" --repos "neeto-*-staging"
171
+ ```
172
+
173
+ The above command searches for all occurrences of any word matching the given reg-expression in all files with the extension ".md".
174
+
175
+ We can pass the `--replace` option to replace all found instances of the keyword with another word.
176
+
167
177
  ### Protect branch
168
178
 
169
179
  Updates branch protection rules in neeto repos by using the `protect_branch` command.
@@ -218,6 +228,10 @@ neetob github make-pr compliance-fix --nanos
218
228
  # The `script` command runs the given script for each product and create a PR
219
229
  neetob github make-pr script --path ~/Desktop/fix-folders.sh --branch "neetob-test" \
220
230
  --title "PR title" --description "PR description"
231
+
232
+ # Create PRs using script in neeto frontend packages
233
+ neetob github make-pr script --path ~/Desktop/fix-folders.sh --branch "neetob-test" \
234
+ --title "PR title" --description "PR description" --frontend-packages
221
235
  ```
222
236
 
223
237
  ### Gems
@@ -100,5 +100,10 @@ module Neetob
100
100
  all_available_gems = NeetoCompliance::NeetoRepos.nanos_backend
101
101
  match_apps(gems || ["*"], all_available_gems)
102
102
  end
103
+
104
+ def find_all_matching_frontend_packages(packages = ["*"])
105
+ all_available_packages = NeetoCompliance::NeetoRepos.nanos_frontend
106
+ match_apps(packages || ["*"], all_available_packages)
107
+ end
103
108
  end
104
109
  end
@@ -31,8 +31,9 @@ module Neetob
31
31
  option :keyword, type: :string, aliases: "-k", desc: "Keyword which needs to be searched", required: true
32
32
  option :path, type: :string, aliases: "-p",
33
33
  desc: "Path of the file in which you want to search the given keyword.", required: true
34
+ option :replace, type: :string, aliases: "-s", desc: "Word with which you want to replace the found instances of the keyword"
34
35
  def search
35
- Search.new(options[:repos], options[:keyword], options[:path], options[:sandbox]).run
36
+ Search.new(options[:repos], options[:keyword], options[:path], options[:replace], options[:sandbox]).run
36
37
  end
37
38
 
38
39
  desc "login", "Update the Github access token by authenticating via browser"
@@ -36,6 +36,10 @@ module Neetob
36
36
  `git clone --quiet --depth 1 git@github.com:#{repo}.git /tmp/neetob/#{repo_name_without_org_suffix(repo)}`
37
37
  end
38
38
 
39
+ def clone_repo_in_tmp_dir(repo)
40
+ `git clone --quiet git@github.com:#{repo}.git /tmp/neetob/#{repo_name_without_org_suffix(repo)}`
41
+ end
42
+
39
43
  def add_commmit_and_push_changes(repo)
40
44
  `#{cd_to_repo_in_tmp_dir(repo)} && git add . && \\
41
45
  git commit -m "#{pr_title}" && git push -u origin #{branch_name} --force`
@@ -74,6 +78,14 @@ module Neetob
74
78
  def add_org_suffix(repos)
75
79
  repos.map { |repo| "bigbinary/#{repo}" }
76
80
  end
81
+
82
+ def build_matching_repos_list(should_fix_nanos, should_fix_frontend_packages = false)
83
+ return add_org_suffix(find_all_matching_gems) if should_fix_nanos
84
+
85
+ return add_org_suffix(find_all_matching_frontend_packages) if should_fix_frontend_packages
86
+
87
+ find_all_matching_apps_or_repos(repos, :github, sandbox)
88
+ end
77
89
  end
78
90
  end
79
91
  end
@@ -27,10 +27,11 @@ module Neetob
27
27
  option :title, type: :string, aliases: "-t", desc: "Title for the PR"
28
28
  option :branch, type: :string, aliases: "-b", desc: "Feature branch name for the PR"
29
29
  option :description, type: :string, aliases: "-d", desc: "Description of the PR"
30
+ option :frontend_packages, type: :boolean, aliases: "-f", default: false, desc: "Use this flag to make PRs for the neeto frontend packages"
30
31
  def script
31
32
  Script.new(
32
33
  options[:repos], options[:path], options[:title], options[:branch], options[:description],
33
- options[:nanos], options[:sandbox]).run
34
+ options[:nanos], options[:frontend_packages], options[:sandbox]).run
34
35
  end
35
36
  end
36
37
  end
@@ -20,9 +20,7 @@ module Neetob
20
20
  end
21
21
 
22
22
  def run
23
- matching_repos = should_fix_nanos ?
24
- add_org_suffix(find_all_matching_gems) :
25
- find_all_matching_apps_or_repos(repos, :github, sandbox)
23
+ matching_repos = build_matching_repos_list(should_fix_nanos)
26
24
  @failed_repos = matching_repos.clone
27
25
  delete_and_create_temp_neetob_dir
28
26
  matching_repos.each do |repo|
@@ -9,22 +9,22 @@ module Neetob
9
9
  module Github
10
10
  module MakePr
11
11
  class Script < Base
12
- attr_accessor :repos, :sandbox, :path_to_the_script_file, :pr_description, :should_fix_nanos
12
+ attr_accessor :repos, :sandbox, :path_to_the_script_file, :pr_description, :should_fix_nanos,
13
+ :should_fix_frontend_packages
13
14
 
14
15
  def initialize(repos, path_to_the_script_file, pr_title,
15
- branch_name, pr_description, should_fix_nanos, sandbox = false)
16
+ branch_name, pr_description, should_fix_nanos, should_fix_frontend_packages = false, sandbox = false)
16
17
  super(pr_title, branch_name)
17
18
  @repos = repos
18
19
  @sandbox = sandbox
19
20
  @path_to_the_script_file = path_to_the_script_file
20
21
  @pr_description = pr_description
21
22
  @should_fix_nanos = should_fix_nanos
23
+ @should_fix_frontend_packages = should_fix_frontend_packages
22
24
  end
23
25
 
24
26
  def run
25
- matching_repos = should_fix_nanos ?
26
- add_org_suffix(find_all_matching_gems) :
27
- find_all_matching_apps_or_repos(repos, :github, sandbox)
27
+ matching_repos = build_matching_repos_list(should_fix_nanos, should_fix_frontend_packages)
28
28
  delete_and_create_temp_neetob_dir
29
29
  matching_repos.each do |repo|
30
30
  ui.info("\n Working on #{repo} \n")
@@ -1,37 +1,99 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base"
3
+ require_relative "./make_pr/base"
4
4
 
5
5
  module Neetob
6
6
  class CLI
7
7
  module Github
8
- class Search < Base
9
- attr_accessor :repos, :key_to_search, :search_file_path, :sandbox
8
+ class Search < MakePr::Base
9
+ attr_accessor :repos, :key_to_search, :search_file_path, :replacement_term, :sandbox
10
10
 
11
- def initialize(repos, key_to_search, search_file_path, sandbox = false)
12
- super()
13
- @repos = repos
11
+ def initialize(repos, key_to_search, search_file_path, replacement_term, sandbox = false)
14
12
  @key_to_search = key_to_search
13
+ @replacement_term = replacement_term
14
+ branch_name = build_branch_name
15
+ pr_title = build_pr_title
16
+ super(pr_title, branch_name)
15
17
  @search_file_path = search_file_path
18
+ @repos = repos
16
19
  @sandbox = sandbox
17
20
  end
18
21
 
19
22
  def run
20
23
  matching_repos = find_all_matching_apps_or_repos(repos, :github, sandbox)
21
24
  matching_repos.each do |repo|
25
+ ui.info("\nSearching in #{repo}")
26
+ clone_repo_in_tmp_dir(repo)
22
27
  begin
23
- ui.info("\n Searching in \"#{repo}/#{search_file_path}\" for \"#{key_to_search}\"\n")
24
- content = Base64.decode64(client.contents(repo, path: search_file_path).content)
25
- ui.error("Keyword not found") and next unless content.include? key_to_search
28
+ if replacement_term.nil?
29
+ find_and_print_matching_lines(repo)
30
+ else
31
+ check_and_delete_remote_branch(repo)
32
+ find_and_replace_keyword(repo)
33
+ ui.say("No changes were made to #{repo}, check if keyword exists.") and next if !are_changes_made?(repo)
26
34
 
27
- content.each_line do |line|
28
- ui.success(line) if line.include?(key_to_search)
35
+ ui.info(add_commmit_and_push_changes(repo))
36
+ delete_local_feature_branch(repo)
37
+ pull_request = client.create_pull_request(repo, "main", branch_name, pr_title)
38
+ ui.success("Successfully replaced \"#{key_to_search}\" with \"#{replacement_term}\" in #{repo}")
39
+ ui.success("PR Link:- #{pull_request.html_url}")
29
40
  end
30
41
  rescue StandardError => e
31
42
  ExceptionHandler.new(e).process
32
43
  end
33
44
  end
45
+ `rm -rf /tmp/neetob`
34
46
  end
47
+
48
+ private
49
+
50
+ def search_for_keyword(repo)
51
+ `#{cd_to_repo_in_tmp_dir(repo)} && \
52
+ find . -type f -iregex "#{search_file_path}" | xargs grep -E "#{key_to_search}"`
53
+ end
54
+
55
+ def find_and_print_matching_lines(repo)
56
+ files_with_matching_lines = find_matching_files(repo)
57
+ files_with_matching_lines.empty? ? ui.error("Keyword not found")
58
+ : print_matching_lines(files_with_matching_lines)
59
+ end
60
+
61
+ def find_matching_files(repo)
62
+ result = search_for_keyword(repo)
63
+ result.each_line.reduce({}) do |lines_by_file, line|
64
+ filename, content = line.split(":", 2)
65
+ lines_by_file[filename] ||= []
66
+ lines_by_file[filename] << content.strip
67
+ lines_by_file
68
+ end
69
+ end
70
+
71
+ def print_matching_lines(files_with_matching_lines)
72
+ files_with_matching_lines.each do |file, list_of_lines|
73
+ ui.info("#{file}")
74
+ list_of_lines.each { |line| ui.success(" ↳#{line}") }
75
+ end
76
+ end
77
+
78
+ def are_changes_made?(repo)
79
+ changes_made = `#{cd_to_repo_in_tmp_dir(repo)} && git checkout #{branch_name} && git status`
80
+ !changes_made.include?("nothing to commit")
81
+ end
82
+
83
+ def find_and_replace_keyword(repo)
84
+ `#{cd_to_repo_in_tmp_dir(repo)} && \
85
+ find . -type f -regex #{search_file_path} -print0 | \
86
+ xargs -0 sed -i '' 's/#{key_to_search}/#{replacement_term}/g'`
87
+ end
88
+
89
+ def build_pr_title
90
+ "Replaced \"#{key_to_search}\" with \"#{replacement_term}\""
91
+ end
92
+
93
+ def build_branch_name
94
+ branch_name = "search-#{key_to_search}-and-replace-with-#{replacement_term}"
95
+ branch_name.gsub(/\W/, "_")
96
+ end
35
97
  end
36
98
  end
37
99
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Neetob
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neetob
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Udai Gupta
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-05 00:00:00.000000000 Z
11
+ date: 2023-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor