git-multi 4.0.0 → 7.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 +5 -5
- data/.gitignore +1 -0
- data/.pryrc +13 -5
- data/.rubocop.yml +14 -7
- data/.ruby-version +1 -1
- data/Gemfile.lock +60 -27
- data/README.md +2 -0
- data/bin/console +3 -0
- data/exe/git-multi +9 -9
- data/git-multi.gemspec +14 -2
- data/lib/ext/dir.rb +3 -3
- data/lib/ext/string.rb +2 -6
- data/lib/git/hub.rb +25 -27
- data/lib/git/multi/commands.rb +1 -3
- data/lib/git/multi/config.rb +3 -6
- data/lib/git/multi/gemspec.rb +7 -0
- data/lib/git/multi/report.rb +14 -13
- data/lib/git/multi/version.rb +1 -1
- data/lib/git/multi.rb +28 -16
- data/man/git-multi.1 +62 -38
- data/man/git-multi.erb +15 -5
- data/man/git-multi.html +51 -40
- metadata +51 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 0124014ecd67cbda989511455a0a46878a40365660a613337c87b35813a48af8
|
|
4
|
+
data.tar.gz: 46971c1b9b60f26a13eb67453d5ab0f9e88bbcf795ed6709b26b6511d8c341c4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f9061a4c54c89b1eb6ad29949e0c72c6d4d2aadce7e37e498cfc5b2ecd8cbd769685e81d9f188b9d12aea30079d7fbb71944de86a6910a66f2734a074a807eea
|
|
7
|
+
data.tar.gz: 58c513e28b65dcd040b8ac1bf29c62c7130dcf848f0f106db2052ff7578381260b30c4f182c30ba61b4f819cb0a55fd72c9c8773a8a5d08dd3d48b5b93e65f2f
|
data/.gitignore
CHANGED
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
|
-
|
|
7
|
+
# rubocop:disable Lint/NonDeterministicRequireOrder
|
|
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(
|
|
13
|
+
logger = Logger.new($stdout)
|
|
12
14
|
logger.level = Logger::INFO
|
|
13
15
|
|
|
14
16
|
# configure Octokit middleware with logger
|
|
@@ -28,15 +30,21 @@ end
|
|
|
28
30
|
|
|
29
31
|
# utility function to set pry context
|
|
30
32
|
# to an instance of <Octokit::Client>
|
|
31
|
-
def client
|
|
33
|
+
def client
|
|
34
|
+
pry(Git::Hub.send(:client))
|
|
35
|
+
end
|
|
32
36
|
|
|
33
37
|
# utility function to set pry context
|
|
34
38
|
# to the Array of github repositories
|
|
35
|
-
def repos
|
|
39
|
+
def repos
|
|
40
|
+
pry(Git::Multi.repositories)
|
|
41
|
+
end
|
|
36
42
|
|
|
37
43
|
# utility function to set pry context
|
|
38
44
|
# to the various 'git multi' commands:
|
|
39
|
-
def cmds
|
|
45
|
+
def cmds
|
|
46
|
+
pry(Git::Multi::Commands)
|
|
47
|
+
end
|
|
40
48
|
|
|
41
49
|
# utility function to set context
|
|
42
50
|
# to the named github repository:
|
data/.rubocop.yml
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
AllCops:
|
|
2
|
-
TargetRubyVersion: 2.
|
|
2
|
+
TargetRubyVersion: 2.6
|
|
3
|
+
NewCops: enable
|
|
3
4
|
Exclude:
|
|
4
5
|
- 'doc/*'
|
|
5
6
|
- 'tmp/*'
|
|
6
7
|
- 'pkg/*'
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
require:
|
|
10
|
+
- rubocop-minitest
|
|
11
|
+
- rubocop-rake
|
|
12
|
+
|
|
12
13
|
Layout/LineLength:
|
|
13
14
|
Enabled: false
|
|
14
15
|
|
|
@@ -22,6 +23,9 @@ Metrics/MethodLength:
|
|
|
22
23
|
Metrics/ModuleLength:
|
|
23
24
|
Enabled: false
|
|
24
25
|
|
|
26
|
+
Rake/Desc:
|
|
27
|
+
Enabled: false
|
|
28
|
+
|
|
25
29
|
Style/BlockDelimiters:
|
|
26
30
|
Enabled: false
|
|
27
31
|
Style/Documentation:
|
|
@@ -34,11 +38,14 @@ Style/NestedTernaryOperator:
|
|
|
34
38
|
Enabled: false
|
|
35
39
|
Style/RedundantBegin:
|
|
36
40
|
Enabled: false
|
|
37
|
-
|
|
38
|
-
Enabled: false
|
|
41
|
+
|
|
39
42
|
Style/TrailingCommaInArguments:
|
|
40
43
|
Enabled: false
|
|
41
44
|
Style/TrailingCommaInArrayLiteral:
|
|
42
45
|
Enabled: false
|
|
43
46
|
Style/TrailingCommaInHashLiteral:
|
|
44
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.
|
|
1
|
+
2.6.9
|
data/Gemfile.lock
CHANGED
|
@@ -1,51 +1,82 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
git-multi (
|
|
5
|
-
faraday (
|
|
4
|
+
git-multi (7.0.0)
|
|
5
|
+
faraday (~> 1)
|
|
6
6
|
octokit (~> 4)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
-
addressable (2.
|
|
11
|
+
addressable (2.8.0)
|
|
12
12
|
public_suffix (>= 2.0.2, < 5.0)
|
|
13
|
-
ast (2.4.
|
|
14
|
-
coderay (1.1.
|
|
15
|
-
faraday (1.
|
|
13
|
+
ast (2.4.2)
|
|
14
|
+
coderay (1.1.3)
|
|
15
|
+
faraday (1.9.3)
|
|
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.3)
|
|
16
32
|
multipart-post (>= 1.2, < 3)
|
|
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)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
minitest (5.14.0)
|
|
39
|
+
method_source (1.0.0)
|
|
40
|
+
minitest (5.15.0)
|
|
21
41
|
multipart-post (2.1.1)
|
|
22
|
-
octokit (4.
|
|
42
|
+
octokit (4.22.0)
|
|
23
43
|
faraday (>= 0.9)
|
|
24
44
|
sawyer (~> 0.8.0, >= 0.5.3)
|
|
25
|
-
parallel (1.
|
|
26
|
-
parser (
|
|
27
|
-
ast (~> 2.4.
|
|
28
|
-
pry (0.
|
|
29
|
-
coderay (~> 1.1
|
|
30
|
-
method_source (~>
|
|
31
|
-
pry-rescue (1.5.
|
|
45
|
+
parallel (1.21.0)
|
|
46
|
+
parser (3.1.0.0)
|
|
47
|
+
ast (~> 2.4.1)
|
|
48
|
+
pry (0.14.1)
|
|
49
|
+
coderay (~> 1.1)
|
|
50
|
+
method_source (~> 1.0)
|
|
51
|
+
pry-rescue (1.5.2)
|
|
32
52
|
interception (>= 0.5)
|
|
33
53
|
pry (>= 0.12.0)
|
|
34
|
-
public_suffix (4.0.
|
|
35
|
-
rainbow (3.
|
|
36
|
-
rake (13.0.
|
|
37
|
-
|
|
38
|
-
|
|
54
|
+
public_suffix (4.0.6)
|
|
55
|
+
rainbow (3.1.1)
|
|
56
|
+
rake (13.0.6)
|
|
57
|
+
regexp_parser (2.2.0)
|
|
58
|
+
rexml (3.2.5)
|
|
59
|
+
rubocop (1.25.0)
|
|
39
60
|
parallel (~> 1.10)
|
|
40
|
-
parser (>=
|
|
61
|
+
parser (>= 3.1.0.0)
|
|
41
62
|
rainbow (>= 2.2.2, < 4.0)
|
|
63
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
64
|
+
rexml
|
|
65
|
+
rubocop-ast (>= 1.15.1, < 2.0)
|
|
42
66
|
ruby-progressbar (~> 1.7)
|
|
43
|
-
unicode-display_width (>= 1.4.0, <
|
|
44
|
-
|
|
67
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
68
|
+
rubocop-ast (1.15.1)
|
|
69
|
+
parser (>= 3.0.1.1)
|
|
70
|
+
rubocop-minitest (0.17.1)
|
|
71
|
+
rubocop (>= 0.90, < 2.0)
|
|
72
|
+
rubocop-rake (0.6.0)
|
|
73
|
+
rubocop (~> 1.0)
|
|
74
|
+
ruby-progressbar (1.11.0)
|
|
75
|
+
ruby2_keywords (0.0.5)
|
|
45
76
|
sawyer (0.8.2)
|
|
46
77
|
addressable (>= 2.3.5)
|
|
47
78
|
faraday (> 0.8, < 2.0)
|
|
48
|
-
unicode-display_width (1.
|
|
79
|
+
unicode-display_width (2.1.0)
|
|
49
80
|
|
|
50
81
|
PLATFORMS
|
|
51
82
|
ruby
|
|
@@ -58,6 +89,8 @@ DEPENDENCIES
|
|
|
58
89
|
pry-rescue
|
|
59
90
|
rake
|
|
60
91
|
rubocop
|
|
92
|
+
rubocop-minitest
|
|
93
|
+
rubocop-rake
|
|
61
94
|
|
|
62
95
|
BUNDLED WITH
|
|
63
|
-
2.
|
|
96
|
+
2.3.6
|
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
data/exe/git-multi
CHANGED
|
@@ -6,13 +6,13 @@ require 'git/multi'
|
|
|
6
6
|
|
|
7
7
|
multi_repo = command = nil
|
|
8
8
|
|
|
9
|
-
if
|
|
10
|
-
# read list of repo full names from
|
|
11
|
-
multi_repo =
|
|
12
|
-
# reopen
|
|
13
|
-
|
|
14
|
-
elsif (command = ARGV.shift)&.start_with?
|
|
15
|
-
multi_repo = command
|
|
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
|
+
elsif (command = ARGV.shift)&.start_with?('++')
|
|
15
|
+
multi_repo = command.delete('++')
|
|
16
16
|
command = nil
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -54,8 +54,8 @@ begin
|
|
|
54
54
|
end
|
|
55
55
|
rescue ArgumentError
|
|
56
56
|
abort \
|
|
57
|
-
"Unknown multi
|
|
58
|
-
'(use `git multi --report` to list all known multi
|
|
57
|
+
"Unknown multi-repo: #{$ERROR_INFO.message}\n\n" \
|
|
58
|
+
'(use `git multi --report` to list all known multi-repos)'
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
# That's all Folks!
|
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.
|
|
17
|
+
spec.required_ruby_version = ['>= 2.6.0', '< 2.7.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)/}) }
|
|
@@ -25,7 +35,7 @@ Gem::Specification.new do |spec|
|
|
|
25
35
|
|
|
26
36
|
spec.post_install_message = Git::Multi::PIM
|
|
27
37
|
|
|
28
|
-
spec.add_dependency 'faraday', '
|
|
38
|
+
spec.add_dependency 'faraday', '~> 1'
|
|
29
39
|
spec.add_dependency 'octokit', '~> 4'
|
|
30
40
|
|
|
31
41
|
spec.add_development_dependency 'bundler'
|
|
@@ -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/dir.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
class Dir
|
|
2
2
|
def git_repos(subdir = '*')
|
|
3
3
|
Dir.glob(File.join(path, subdir, '*', '.git')).map { |path_to_git_dir|
|
|
4
|
-
path_to_git_repo = File.dirname(path_to_git_dir)
|
|
5
|
-
repo_name = path_to_git_repo[%r{[
|
|
6
|
-
def repo_name.full_name() self; end
|
|
4
|
+
path_to_git_repo = File.dirname(path_to_git_dir) # without "/.git"
|
|
5
|
+
repo_name = path_to_git_repo[%r{[^/]+/[^/]+\z}] # e.g. "pvdb/git-multi"
|
|
6
|
+
def repo_name.full_name() self; end # rubocop:disable Style/SingleLineMethods
|
|
7
7
|
repo_name
|
|
8
8
|
}
|
|
9
9
|
end
|
data/lib/ext/string.rb
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
# rubocop:disable Layout/EmptyLineBetweenDefs
|
|
2
|
-
|
|
3
1
|
class String
|
|
4
|
-
|
|
2
|
+
# rubocop:disable Style/SingleLineMethods
|
|
5
3
|
def colorize(color_code) "\e[#{color_code}m#{self}\e[0m"; end
|
|
6
4
|
|
|
7
5
|
def bold() colorize('1'); end
|
|
@@ -12,7 +10,5 @@ class String
|
|
|
12
10
|
def green() colorize('32'); end
|
|
13
11
|
|
|
14
12
|
def undent() gsub(/^.{#{slice(/^ +/).length}}/, ''); end
|
|
15
|
-
|
|
13
|
+
# rubocop:enable Style/SingleLineMethods
|
|
16
14
|
end
|
|
17
|
-
|
|
18
|
-
# rubocop:enable Layout/EmptyLineBetweenDefs
|
data/lib/git/hub.rb
CHANGED
|
@@ -2,10 +2,10 @@ require 'octokit'
|
|
|
2
2
|
|
|
3
3
|
begin
|
|
4
4
|
require 'net/http/persistent'
|
|
5
|
-
Octokit.middleware.
|
|
6
|
-
Faraday::Adapter::
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
if Octokit.middleware.adapter == Faraday::Adapter::NetHttp
|
|
6
|
+
adapter = Faraday::RackBuilder::Handler.new(Faraday::Adapter::NetHttpPersistent)
|
|
7
|
+
Octokit.middleware.instance_variable_set(:@adapter, adapter)
|
|
8
|
+
end
|
|
9
9
|
rescue LoadError
|
|
10
10
|
# NOOP - `Net::HTTP::Persistent` is optional, so
|
|
11
11
|
# if the gem isn't installed, then we run with the
|
|
@@ -16,7 +16,6 @@ end
|
|
|
16
16
|
|
|
17
17
|
module Git
|
|
18
18
|
module Hub
|
|
19
|
-
|
|
20
19
|
module_function
|
|
21
20
|
|
|
22
21
|
def client
|
|
@@ -30,31 +29,31 @@ module Git
|
|
|
30
29
|
|
|
31
30
|
def connected?
|
|
32
31
|
@connected ||= begin
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
client.validate_credentials
|
|
33
|
+
true
|
|
34
|
+
rescue Faraday::ConnectionFailed
|
|
35
|
+
false
|
|
36
|
+
end
|
|
38
37
|
end
|
|
39
38
|
|
|
40
39
|
# FIXME: update login as part of `--refresh`
|
|
41
40
|
|
|
42
41
|
def login
|
|
43
42
|
@login ||= begin
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
client.user.login
|
|
44
|
+
rescue Octokit::Unauthorized, Faraday::ConnectionFailed
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
48
47
|
end
|
|
49
48
|
|
|
50
49
|
# FIXME: update orgs as part of `--refresh`
|
|
51
50
|
|
|
52
51
|
def orgs
|
|
53
52
|
@orgs ||= begin
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
client.organizations.map(&:login)
|
|
54
|
+
rescue Octokit::Unauthorized, Faraday::ConnectionFailed
|
|
55
|
+
[]
|
|
56
|
+
end
|
|
58
57
|
end
|
|
59
58
|
|
|
60
59
|
# pick a (semi-)random repo from GitHub
|
|
@@ -77,10 +76,10 @@ module Git
|
|
|
77
76
|
|
|
78
77
|
@user_repositories = Hash.new { |repos, (user, type)|
|
|
79
78
|
repos[[user, type]] = begin
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
client
|
|
80
|
+
.repositories(user, type: type)
|
|
81
|
+
.sort_by { |repo| repo[:name].downcase }
|
|
82
|
+
end
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
def user_repositories(user, type = :owner)
|
|
@@ -94,16 +93,15 @@ module Git
|
|
|
94
93
|
|
|
95
94
|
@org_repositories = Hash.new { |repos, (org, type)|
|
|
96
95
|
repos[[org, type]] = begin
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
client
|
|
97
|
+
.org_repositories(org, type: type)
|
|
98
|
+
.sort_by { |repo| repo[:name].downcase }
|
|
99
|
+
end
|
|
101
100
|
}
|
|
102
101
|
|
|
103
102
|
def org_repositories(org, type = :owner)
|
|
104
103
|
# type can be one of: all, public, private, forks, sources, member
|
|
105
104
|
@org_repositories[[org, type]]
|
|
106
105
|
end
|
|
107
|
-
|
|
108
106
|
end
|
|
109
107
|
end
|
data/lib/git/multi/commands.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
module Git
|
|
2
2
|
module Multi
|
|
3
3
|
module Commands
|
|
4
|
-
|
|
5
4
|
module_function
|
|
6
5
|
|
|
7
6
|
def version
|
|
@@ -134,7 +133,7 @@ module Git
|
|
|
134
133
|
begin
|
|
135
134
|
if repository.instance_eval(commands.join(' && '))
|
|
136
135
|
repository.just_do_it(
|
|
137
|
-
->(_repo) { nil
|
|
136
|
+
->(_repo) {}, # empty lambda: nil
|
|
138
137
|
->(repo) { puts repo.full_name },
|
|
139
138
|
)
|
|
140
139
|
end
|
|
@@ -203,7 +202,6 @@ module Git
|
|
|
203
202
|
end
|
|
204
203
|
|
|
205
204
|
private_class_method :system
|
|
206
|
-
|
|
207
205
|
end
|
|
208
206
|
end
|
|
209
207
|
end
|
data/lib/git/multi/config.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module Git
|
|
2
2
|
module Multi
|
|
3
|
-
|
|
4
3
|
module_function
|
|
5
4
|
|
|
6
5
|
def local_option(path, name, default = nil)
|
|
@@ -8,8 +7,8 @@ module Git
|
|
|
8
7
|
value.empty? && default ? default : value
|
|
9
8
|
end
|
|
10
9
|
|
|
11
|
-
def
|
|
12
|
-
list = `git config --get-all
|
|
10
|
+
def global_options(name)
|
|
11
|
+
list = `git config --global --get-all #{name}`
|
|
13
12
|
list.split($RS).map(&:strip).map(&:freeze)
|
|
14
13
|
end
|
|
15
14
|
|
|
@@ -23,9 +22,7 @@ module Git
|
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
def env_var(name, default = nil)
|
|
26
|
-
|
|
27
|
-
(value.nil? || value.empty?) && default ? default : value
|
|
25
|
+
ENV.fetch(name, default)
|
|
28
26
|
end
|
|
29
|
-
|
|
30
27
|
end
|
|
31
28
|
end
|
data/lib/git/multi/gemspec.rb
CHANGED
|
@@ -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
|
data/lib/git/multi/report.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
module Git
|
|
2
2
|
module Multi
|
|
3
3
|
module Report
|
|
4
|
-
|
|
5
4
|
TICK = ['2714'.hex].pack('U*').green.freeze
|
|
6
5
|
CROSS = ['2718'.hex].pack('U*').red.freeze
|
|
7
6
|
ARROW = ['2794'.hex].pack('U*').blue.freeze
|
|
@@ -34,7 +33,10 @@ module Git
|
|
|
34
33
|
setting_status(["\tGitHub ", "#{github_count} repositories"])
|
|
35
34
|
setting_status(["\tcloned ", cloned_count, "(#{missing_count} missing)"])
|
|
36
35
|
Git::Multi.missing_repositories_for(owner).each do |missing|
|
|
37
|
-
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)
|
|
38
40
|
end
|
|
39
41
|
setting_status(["\tsubdirs", subdir_count, "(#{surplus_count} surplus)"])
|
|
40
42
|
end
|
|
@@ -43,14 +45,14 @@ module Git
|
|
|
43
45
|
github_count = Git::Multi.repositories_for(superproject).count
|
|
44
46
|
|
|
45
47
|
if github_count.zero?
|
|
46
|
-
setting_status([message, 'listed but not configured'], false, false)
|
|
48
|
+
setting_status([message, 'listed but not configured'], valid: false, optional: false)
|
|
47
49
|
else
|
|
48
|
-
setting_status([message], true)
|
|
50
|
+
setting_status([message], valid: true)
|
|
49
51
|
Git::Multi.repositories_for(superproject).each do |repo|
|
|
50
52
|
if File.directory? repo.local_path
|
|
51
|
-
setting_status(["\tcloned ", repo.full_name], true)
|
|
53
|
+
setting_status(["\tcloned ", repo.full_name], valid: true)
|
|
52
54
|
else
|
|
53
|
-
setting_status(["\tmissing", repo.full_name], false, false)
|
|
55
|
+
setting_status(["\tmissing", repo.full_name], valid: false, optional: false)
|
|
54
56
|
end
|
|
55
57
|
end
|
|
56
58
|
end
|
|
@@ -77,7 +79,7 @@ module Git
|
|
|
77
79
|
elsif token.empty?
|
|
78
80
|
'(empty)'
|
|
79
81
|
else
|
|
80
|
-
"#{'*' * 36}#{token[36
|
|
82
|
+
"#{'*' * 36}#{token[36..]}"
|
|
81
83
|
end
|
|
82
84
|
end
|
|
83
85
|
|
|
@@ -103,7 +105,7 @@ module Git
|
|
|
103
105
|
end
|
|
104
106
|
end
|
|
105
107
|
|
|
106
|
-
private_class_method def setting_status(messages, valid
|
|
108
|
+
private_class_method def setting_status(messages, valid: false, optional: true)
|
|
107
109
|
fields = messages.compact.join(' - ')
|
|
108
110
|
icon = valid ? TICK : optional ? ARROW : CROSS
|
|
109
111
|
puts "#{icon} #{fields}"
|
|
@@ -116,19 +118,18 @@ module Git
|
|
|
116
118
|
abbreviate(file),
|
|
117
119
|
File.file?(file) ? "#{File.size(file).commify} bytes" : nil,
|
|
118
120
|
],
|
|
119
|
-
file && !file.empty? && File.file?(file),
|
|
120
|
-
false
|
|
121
|
+
valid: file && !file.empty? && File.file?(file),
|
|
122
|
+
optional: false,
|
|
121
123
|
)
|
|
122
124
|
end
|
|
123
125
|
|
|
124
126
|
private_class_method def directory_status(messages, directory)
|
|
125
127
|
setting_status(
|
|
126
128
|
messages,
|
|
127
|
-
directory && !directory.empty? && File.directory?(directory),
|
|
128
|
-
false
|
|
129
|
+
valid: directory && !directory.empty? && File.directory?(directory),
|
|
130
|
+
optional: false,
|
|
129
131
|
)
|
|
130
132
|
end
|
|
131
|
-
|
|
132
133
|
end
|
|
133
134
|
end
|
|
134
135
|
end
|
data/lib/git/multi/version.rb
CHANGED
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
|
|
@@ -139,7 +140,6 @@ module Git
|
|
|
139
140
|
#
|
|
140
141
|
|
|
141
142
|
module Nike
|
|
142
|
-
|
|
143
143
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
144
144
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
145
145
|
def just_do_it(interactive, pipelined, captured = nil, options = {})
|
|
@@ -149,15 +149,15 @@ module Git
|
|
|
149
149
|
else Dir.pwd
|
|
150
150
|
end
|
|
151
151
|
Dir.chdir(working_dir) do
|
|
152
|
-
if
|
|
153
|
-
|
|
152
|
+
if $stdout.tty? && $stderr.tty?
|
|
153
|
+
$stdout.puts "#{full_name.invert} (#{fractional_index})"
|
|
154
154
|
interactive.call(self)
|
|
155
|
-
elsif
|
|
155
|
+
elsif $stderr.tty? && captured
|
|
156
156
|
errors = File.join(ENV['TMPDIR'], "git-multi.#{$PID}")
|
|
157
157
|
captured.call(self, errors)
|
|
158
158
|
if File.exist?(errors) && !File.zero?(errors)
|
|
159
159
|
# rubocop:disable Style/StderrPuts
|
|
160
|
-
|
|
160
|
+
$stderr.puts "#{full_name.invert} (#{fractional_index})"
|
|
161
161
|
Kernel.system "cat #{errors} > /dev/tty ;"
|
|
162
162
|
# rubocop:enable Style/StderrPuts
|
|
163
163
|
end
|
|
@@ -182,7 +182,6 @@ module Git
|
|
|
182
182
|
end
|
|
183
183
|
end
|
|
184
184
|
end
|
|
185
|
-
|
|
186
185
|
end
|
|
187
186
|
|
|
188
187
|
def repositories
|
|
@@ -196,8 +195,10 @@ module Git
|
|
|
196
195
|
repo.parent_dir = Pathname.new(File.join(WORKAREA, repo.owner.login))
|
|
197
196
|
repo.local_path = Pathname.new(File.join(WORKAREA, repo.full_name))
|
|
198
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)
|
|
199
200
|
# fix 'repo' => https://github.com/octokit/octokit.rb/issues/727
|
|
200
|
-
repo.compliant_ssh_url =
|
|
201
|
+
repo.compliant_ssh_url = "ssh://#{repo.ssh_url.split(':', 2).join('/')}"
|
|
201
202
|
# remove optional '.git' suffix from 'git@github.com:pvdb/git-multi.git'
|
|
202
203
|
repo.abbreviated_ssh_url = repo.ssh_url.chomp('.git')
|
|
203
204
|
# extend 'repo' with 'just do it' capabilities
|
|
@@ -215,7 +216,11 @@ module Git
|
|
|
215
216
|
# lists of repos for a given multi-repo
|
|
216
217
|
#
|
|
217
218
|
|
|
218
|
-
def
|
|
219
|
+
def full_names_for(superproject)
|
|
220
|
+
global_options("superproject.#{superproject}.repo")
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def all_repositories_for(multi_repo = nil)
|
|
219
224
|
case (owner = superproject = full_names = multi_repo)
|
|
220
225
|
when nil
|
|
221
226
|
repositories # all of them
|
|
@@ -228,26 +233,34 @@ module Git
|
|
|
228
233
|
repository.owner.login == owner
|
|
229
234
|
}
|
|
230
235
|
when *SUPERPROJECTS
|
|
231
|
-
|
|
236
|
+
all_repositories_for(full_names_for(superproject))
|
|
232
237
|
else
|
|
233
238
|
raise ArgumentError, multi_repo
|
|
234
239
|
end
|
|
235
240
|
end
|
|
236
241
|
|
|
242
|
+
def repositories_for(multi_repo = nil)
|
|
243
|
+
all_repositories_for(multi_repo).delete_if(&:excluded)
|
|
244
|
+
end
|
|
245
|
+
|
|
237
246
|
#
|
|
238
247
|
# lists of repositories with a given state
|
|
239
248
|
#
|
|
240
249
|
|
|
241
250
|
def archived_repositories_for(multi_repo = nil)
|
|
242
|
-
|
|
251
|
+
all_repositories_for(multi_repo).find_all(&:archived)
|
|
243
252
|
end
|
|
244
253
|
|
|
245
254
|
def forked_repositories_for(multi_repo = nil)
|
|
246
|
-
|
|
255
|
+
all_repositories_for(multi_repo).find_all(&:fork)
|
|
247
256
|
end
|
|
248
257
|
|
|
249
258
|
def private_repositories_for(multi_repo = nil)
|
|
250
|
-
|
|
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)
|
|
251
264
|
end
|
|
252
265
|
|
|
253
266
|
#
|
|
@@ -293,6 +306,5 @@ module Git
|
|
|
293
306
|
File.directory? repo.local_path
|
|
294
307
|
}
|
|
295
308
|
end
|
|
296
|
-
|
|
297
309
|
end
|
|
298
310
|
end
|
data/man/git-multi.1
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'\" t
|
|
2
2
|
.\" Title: git-multi
|
|
3
|
-
.\" Author: [FIXME: author] [see http://docbook.
|
|
4
|
-
.\" Generator: DocBook XSL Stylesheets
|
|
5
|
-
.\" Date:
|
|
3
|
+
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
|
|
4
|
+
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
|
|
5
|
+
.\" Date: 02/02/2022
|
|
6
6
|
.\" Manual: Git Manual
|
|
7
|
-
.\" Source: Git 2.
|
|
7
|
+
.\" Source: Git 2.35.1.4.g5d01301f2b.dirty
|
|
8
8
|
.\" Language: English
|
|
9
9
|
.\"
|
|
10
|
-
.TH "GIT\-MULTI" "1" "
|
|
10
|
+
.TH "GIT\-MULTI" "1" "02/02/2022" "Git 2\&.35\&.1\&.4\&.g5d01301f" "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 \
|
|
34
|
+
This is \fBv7\&.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:
|
|
@@ -48,7 +48,7 @@ To execute the same git command in multiple repositories, the invocation is as f
|
|
|
48
48
|
.fi
|
|
49
49
|
.sp
|
|
50
50
|
.sp
|
|
51
|
-
Both ways of running \fBgit multi\fR take an optional, so\-called "multi
|
|
51
|
+
Both ways of running \fBgit multi\fR take an optional, so\-called "multi\-repo" argument to limit the operation to the list of repositories in the referenced "multi\-repo", ie\&. a single GitHub user or a single GitHub organization:
|
|
52
52
|
.sp
|
|
53
53
|
.nf
|
|
54
54
|
\fIgit multi\fR ++<multi_repo> \-\-<option> [<option_arguments>]
|
|
@@ -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
|
|
494
|
-
blobs_url branches_url
|
|
495
|
-
collaborators_url comments_url
|
|
496
|
-
compare_url contents_url
|
|
497
|
-
created_at default_branch
|
|
498
|
-
description disabled
|
|
499
|
-
events_url fork
|
|
500
|
-
forks_count forks_url
|
|
501
|
-
git_commits_url git_refs_url
|
|
502
|
-
git_url has_downloads
|
|
503
|
-
has_pages has_projects
|
|
504
|
-
homepage hooks_url
|
|
505
|
-
id
|
|
506
|
-
issues_url
|
|
507
|
-
language
|
|
508
|
-
merges_url
|
|
509
|
-
name
|
|
510
|
-
notifications_url
|
|
511
|
-
organization
|
|
512
|
-
private
|
|
513
|
-
releases_url
|
|
514
|
-
stargazers_count
|
|
515
|
-
subscribers_count
|
|
516
|
-
svn_url
|
|
517
|
-
temp_clone_token
|
|
518
|
-
|
|
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
|
|
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
|
@@ -26,9 +26,9 @@ invocation is as follows:
|
|
|
26
26
|
[verse]
|
|
27
27
|
'git multi' <git_command> [<git_command_arguments>]
|
|
28
28
|
|
|
29
|
-
Both ways of running `git multi` take an optional, so-called "multi
|
|
29
|
+
Both ways of running `git multi` take an optional, so-called "multi-repo"
|
|
30
30
|
argument to limit the operation to the list of repositories in the referenced
|
|
31
|
-
"multi
|
|
31
|
+
"multi-repo", ie. a single GitHub user or a single GitHub organization:
|
|
32
32
|
|
|
33
33
|
[verse]
|
|
34
34
|
'git multi' ++<multi_repo> --<option> [<option_arguments>]
|
|
@@ -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
|
|
7
|
+
<meta name="generator" content="AsciiDoc 10.1.1" />
|
|
8
8
|
<title>git-multi(1)</title>
|
|
9
9
|
<style type="text/css">
|
|
10
10
|
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
|
@@ -436,7 +436,7 @@ thead, p.table.header {
|
|
|
436
436
|
p.table {
|
|
437
437
|
margin-top: 0;
|
|
438
438
|
}
|
|
439
|
-
/* Because the table frame attribute is
|
|
439
|
+
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
|
440
440
|
div.tableblock > table[frame="void"] {
|
|
441
441
|
border-style: none;
|
|
442
442
|
}
|
|
@@ -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>
|
|
751
|
+
<div class="paragraph"><p>This is <code>v7.0.0</code> of <em>git multi</em> … hooray!</p></div>
|
|
752
752
|
</div>
|
|
753
753
|
</div>
|
|
754
754
|
<div class="sect1">
|
|
@@ -766,9 +766,9 @@ invocation is as follows:</p></div>
|
|
|
766
766
|
<pre class="content"><em>git multi</em> <git_command> [<git_command_arguments>]</pre>
|
|
767
767
|
<div class="attribution">
|
|
768
768
|
</div></div>
|
|
769
|
-
<div class="paragraph"><p>Both ways of running <code>git multi</code> take an optional, so-called "multi
|
|
769
|
+
<div class="paragraph"><p>Both ways of running <code>git multi</code> take an optional, so-called "multi-repo"
|
|
770
770
|
argument to limit the operation to the list of repositories in the referenced
|
|
771
|
-
"multi
|
|
771
|
+
"multi-repo", ie. a single GitHub user or a single GitHub organization:</p></div>
|
|
772
772
|
<div class="verseblock">
|
|
773
773
|
<pre class="content"><em>git multi</em> ++<multi_repo> --<option> [<option_arguments>]</pre>
|
|
774
774
|
<div class="attribution">
|
|
@@ -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
|
|
1117
|
-
blobs_url branches_url
|
|
1118
|
-
collaborators_url comments_url
|
|
1119
|
-
compare_url contents_url
|
|
1120
|
-
created_at default_branch
|
|
1121
|
-
description disabled
|
|
1122
|
-
events_url fork
|
|
1123
|
-
forks_count forks_url
|
|
1124
|
-
git_commits_url git_refs_url
|
|
1125
|
-
git_url has_downloads
|
|
1126
|
-
has_pages has_projects
|
|
1127
|
-
homepage hooks_url
|
|
1128
|
-
id
|
|
1129
|
-
issues_url
|
|
1130
|
-
language
|
|
1131
|
-
merges_url
|
|
1132
|
-
name
|
|
1133
|
-
notifications_url
|
|
1134
|
-
organization
|
|
1135
|
-
private
|
|
1136
|
-
releases_url
|
|
1137
|
-
stargazers_count
|
|
1138
|
-
subscribers_count
|
|
1139
|
-
svn_url
|
|
1140
|
-
temp_clone_token
|
|
1141
|
-
|
|
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</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 ++<multi_repo> --json | jq -r '.[] | select(."archived" == false) | ."full_name"' | git multi <git_command></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 ++<multi_repo> --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
|
-
|
|
1236
|
+
2022-02-02 17:29:17 GMT
|
|
1226
1237
|
</div>
|
|
1227
1238
|
</div>
|
|
1228
1239
|
</body>
|
metadata
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: git-multi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 7.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter Vandenberk
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '1'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '1'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: octokit
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -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\
|
|
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,16 +217,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
181
217
|
requirements:
|
|
182
218
|
- - ">="
|
|
183
219
|
- !ruby/object:Gem::Version
|
|
184
|
-
version:
|
|
220
|
+
version: 2.6.0
|
|
221
|
+
- - "<"
|
|
222
|
+
- !ruby/object:Gem::Version
|
|
223
|
+
version: 2.7.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
|
-
|
|
192
|
-
|
|
193
|
-
signing_key:
|
|
230
|
+
rubygems_version: 3.0.3.1
|
|
231
|
+
signing_key:
|
|
194
232
|
specification_version: 4
|
|
195
233
|
summary: The ultimate multi-repo utility for git!
|
|
196
234
|
test_files: []
|