git-multi 5.0.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5005557fa2d73eb4101db22dd204c876c6188f39a91325fca56610fe0174d399
4
- data.tar.gz: '08c86b9b8f3db86b7f9a1e13f9a7a649af8b586933a746f619c8e9d0fb3329ea'
3
+ metadata.gz: c73ccad592eda6fef60d7911915d0bb1ca5f737ca2345fefda0df535b58a3a5b
4
+ data.tar.gz: 576070b973791f819e005dbac1d1df64f45bdcde6e998a2677f7212e046933c8
5
5
  SHA512:
6
- metadata.gz: 864abb46e6adc5a22072b831631dcb1b5daedc45fcccbc8a0207ed47fb28896b183cca26efdb191771b5df7bc4c44265bb14af9c3cf6456bab6d05c4a708401c
7
- data.tar.gz: 4aba904daae482a352e7aef74ad47bcaa5ee56085ea59f092a52c0d0bf92294e0db7e901f1e0d9f10c4c201943afea151bfecf099475cb32e08d9979b1d29a97
6
+ metadata.gz: 6e8d0b3afb014f47cc25b31e5194b64d25393fa5554417f47ca73c52a1326e020365dbeb0be72becbdfb4b7b4eaad12c7119d703e6b6fa39761de89b29c7c589
7
+ data.tar.gz: fe03a9afbad48fc226683800286a0da9d9331b96b55c4896ee56c3da75b6c3ef6e52726917b3c60953046cec2619cc7a84ad90e43eadab9a0c79f9c7e925a930
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  /vendor/
10
+ Brewfile.lock.json
data/.pryrc CHANGED
@@ -4,11 +4,13 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'git/multi'
5
5
 
6
6
  # this loads all 'git multi' contribs
7
+ # rubocop:disable Lint/NonDeterministicRequireOrder
7
8
  Dir.glob File.join(__dir__, 'contrib', '**', '*.rb'), &method(:require)
9
+ # rubocop:enable Lint/NonDeterministicRequireOrder
8
10
 
9
11
  # configure a logger
10
12
  require 'logger'
11
- logger = Logger.new(STDOUT)
13
+ logger = Logger.new($stdout)
12
14
  logger.level = Logger::INFO
13
15
 
14
16
  # configure Octokit middleware with logger
data/.rubocop.yml CHANGED
@@ -6,6 +6,10 @@ AllCops:
6
6
  - 'tmp/*'
7
7
  - 'pkg/*'
8
8
 
9
+ require:
10
+ - rubocop-minitest
11
+ - rubocop-rake
12
+
9
13
  Layout/LineLength:
10
14
  Enabled: false
11
15
 
@@ -19,6 +23,9 @@ Metrics/MethodLength:
19
23
  Metrics/ModuleLength:
20
24
  Enabled: false
21
25
 
26
+ Rake/Desc:
27
+ Enabled: false
28
+
22
29
  Style/BlockDelimiters:
23
30
  Enabled: false
24
31
  Style/Documentation:
@@ -38,3 +45,7 @@ Style/TrailingCommaInArrayLiteral:
38
45
  Enabled: false
39
46
  Style/TrailingCommaInHashLiteral:
40
47
  Enabled: false
48
+
49
+ # https://github.com/rubocop/rubocop/issues/10394
50
+ Style/SwapValues:
51
+ Enabled: false
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.6
1
+ 2.6.10
data/Gemfile.lock CHANGED
@@ -1,56 +1,84 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git-multi (5.0.0)
4
+ git-multi (8.0.0)
5
5
  faraday (~> 1)
6
6
  octokit (~> 4)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.7.0)
