neetob 0.4.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +4 -4
- data/README.md +10 -0
- data/lib/neetob/cli/github/commands.rb +2 -1
- data/lib/neetob/cli/github/make_pr/base.rb +4 -0
- data/lib/neetob/cli/github/make_pr/compliance_fix.rb +1 -1
- data/lib/neetob/cli/github/search.rb +73 -11
- data/lib/neetob/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a0657b62734699934769a7e533576814055ea5221ef854e3addd5c76915635c
|
4
|
+
data.tar.gz: 230107c6ff888b7d8c666aea78243637bd7747ba2ab741e59527ad1528b9a7c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebdb1be1339eb0ac7ae8929f8da953038c00f07aece1d39095a6cac0b7af7a0d42da21a7140fe4b5c18ec96c18269f8d6667005f0396bc6f64031b364cbf153c
|
7
|
+
data.tar.gz: eae36243252b3cd4fa34cada869589339b799a6f59a1b0e0ca463094bc4ede4769daf535c0b7fb8fba0721cadd7090acc971fc9e1e3711dc4a0d3c71a9c2d378
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
### [0.4.2](https://www.github.com/bigbinary/neetob/compare/v0.4.1...v0.4.2) (2023-04-14)
|
4
|
+
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
* 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))
|
9
|
+
|
10
|
+
### [0.4.1](https://www.github.com/bigbinary/neetob/compare/v0.4.0...v0.4.1) (2023-04-05)
|
11
|
+
|
12
|
+
|
13
|
+
### Bug Fixes
|
14
|
+
|
15
|
+
* Updated README.md ([#250](https://www.github.com/bigbinary/neetob/issues/250)) ([ff4f1ed](https://www.github.com/bigbinary/neetob/commit/ff4f1ed67c361805856ed54df02565d7873a45ba))
|
16
|
+
|
3
17
|
## [0.4.0](https://www.github.com/bigbinary/neetob/compare/v0.3.2...v0.4.0) (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.
|
4
|
+
neetob (0.4.2)
|
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.
|
151
|
+
nokogiri (1.14.3-x86_64-darwin)
|
152
152
|
racc (~> 1.4)
|
153
|
-
nokogiri (1.
|
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.
|
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.
|
@@ -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`
|
@@ -23,7 +23,7 @@ module Neetob
|
|
23
23
|
matching_repos = should_fix_nanos ?
|
24
24
|
add_org_suffix(find_all_matching_gems) :
|
25
25
|
find_all_matching_apps_or_repos(repos, :github, sandbox)
|
26
|
-
@failed_repos = matching_repos
|
26
|
+
@failed_repos = matching_repos.clone
|
27
27
|
delete_and_create_temp_neetob_dir
|
28
28
|
matching_repos.each do |repo|
|
29
29
|
ui.info("\nWorking 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
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
28
|
-
|
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
|
data/lib/neetob/version.rb
CHANGED
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.
|
4
|
+
version: 0.4.2
|
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-
|
11
|
+
date: 2023-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|