git-multi 5.0.0 → 8.0.0

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: 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!