11
+ addressable (2.8.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
- ast (2.4.1)
13
+ ast (2.4.2)
14
14
  coderay (1.1.3)
15
- faraday (1.0.1)
16
- multipart-post (>= 1.2, < 3)
15
+ faraday (1.10.0)
16
+ faraday-em_http (~> 1.0)
17
+ faraday-em_synchrony (~> 1.0)
18
+ faraday-excon (~> 1.1)
19
+ faraday-httpclient (~> 1.0)
20
+ faraday-multipart (~> 1.0)
21
+ faraday-net_http (~> 1.0)
22
+ faraday-net_http_persistent (~> 1.0)
23
+ faraday-patron (~> 1.0)
24
+ faraday-rack (~> 1.0)
25
+ faraday-retry (~> 1.0)
26
+ ruby2_keywords (>= 0.0.4)
27
+ faraday-em_http (1.0.0)
28
+ faraday-em_synchrony (1.0.0)
29
+ faraday-excon (1.1.0)
30
+ faraday-httpclient (1.0.1)
31
+ faraday-multipart (1.0.4)
32
+ multipart-post (~> 2)
33
+ faraday-net_http (1.0.1)
34
+ faraday-net_http_persistent (1.2.0)
35
+ faraday-patron (1.0.0)
36
+ faraday-rack (1.0.0)
37
+ faraday-retry (1.0.3)
17
38
  interception (0.5)
39
+ json (2.6.2)
18
40
  method_source (1.0.0)
19
- minitest (5.14.1)
20
- multipart-post (2.1.1)
21
- octokit (4.18.0)
22
- faraday (>= 0.9)
23
- sawyer (~> 0.8.0, >= 0.5.3)
24
- parallel (1.19.2)
25
- parser (2.7.1.4)
41
+ minitest (5.16.2)
42
+ multipart-post (2.2.3)
43
+ octokit (4.25.1)
44
+ faraday (>= 1, < 3)
45
+ sawyer (~> 0.9)
46
+ parallel (1.22.1)
47
+ parser (3.1.2.0)
26
48
  ast (~> 2.4.1)
27
- pry (0.13.1)
49
+ pry (0.14.1)
28
50
  coderay (~> 1.1)
29
51
  method_source (~> 1.0)
30
- pry-rescue (1.5.1)
52
+ pry-rescue (1.5.2)
31
53
  interception (>= 0.5)
32
54
  pry (>= 0.12.0)
33
- public_suffix (4.0.5)
34
- rainbow (3.0.0)
35
- rake (13.0.1)
36
- regexp_parser (1.7.1)
37
- rexml (3.2.4)
38
- rubocop (0.85.1)
55
+ public_suffix (4.0.7)
56
+ rainbow (3.1.1)
57
+ rake (13.0.6)
58
+ regexp_parser (2.5.0)
59
+ rexml (3.2.5)
60
+ rubocop (1.32.0)
61
+ json (~> 2.3)
39
62
  parallel (~> 1.10)
40
- parser (>= 2.7.0.1)
63
+ parser (>= 3.1.0.0)
41
64
  rainbow (>= 2.2.2, < 4.0)
42
- regexp_parser (>= 1.7)
43
- rexml
44
- rubocop-ast (>= 0.0.3)
65
+ regexp_parser (>= 1.8, < 3.0)
66
+ rexml (>= 3.2.5, < 4.0)
67
+ rubocop-ast (>= 1.19.1, < 2.0)
45
68
  ruby-progressbar (~> 1.7)
46
- unicode-display_width (>= 1.4.0, < 2.0)
47
- rubocop-ast (0.0.3)
48
- parser (>= 2.7.0.1)
49
- ruby-progressbar (1.10.1)
50
- sawyer (0.8.2)
69
+ unicode-display_width (>= 1.4.0, < 3.0)
70
+ rubocop-ast (1.19.1)
71
+ parser (>= 3.1.1.0)
72
+ rubocop-minitest (0.20.1)
73
+ rubocop (>= 0.90, < 2.0)
74
+ rubocop-rake (0.6.0)
75
+ rubocop (~> 1.0)
76
+ ruby-progressbar (1.11.0)
77
+ ruby2_keywords (0.0.5)
78
+ sawyer (0.9.2)
51
79
  addressable (>= 2.3.5)
52
- faraday (> 0.8, < 2.0)
53
- unicode-display_width (1.7.0)
80
+ faraday (>= 0.17.3, < 3)
81
+ unicode-display_width (2.2.0)
54
82
 
55
83
  PLATFORMS
56
84
  ruby
@@ -63,6 +91,8 @@ DEPENDENCIES
63
91
  pry-rescue
64
92
  rake
65
93
  rubocop
94
+ rubocop-minitest
95
+ rubocop-rake
66
96
 
67
97
  BUNDLED WITH
68
- 2.1.4
98
+ 2.3.19
data/README.md CHANGED
@@ -35,6 +35,8 @@ There are plenty of other utilities out there that do something similar, but typ
35
35
 
36
36
  ## Usage
37
37
 
38
+ Installing the gem installs the `git-multi` executable on your system's `${PATH}`, which means it can be run as a so-called [git subcommand](https://git.github.io/htmldocs/howto/new-command.html#:~:text=Runtime%20environment), as follows: `git multi`; a good starting point is:
39
+
38
40
  $ git multi --help
39
41
 
40
42
  ## Known Issues
data/bin/console CHANGED
@@ -6,4 +6,7 @@ require 'git/multi'
6
6
  require 'pry'
7
7
  Pry.start
8
8
 
9
+ # require "irb"
10
+ # IRB.start(__FILE__)
11
+
9
12
  # That's all Folks!
data/exe/git-multi CHANGED
@@ -6,11 +6,11 @@ require 'git/multi'
6
6
 
7
7
  multi_repo = command = nil
8
8
 
9
- if !STDIN.tty?
10
- # read list of repo full names from STDIN (~pseudo multi-repo)
11
- multi_repo = STDIN.readlines.map(&:strip).map(&:freeze).freeze
12
- # reopen STDIN (to ensure all `Kernel.system` based cmds work)
13
- STDIN.reopen('/dev/tty')
9
+ if !$stdin.tty?
10
+ # read list of repo full names from $stdin (~pseudo multi-repo)
11
+ multi_repo = $stdin.readlines.map(&:strip).map(&:freeze).freeze
12
+ # reopen $stdin (to ensure all `Kernel.system` based cmds work)
13
+ $stdin.reopen('/dev/tty')
14
14
  elsif (command = ARGV.shift)&.start_with?('++')
15
15
  multi_repo = command.delete('++')
16
16
  command = nil
data/git-multi.gemspec CHANGED
@@ -14,7 +14,17 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'https://github.com/pvdb/git-multi'
15
15
  spec.license = 'MIT'
16
16
 
17
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
+ spec.required_ruby_version = ['>= 2.6.0', '< 3.0.0']
18
+
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = spec.homepage
21
+ spec.metadata['changelog_uri'] = File.join(spec.homepage, 'blob', 'master', 'README.md')
22
+
23
+ spec.metadata['rubygems_mfa_required'] = 'true'
24
+
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
28
  `git ls-files -z`
19
29
  .split("\x0")
20
30
  .reject { |f| f.match(%r{^(test|spec|features)/}) }
@@ -34,4 +44,6 @@ Gem::Specification.new do |spec|
34
44
  spec.add_development_dependency 'pry-rescue'
35
45
  spec.add_development_dependency 'rake'
36
46
  spec.add_development_dependency 'rubocop'
47
+ spec.add_development_dependency 'rubocop-minitest'
48
+ spec.add_development_dependency 'rubocop-rake'
37
49
  end
data/lib/ext/string.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  class String
2
- # rubocop:disable Layout/EmptyLineBetweenDefs
3
2
  # rubocop:disable Style/SingleLineMethods
4
3
  def colorize(color_code) "\e[#{color_code}m#{self}\e[0m"; end
5
4
 
@@ -12,5 +11,4 @@ class String
12
11
 
13
12
  def undent() gsub(/^.{#{slice(/^ +/).length}}/, ''); end
14
13
  # rubocop:enable Style/SingleLineMethods
15
- # rubocop:enable Layout/EmptyLineBetweenDefs
16
14
  end
data/lib/git/hub.rb CHANGED
@@ -4,7 +4,7 @@ begin
4
4
  require 'net/http/persistent'
5
5
  if Octokit.middleware.adapter == Faraday::Adapter::NetHttp
6
6
  adapter = Faraday::RackBuilder::Handler.new(Faraday::Adapter::NetHttpPersistent)
7
- Octokit.middleware.instance_variable_set(:'@adapter', adapter)
7
+ Octokit.middleware.instance_variable_set(:@adapter, adapter)
8
8
  end
9
9
  rescue LoadError
10
10
  # NOOP - `Net::HTTP::Persistent` is optional, so
@@ -29,31 +29,31 @@ module Git
29
29
 
30
30
  def connected?
31
31
  @connected ||= begin
32
- client.validate_credentials
33
- true
34
- rescue Faraday::ConnectionFailed
35
- false
36
- end
32
+ client.validate_credentials
33
+ true
34
+ rescue Faraday::ConnectionFailed
35
+ false
36
+ end
37
37
  end
38
38
 
39
39
  # FIXME: update login as part of `--refresh`
40
40
 
41
41
  def login
42
42
  @login ||= begin
43
- client.user.login
44
- rescue Octokit::Unauthorized, Faraday::ConnectionFailed
45
- nil
46
- end
43
+ client.user.login
44
+ rescue Octokit::Unauthorized, Faraday::ConnectionFailed
45
+ nil
46
+ end
47
47
  end
48
48
 
49
49
  # FIXME: update orgs as part of `--refresh`
50
50
 
51
51
  def orgs
52
52
  @orgs ||= begin
53
- client.organizations.map(&:login)
54
- rescue Octokit::Unauthorized, Faraday::ConnectionFailed
55
- []
56
- end
53
+ client.organizations.map(&:login)
54
+ rescue Octokit::Unauthorized, Faraday::ConnectionFailed
55
+ []
56
+ end
57
57
  end
58
58
 
59
59
  # pick a (semi-)random repo from GitHub
@@ -76,10 +76,10 @@ module Git
76
76
 
77
77
  @user_repositories = Hash.new { |repos, (user, type)|
78
78
  repos[[user, type]] = begin
79
- client
80
- .repositories(user, type: type)
81
- .sort_by { |repo| repo[:name].downcase }
82
- end
79
+ client
80
+ .repositories(user, type: type)
81
+ .sort_by { |repo| repo[:name].downcase }
82
+ end
83
83
  }
84
84
 
85
85
  def user_repositories(user, type = :owner)
@@ -93,10 +93,10 @@ module Git
93
93
 
94
94
  @org_repositories = Hash.new { |repos, (org, type)|
95
95
  repos[[org, type]] = begin
96
- client
97
- .org_repositories(org, type: type)
98
- .sort_by { |repo| repo[:name].downcase }
99
- end
96
+ client
97
+ .org_repositories(org, type: type)
98
+ .sort_by { |repo| repo[:name].downcase }
99
+ end
100
100
  }
101
101
 
102
102
  def org_repositories(org, type = :owner)
@@ -133,7 +133,7 @@ module Git
133
133
  begin
134
134
  if repository.instance_eval(commands.join(' && '))
135
135
  repository.just_do_it(
136
- ->(_repo) { nil },
136
+ ->(_repo) {}, # empty lambda: nil
137
137
  ->(repo) { puts repo.full_name },
138
138
  )
139
139
  end
@@ -7,8 +7,8 @@ module Git
7
7
  value.empty? && default ? default : value
8
8
  end
9
9
 
10
- def full_names_for(superproject)
11
- list = `git config --get-all superproject.#{superproject}.repo`
10
+ def global_options(name)
11
+ list = `git config --global --get-all #{name}`
12
12
  list.split($RS).map(&:strip).map(&:freeze)
13
13
  end
14
14
 
@@ -22,8 +22,7 @@ module Git
22
22
  end
23
23
 
24
24
  def env_var(name, default = nil)
25
- value = ENV[name]
26
- (value.nil? || value.empty?) && default ? default : value
25
+ ENV.fetch(name, default)
27
26
  end
28
27
  end
29
28
  end
@@ -16,6 +16,13 @@ module Git
16
16
 
17
17
  \tgit config --global --add \033[1mgit.multi.workarea\033[0m <your_root_workarea>
18
18
 
19
+ You can specify a list of user or organization repositories to ignore:
20
+
21
+ \tgit config --global --add \033[1mgit.multi.exclude\033[0m <org_name>/<repo_name>
22
+ \tgit config --global --add \033[1mgit.multi.exclude\033[0m <user_name>/<repo_name>
23
+
24
+ (can be used multiple times to exclude multiple user or organization repositories)
25
+
19
26
  Thanks for using \033[1mgit multi\033[0m ... the ultimate multi-repo utility for git!
20
27
 
21
28
  PIM
@@ -33,7 +33,10 @@ module Git
33
33
  setting_status(["\tGitHub ", "#{github_count} repositories"])
34
34
  setting_status(["\tcloned ", cloned_count, "(#{missing_count} missing)"])
35
35
  Git::Multi.missing_repositories_for(owner).each do |missing|
36
- setting_status(["\tmissing", missing.full_name], false, false)
36
+ setting_status(["\tmissing", missing.full_name], valid: false, optional: false)
37
+ end
38
+ Git::Multi.excluded_repositories_for(owner).each do |excluded|
39
+ setting_status(["\texcluded", excluded.full_name], valid: false, optional: false)
37
40
  end
38
41
  setting_status(["\tsubdirs", subdir_count, "(#{surplus_count} surplus)"])
39
42
  end
@@ -42,14 +45,14 @@ module Git
42
45
  github_count = Git::Multi.repositories_for(superproject).count
43
46
 
44
47
  if github_count.zero?
45
- setting_status([message, 'listed but not configured'], false, false)
48
+ setting_status([message, 'listed but not configured'], valid: false, optional: false)
46
49
  else
47
- setting_status([message], true)
50
+ setting_status([message], valid: true)
48
51
  Git::Multi.repositories_for(superproject).each do |repo|
49
52
  if File.directory? repo.local_path
50
- setting_status(["\tcloned ", repo.full_name], true)
53
+ setting_status(["\tcloned ", repo.full_name], valid: true)
51
54
  else
52
- setting_status(["\tmissing", repo.full_name], false, false)
55
+ setting_status(["\tmissing", repo.full_name], valid: false, optional: false)
53
56
  end
54
57
  end
55
58
  end
@@ -102,7 +105,7 @@ module Git
102
105
  end
103
106
  end
104
107
 
105
- private_class_method def setting_status(messages, valid = false, optional = true)
108
+ private_class_method def setting_status(messages, valid: false, optional: true)
106
109
  fields = messages.compact.join(' - ')
107
110
  icon = valid ? TICK : optional ? ARROW : CROSS
108
111
  puts "#{icon} #{fields}"
@@ -115,16 +118,16 @@ module Git
115
118
  abbreviate(file),
116
119
  File.file?(file) ? "#{File.size(file).commify} bytes" : nil,
117
120
  ],
118
- file && !file.empty? && File.file?(file),
119
- false
121
+ valid: file && !file.empty? && File.file?(file),
122
+ optional: false,
120
123
  )
121
124
  end
122
125
 
123
126
  private_class_method def directory_status(messages, directory)
124
127
  setting_status(
125
128
  messages,
126
- directory && !directory.empty? && File.directory?(directory),
127
- false
129
+ valid: directory && !directory.empty? && File.directory?(directory),
130
+ optional: false,
128
131
  )
129
132
  end
130
133
  end
@@ -1,7 +1,7 @@
1
1
  module Git
2
2
  module Multi
3
3
  NAME = 'git-multi'.freeze
4
- VERSION = '5.0.0'.freeze
4
+ VERSION = '8.0.0'.freeze
5
5
 
6
6
  def self.version
7
7
  "#{NAME} v#{VERSION}"
data/lib/git/multi.rb CHANGED
@@ -36,9 +36,6 @@ module Git
36
36
  TOKEN = global_option('github.token', DEFAULT_TOKEN)
37
37
 
38
38
  GIT_MULTI_DIR = File.join(HOME, '.git', 'multi')
39
-
40
- FileUtils.mkdir_p(GIT_MULTI_DIR) # ensure `~/.git/multi` directory exists
41
-
42
39
  GITHUB_CACHE = File.join(GIT_MULTI_DIR, 'repositories.byte')
43
40
 
44
41
  USERS = global_list('git.multi.users')
@@ -46,6 +43,7 @@ module Git
46
43
  SUPERPROJECTS = global_list('git.multi.superprojects')
47
44
 
48
45
  MULTI_REPOS = (USERS + ORGANIZATIONS + SUPERPROJECTS)
46
+ EXCLUDED_REPOS = global_options('git.multi.exclude')
49
47
 
50
48
  MAN_PAGE = File.expand_path('../../man/git-multi.1', __dir__)
51
49
  HTML_PAGE = File.expand_path('../../man/git-multi.html', __dir__)
@@ -129,6 +127,9 @@ module Git
129
127
  #
130
128
 
131
129
  def refresh_repositories
130
+ # ensure `~/.git/multi` directory exists
131
+ FileUtils.mkdir_p(GIT_MULTI_DIR)
132
+
132
133
  File.open(GITHUB_CACHE, 'wb') do |file|
133
134
  Marshal.dump(github_repositories, file)
134
135
  end
@@ -148,15 +149,15 @@ module Git
148
149
  else Dir.pwd
149
150
  end
150
151
  Dir.chdir(working_dir) do
151
- if STDOUT.tty? && STDERR.tty?
152
- STDOUT.puts "#{full_name.invert} (#{fractional_index})"
152
+ if $stdout.tty? && $stderr.tty?
153
+ $stdout.puts "#{full_name.invert} (#{fractional_index})"
153
154
  interactive.call(self)
154
- elsif STDERR.tty? && captured
155
- errors = File.join(ENV['TMPDIR'], "git-multi.#{$PID}")
155
+ elsif $stderr.tty? && captured
156
+ errors = File.join(Dir.tmpdir, "git-multi.#{$PID}")
156
157
  captured.call(self, errors)
157
158
  if File.exist?(errors) && !File.zero?(errors)
158
159
  # rubocop:disable Style/StderrPuts
159
- STDERR.puts "#{full_name.invert} (#{fractional_index})"
160
+ $stderr.puts "#{full_name.invert} (#{fractional_index})"
160
161
  Kernel.system "cat #{errors} > /dev/tty ;"
161
162
  # rubocop:enable Style/StderrPuts
162
163
  end
@@ -194,8 +195,10 @@ module Git
194
195
  repo.parent_dir = Pathname.new(File.join(WORKAREA, repo.owner.login))
195
196
  repo.local_path = Pathname.new(File.join(WORKAREA, repo.full_name))
196
197
  repo.fractional_index = "#{index + 1}/#{repos.count}"
198
+ # git multi will "hard ignore" all excluded repos
199
+ repo.excluded = EXCLUDED_REPOS.include?(repo.full_name)
197
200
  # fix 'repo' => https://github.com/octokit/octokit.rb/issues/727
198
- repo.compliant_ssh_url = 'ssh://' + repo.ssh_url.split(':', 2).join('/')
201
+ repo.compliant_ssh_url = "ssh://#{repo.ssh_url.split(':', 2).join('/')}"
199
202
  # remove optional '.git' suffix from 'git@github.com:pvdb/git-multi.git'
200
203
  repo.abbreviated_ssh_url = repo.ssh_url.chomp('.git')
201
204
  # extend 'repo' with 'just do it' capabilities
@@ -213,7 +216,11 @@ module Git
213
216
  # lists of repos for a given multi-repo
214
217
  #
215
218
 
216
- def repositories_for(multi_repo = nil)
219
+ def full_names_for(superproject)
220
+ global_options("superproject.#{superproject}.repo")
221
+ end
222
+
223
+ def all_repositories_for(multi_repo = nil)
217
224
  case (owner = superproject = full_names = multi_repo)
218
225
  when nil
219
226
  repositories # all of them
@@ -226,26 +233,34 @@ module Git
226
233
  repository.owner.login == owner
227
234
  }
228
235
  when *SUPERPROJECTS
229
- repositories_for(full_names_for(superproject))
236
+ all_repositories_for(full_names_for(superproject))
230
237
  else
231
238
  raise ArgumentError, multi_repo
232
239
  end
233
240
  end
234
241
 
242
+ def repositories_for(multi_repo = nil)
243
+ all_repositories_for(multi_repo).delete_if(&:excluded)
244
+ end
245
+
235
246
  #
236
247
  # lists of repositories with a given state
237
248
  #
238
249
 
239
250
  def archived_repositories_for(multi_repo = nil)
240
- repositories_for(multi_repo).find_all(&:archived)
251
+ all_repositories_for(multi_repo).find_all(&:archived)
241
252
  end
242
253
 
243
254
  def forked_repositories_for(multi_repo = nil)
244
- repositories_for(multi_repo).find_all(&:fork)
255
+ all_repositories_for(multi_repo).find_all(&:fork)
245
256
  end
246
257
 
247
258
  def private_repositories_for(multi_repo = nil)
248
- repositories_for(multi_repo).find_all(&:private)
259
+ all_repositories_for(multi_repo).find_all(&:private)
260
+ end
261
+
262
+ def excluded_repositories_for(multi_repo = nil)
263
+ all_repositories_for(multi_repo).find_all(&:excluded)
249
264
  end
250
265
 
251
266
  #
data/man/git-multi.1 CHANGED
@@ -2,12 +2,12 @@
2
2
  .\" Title: git-multi
3
3
  .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
4
4
  .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
5
- .\" Date: 06/20/2020
5
+ .\" Date: 07/30/2022
6
6
  .\" Manual: Git Manual
7
- .\" Source: Git 2.27.0.112.g101b3204f3.dirty
7
+ .\" Source: Git 2.35.1.455.g1a4874565f.dirty
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "GIT\-MULTI" "1" "06/20/2020" "Git 2\&.27\&.0\&.112\&.g101b32" "Git Manual"
10
+ .TH "GIT\-MULTI" "1" "07/30/2022" "Git 2\&.35\&.1\&.455\&.g1a4874" "Git Manual"
11
11
  .\" -----------------------------------------------------------------
12
12
  .\" * Define some portability stuff
13
13
  .\" -----------------------------------------------------------------
@@ -31,7 +31,7 @@
31
31
  git-multi \- execute the same git command in multiple repositories
32
32
  .SH "VERSION"
33
33
  .sp
34
- This is \fBv5\&.0\&.0\fR of \fIgit multi\fR \&... hooray!
34
+ This is \fBv8\&.0\&.0\fR of \fIgit multi\fR \&... hooray!
35
35
  .SH "SYNOPSIS"
36
36
  .sp
37
37
  There are some options for \fBgit multi\fR itself, in which case it is invoked as follows:
@@ -490,32 +490,34 @@ The following is a list of valid arguments for the \fBgit multi \-\-query\fR opt
490
490
  .RS 4
491
491
  .\}
492
492
  .nf
493
- archive_url archived assignees_url
494
- blobs_url branches_url clone_url
495
- collaborators_url comments_url commits_url
496
- compare_url contents_url contributors_url
497
- created_at default_branch deployments_url
498
- description disabled downloads_url
499
- events_url fork forks
500
- forks_count forks_url full_name
501
- git_commits_url git_refs_url git_tags_url
502
- git_url has_downloads has_issues
503
- has_pages has_projects has_wiki
504
- homepage hooks_url html_url
505
- id issue_comment_url issue_events_url
506
- issues_url keys_url labels_url
507
- language languages_url license
508
- merges_url milestones_url mirror_url
509
- name network_count node_id
510
- notifications_url open_issues open_issues_count
511
- organization owner permissions
512
- private pulls_url pushed_at
513
- releases_url size ssh_url
514
- stargazers_count stargazers_url statuses_url
515
- subscribers_count subscribers_url subscription_url
516
- svn_url tags_url teams_url
517
- temp_clone_token trees_url updated_at
518
- url watchers watchers_count
493
+ allow_forking archive_url archived
494
+ assignees_url blobs_url branches_url
495
+ clone_url collaborators_url comments_url
496
+ commits_url compare_url contents_url
497
+ contributors_url created_at default_branch
498
+ deployments_url description disabled
499
+ downloads_url events_url fork
500
+ forks forks_count forks_url
501
+ full_name git_commits_url git_refs_url
502
+ git_tags_url git_url has_downloads
503
+ has_issues has_pages has_projects
504
+ has_wiki homepage hooks_url
505
+ html_url id is_template
506
+ issue_comment_url issue_events_url issues_url
507
+ keys_url labels_url language
508
+ languages_url license merges_url
509
+ milestones_url mirror_url name
510
+ network_count node_id notifications_url
511
+ open_issues open_issues_count organization
512
+ owner permissions private
513
+ pulls_url pushed_at releases_url
514
+ size ssh_url stargazers_count
515
+ stargazers_url statuses_url subscribers_count
516
+ subscribers_url subscription_url svn_url
517
+ tags_url teams_url temp_clone_token
518
+ topics trees_url updated_at
519
+ url visibility watchers
520
+ watchers_count web_commit_signoff_required
519
521
  .fi
520
522
  .if n \{\
521
523
  .RE
@@ -545,6 +547,33 @@ git multi \-\-json | jq \-r \*(Aq\&.[] | select(\&.fork == true) | \&.full_name\
545
547
  .if n \{\
546
548
  .RE
547
549
  .\}
550
+ .SH "CHAINED INVOCATION"
551
+ .sp
552
+ When \fBgit multi\fR gets its input from a Unix pipeline \fI(as opposed to from a TTY)\fR, it constructs an "implicit" multi repo comprised of the "full" repo names it reads from \fBSTDIN\fR \fI(one full repo name per line)\fR\&.
553
+ .sp
554
+ This allows multiple \fBgit multi\fR invocations to be chained, for example by using the \fB\-\-json\fR or \fB\-\-find\fR options as follows:
555
+ .sp
556
+ .if n \{\
557
+ .RS 4
558
+ .\}
559
+ .nf
560
+ # run a git query or subcommand on repos that aren\*(Aqt archived (on GitHub)
561
+ git multi ++<multi_repo> \-\-json | jq \-r \*(Aq\&.[] | select(\&."archived" == false) | \&."full_name"\*(Aq | git multi <git_command>
562
+ .fi
563
+ .if n \{\
564
+ .RE
565
+ .\}
566
+ .sp
567
+ .if n \{\
568
+ .RS 4
569
+ .\}
570
+ .nf
571
+ # run a shell command inside repos that have Ruby as their main language
572
+ git multi ++<multi_repo> \-\-find \*(Aqlanguage == "Ruby"\*(Aq | git multi \-\-raw \*(Aqcat \&.ruby\-version\*(Aq
573
+ .fi
574
+ .if n \{\
575
+ .RE
576
+ .\}
548
577
  .SH "FILES"
549
578
  .PP
550
579
  \fB${HOME}/Workarea\fR
@@ -556,11 +585,6 @@ root directory where repos will been cloned
556
585
  .RS 4
557
586
  local, binary cache of GitHub repository metadata
558
587
  .RE
559
- .PP
560
- \fB${HOME}/\&.git/multi/superprojects\&.config\fR
561
- .RS 4
562
- definitions for so\-called "superproject" multi\-repos
563
- .RE
564
588
  .SH "REFERENCES"
565
589
  .sp
566
590
  .RS 4
data/man/git-multi.erb CHANGED
@@ -246,6 +246,19 @@ are some examples:
246
246
  # print out the name of all "forked" repositories
247
247
  git multi --json | jq -r '.[] | select(.fork == true) | .full_name'
248
248
 
249
+ CHAINED INVOCATION
250
+ ------------------
251
+
252
+ When `git multi` gets its input from a Unix pipeline _(as opposed to from a TTY)_, it constructs an "implicit" multi repo comprised of the "full" repo names it reads from `STDIN` _(one full repo name per line)_.
253
+
254
+ This allows multiple `git multi` invocations to be chained, for example by using the `--json` or `--find` options as follows:
255
+
256
+ # run a git query or subcommand on repos that aren't archived (on GitHub)
257
+ git multi ++<multi_repo> --json | jq -r '.[] | select(."archived" == false) | ."full_name"' | git multi <git_command>
258
+
259
+ # run a shell command inside repos that have Ruby as their main language
260
+ git multi ++<multi_repo> --find 'language == "Ruby"' | git multi --raw 'cat .ruby-version'
261
+
249
262
  FILES
250
263
  -----
251
264
 
@@ -255,9 +268,6 @@ FILES
255
268
  `${HOME}/.git/multi/repositories.byte`::
256
269
  local, binary cache of GitHub repository metadata
257
270
 
258
- `${HOME}/.git/multi/superprojects.config`::
259
- definitions for so-called "superproject" multi-repos
260
-
261
271
  REFERENCES
262
272
  ----------
263
273
 
data/man/git-multi.html CHANGED
@@ -4,7 +4,7 @@
4
4
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5
5
  <head>
6
6
  <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
7
- <meta name="generator" content="AsciiDoc 9.0.0" />
7
+ <meta name="generator" content="AsciiDoc 10.2.0" />
8
8
  <title>git-multi(1)</title>
9
9
  <style type="text/css">
10
10
  /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -748,7 +748,7 @@ git-multi(1) Manual Page
748
748
  <div class="sect1">
749
749
  <h2 id="_version">VERSION</h2>
750
750
  <div class="sectionbody">
751
- <div class="paragraph"><p>This is <code>v5.0.0</code> of <em>git multi</em> &#8230; hooray!</p></div>
751
+ <div class="paragraph"><p>This is <code>v8.0.0</code> of <em>git multi</em> &#8230; hooray!</p></div>
752
752
  </div>
753
753
  </div>
754
754
  <div class="sect1">
@@ -1113,32 +1113,34 @@ and cached locally <em>(in binary format)</em> for performance and offline usage
1113
1113
  <div class="paragraph"><p>The following is a list of valid arguments for the <code>git multi --query</code> option:</p></div>
1114
1114
  <div class="literalblock">
1115
1115
  <div class="content">
1116
- <pre><code>archive_url archived assignees_url
1117
- blobs_url branches_url clone_url
1118
- collaborators_url comments_url commits_url
1119
- compare_url contents_url contributors_url
1120
- created_at default_branch deployments_url
1121
- description disabled downloads_url
1122
- events_url fork forks
1123
- forks_count forks_url full_name
1124
- git_commits_url git_refs_url git_tags_url
1125
- git_url has_downloads has_issues
1126
- has_pages has_projects has_wiki
1127
- homepage hooks_url html_url
1128
- id issue_comment_url issue_events_url
1129
- issues_url keys_url labels_url
1130
- language languages_url license
1131
- merges_url milestones_url mirror_url
1132
- name network_count node_id
1133
- notifications_url open_issues open_issues_count
1134
- organization owner permissions
1135
- private pulls_url pushed_at
1136
- releases_url size ssh_url
1137
- stargazers_count stargazers_url statuses_url
1138
- subscribers_count subscribers_url subscription_url
1139
- svn_url tags_url teams_url
1140
- temp_clone_token trees_url updated_at
1141
- url watchers watchers_count</code></pre>
1116
+ <pre><code>allow_forking archive_url archived
1117
+ assignees_url blobs_url branches_url
1118
+ clone_url collaborators_url comments_url
1119
+ commits_url compare_url contents_url
1120
+ contributors_url created_at default_branch
1121
+ deployments_url description disabled
1122
+ downloads_url events_url fork
1123
+ forks forks_count forks_url
1124
+ full_name git_commits_url git_refs_url
1125
+ git_tags_url git_url has_downloads
1126
+ has_issues has_pages has_projects
1127
+ has_wiki homepage hooks_url
1128
+ html_url id is_template
1129
+ issue_comment_url issue_events_url issues_url
1130
+ keys_url labels_url language
1131
+ languages_url license merges_url
1132
+ milestones_url mirror_url name
1133
+ network_count node_id notifications_url
1134
+ open_issues open_issues_count organization
1135
+ owner permissions private
1136
+ pulls_url pushed_at releases_url
1137
+ size ssh_url stargazers_count
1138
+ stargazers_url statuses_url subscribers_count
1139
+ subscribers_url subscription_url svn_url
1140
+ tags_url teams_url temp_clone_token
1141
+ topics trees_url updated_at
1142
+ url visibility watchers
1143
+ watchers_count web_commit_signoff_required</code></pre>
1142
1144
  </div></div>
1143
1145
  </div>
1144
1146
  </div>
@@ -1162,6 +1164,23 @@ git multi --json | jq -r '.[] | select(.fork == true) | .full_name'</code></pre>
1162
1164
  </div>
1163
1165
  </div>
1164
1166
  <div class="sect1">
1167
+ <h2 id="_chained_invocation">CHAINED INVOCATION</h2>
1168
+ <div class="sectionbody">
1169
+ <div class="paragraph"><p>When <code>git multi</code> gets its input from a Unix pipeline <em>(as opposed to from a TTY)</em>, it constructs an "implicit" multi repo comprised of the "full" repo names it reads from <code>STDIN</code> <em>(one full repo name per line)</em>.</p></div>
1170
+ <div class="paragraph"><p>This allows multiple <code>git multi</code> invocations to be chained, for example by using the <code>--json</code> or <code>--find</code> options as follows:</p></div>
1171
+ <div class="literalblock">
1172
+ <div class="content">
1173
+ <pre><code># run a git query or subcommand on repos that aren't archived (on GitHub)
1174
+ git multi ++&lt;multi_repo&gt; --json | jq -r '.[] | select(."archived" == false) | ."full_name"' | git multi &lt;git_command&gt;</code></pre>
1175
+ </div></div>
1176
+ <div class="literalblock">
1177
+ <div class="content">
1178
+ <pre><code># run a shell command inside repos that have Ruby as their main language
1179
+ git multi ++&lt;multi_repo&gt; --find 'language == "Ruby"' | git multi --raw 'cat .ruby-version'</code></pre>
1180
+ </div></div>
1181
+ </div>
1182
+ </div>
1183
+ <div class="sect1">
1165
1184
  <h2 id="_files">FILES</h2>
1166
1185
  <div class="sectionbody">
1167
1186
  <div class="dlist"><dl>
@@ -1181,14 +1200,6 @@ git multi --json | jq -r '.[] | select(.fork == true) | .full_name'</code></pre>
1181
1200
  local, binary cache of GitHub repository metadata
1182
1201
  </p>
1183
1202
  </dd>
1184
- <dt class="hdlist1">
1185
- <code>${HOME}/.git/multi/superprojects.config</code>
1186
- </dt>
1187
- <dd>
1188
- <p>
1189
- definitions for so-called "superproject" multi-repos
1190
- </p>
1191
- </dd>
1192
1203
  </dl></div>
1193
1204
  </div>
1194
1205
  </div>
@@ -1222,7 +1233,7 @@ the <code>jq</code> command-line utility:
1222
1233
  <div id="footer">
1223
1234
  <div id="footer-text">
1224
1235
  Last updated
1225
- 2020-06-20 07:51:21 BST
1236
+ 2022-07-30 10:20:13 BST
1226
1237
  </div>
1227
1238
  </div>
1228
1239
  </body>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-multi
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Vandenberk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-20 00:00:00.000000000 Z
11
+ date: 2022-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -122,6 +122,34 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-minitest
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
125
153
  description: Run the same git command in a set of related repos
126
154
  email:
127
155
  - pvandenberk@mac.com
@@ -165,14 +193,22 @@ files:
165
193
  homepage: https://github.com/pvdb/git-multi
166
194
  licenses:
167
195
  - MIT
168
- metadata: {}
196
+ metadata:
197
+ homepage_uri: https://github.com/pvdb/git-multi
198
+ source_code_uri: https://github.com/pvdb/git-multi
199
+ changelog_uri: https://github.com/pvdb/git-multi/blob/master/README.md
200
+ rubygems_mfa_required: 'true'
169
201
  post_install_message: "\nThe only required setting for \e[1mgit multi\e[0m is:\n\n\tgit
170
202
  config --global --add \e[1mgithub.token\e[0m <your_github_oauth_token>\n\nThe following
171
203
  settings for \e[1mgit multi\e[0m are\noptional, and take 0, 1 or more values:\n\n\tgit
172
204
  config --global --add \e[1mgit.multi.users\e[0m <list_of_github_users>\n\tgit config
173
205
  --global --add \e[1mgit.multi.organizations\e[0m <list_of_github_orgs>\n\nUnless
174
206
  your top-level workarea is `${HOME}/Workarea` you should also set:\n\n\tgit config
175
- --global --add \e[1mgit.multi.workarea\e[0m <your_root_workarea>\n\nThanks for using
207
+ --global --add \e[1mgit.multi.workarea\e[0m <your_root_workarea>\n\nYou can specify
208
+ a list of user or organization repositories to ignore:\n\n\tgit config --global
209
+ --add \e[1mgit.multi.exclude\e[0m <org_name>/<repo_name>\n\tgit config --global
210
+ --add \e[1mgit.multi.exclude\e[0m <user_name>/<repo_name>\n\n(can be used multiple
211
+ times to exclude multiple user or organization repositories)\n\nThanks for using
176
212
  \e[1mgit multi\e[0m ... the ultimate multi-repo utility for git!\n\n"
177
213
  rdoc_options: []
178
214
  require_paths:
@@ -181,14 +217,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
217
  requirements:
182
218
  - - ">="
183
219
  - !ruby/object:Gem::Version
184
- version: '0'
220
+ version: 2.6.0
221
+ - - "<"
222
+ - !ruby/object:Gem::Version
223
+ version: 3.0.0
185
224
  required_rubygems_version: !ruby/object:Gem::Requirement
186
225
  requirements:
187
226
  - - ">="
188
227
  - !ruby/object:Gem::Version
189
228
  version: '0'
190
229
  requirements: []
191
- rubygems_version: 3.0.3
230
+ rubygems_version: 3.0.3.1
192
231
  signing_key:
193
232
  specification_version: 4
194
233
  summary: The ultimate multi-repo utility for git!