git-multi 2.0.0 → 2.1.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: 64099842d760a6707023b63b428934a14ab4f07e146db6e39818008a77d2b827
4
- data.tar.gz: c8c664a4cc5c837cb99102b14bbc706acbe04f7d7adf1b3ceea5e570255f69f8
3
+ metadata.gz: c1bda879ee8b1b3320c8d5490201645cf2f686f8e82cb8200fb1b0a2f8538588
4
+ data.tar.gz: 072b2cfb7ed429f2a8f78b969ce808a4a0365ab37575c86deceb02c2bbe85701
5
5
  SHA512:
6
- metadata.gz: ba020b0a40bc31977567375f0812fa7a33953de174cc5276c23b328bebb567ebd025869daf1d4fb2b148a5b8bd8e7e109dd1e6da6b3536965f3d61ddfc850493
7
- data.tar.gz: b5e5cf66109a7b3df7f7b9f8976560f43f8a45d17c2e60b6ba3024399b12088c8d44fb7833537242610a90267d95b9e61ffab62622ab3f4b4d0061f1d31b059e
6
+ metadata.gz: 2565edfd604e66bbcfeda950c83e5da58ac5f4fbda2173e1705dd56ff98ad8c04b2f757edcaa8c4a45e37e7ab184361db8b3ff2645c95f3b3fd1c100ab7f2279
7
+ data.tar.gz: 3d56e12752052a25dc64fed40684ae88125d6f330930efbd3a553b1874127a6d721e249306c1b8d2090f102b7cd836d565ca182dba2fd94412687232492dd846
data/exe/git-multi CHANGED
@@ -21,7 +21,7 @@ when /\A--/
21
21
  when '--version' then Git::Multi::Commands.version
22
22
  when '--help' then Git::Multi::Commands.help
23
23
  when '--html' then Git::Multi::Commands.html
24
- when '--report' then Git::Multi::Commands.report
24
+ when '--report' then Git::Multi::Commands.report(multi_repo)
25
25
  when '--count' then Git::Multi::Commands.count
26
26
  when '--refresh' then Git::Multi::Commands.refresh
27
27
  when '--json' then Git::Multi::Commands.json(multi_repo)
@@ -16,11 +16,17 @@ module Git
16
16
  Kernel.exec "open #{Git::Multi::HTML_PAGE}"
17
17
  end
18
18
 
19
- def report
20
- Settings.home_status(Git::Multi::HOME)
21
- Settings.main_workarea_status(Git::Multi::WORKAREA)
22
- Settings.user_workarea_status(Git::Multi::USERS)
23
- Settings.organization_workarea_status(Git::Multi::ORGANIZATIONS)
19
+ def report(multi_repo = nil)
20
+ case multi_repo
21
+ when nil
22
+ Report.home_status(Git::Multi::HOME)
23
+ Report.workarea_status(Git::Multi::WORKAREA)
24
+ Report.for(*MULTI_REPOS)
25
+ when *MULTI_REPOS
26
+ Report.for(multi_repo)
27
+ else
28
+ raise "Unknown multi repo: #{multi_repo}"
29
+ end
24
30
  end
25
31
 
26
32
  def count
@@ -71,14 +77,14 @@ module Git
71
77
  end
72
78
 
73
79
  def clone(multi_repo = nil)
74
- Git::Multi.missing_repositories_for(multi_repo).each do |repo|
75
- FileUtils.mkdir_p repo.parent_dir
76
- repo.just_do_it(
77
- ->(project) {
78
- Kernel.system "git clone -q #{project.rels[:ssh].href.shellescape}"
80
+ Git::Multi.missing_repositories_for(multi_repo).each do |repository|
81
+ FileUtils.mkdir_p repository.parent_dir # create multi-repo workarea
82
+ repository.just_do_it(
83
+ ->(repo) {
84
+ Kernel.system "git clone -q #{repo.rels[:ssh].href.shellescape}"
79
85
  },
80
- ->(project) {
81
- Kernel.system "git clone -q #{project.rels[:ssh].href.shellescape}"
86
+ ->(repo) {
87
+ Kernel.system "git clone -q #{repo.rels[:ssh].href.shellescape}"
82
88
  },
83
89
  in: 'parent_dir'
84
90
  )
@@ -98,33 +104,33 @@ module Git
98
104
  end
99
105
 
100
106
  def query(args = [], multi_repo = nil)
101
- Git::Multi.repositories_for(multi_repo).each do |repo|
102
- repo.just_do_it(
103
- ->(project) {
107
+ Git::Multi.repositories_for(multi_repo).each do |repository|
108
+ repository.just_do_it(
109
+ ->(repo) {
104
110
  args.each do |attribute|
105
- puts "#{attribute}: #{project[attribute]}"
111
+ puts "#{attribute}: #{repo[attribute]}"
106
112
  end
107
113
  },
108
- ->(project) {
109
- print "#{project.full_name}: "
110
- puts args.map { |attribute| project[attribute] }.join(' ')
114
+ ->(repo) {
115
+ print "#{repo.full_name}: "
116
+ puts args.map { |attribute| repo[attribute] }.join(' ')
111
117
  },
112
118
  )
113
119
  end
114
120
  end
115
121
 
116
122
  def find(commands, multi_repo = nil)
117
- Git::Multi.cloned_repositories_for(multi_repo).each do |repo|
118
- Dir.chdir(repo.local_path) do
123
+ Git::Multi.cloned_repositories_for(multi_repo).each do |repository|
124
+ Dir.chdir(repository.local_path) do
119
125
  if repo.instance_eval(commands.join(' && '))
120
126
  repo.just_do_it(
121
- ->(_project) { nil },
122
- ->(project) { puts project.full_name },
127
+ ->(_repo) { nil },
128
+ ->(repo) { puts repo.full_name },
123
129
  )
124
130
  end
125
131
  rescue Octokit::NotFound
126
- # project no longer exists on github.com
127
- # consider running "git multi --stale"...
132
+ # repository no longer exists on GitHub
133
+ # consider running "git multi --stale"!
128
134
  end
129
135
  end
130
136
  end
@@ -134,8 +140,8 @@ module Git
134
140
  Dir.chdir(repo.local_path) do
135
141
  repo.instance_eval(commands.join(' ; '))
136
142
  rescue Octokit::NotFound
137
- # project no longer exists on github.com
138
- # consider running "git multi --stale"...
143
+ # repository no longer exists on GitHub
144
+ # consider running "git multi --stale"!
139
145
  end
140
146
  end
141
147
  end
@@ -152,13 +158,13 @@ module Git
152
158
 
153
159
  def system(args = [], multi_repo = nil)
154
160
  cmd = args.map!(&:shellescape).join(' ')
155
- Git::Multi.cloned_repositories_for(multi_repo).each do |repo|
156
- repo.just_do_it(
157
- ->(_project) {
161
+ Git::Multi.cloned_repositories_for(multi_repo).each do |repository|
162
+ repository.just_do_it(
163
+ ->(_repo) {
158
164
  Kernel.system cmd
159
165
  },
160
- ->(project) {
161
- Kernel.system "#{cmd} 2>&1 | sed -e 's#^##{project.full_name.shellescape}: #'"
166
+ ->(repo) {
167
+ Kernel.system "#{cmd} 2>&1 | sed -e 's#^##{repo.full_name.shellescape}: #'"
162
168
  },
163
169
  in: 'local_path'
164
170
  )
@@ -0,0 +1,31 @@
1
+ module Git
2
+ module Multi
3
+
4
+ module_function
5
+
6
+ def local_option(path, name, default = nil)
7
+ value = `git -C #{path} config --local --get #{name}`.chomp.freeze
8
+ value.empty? && default ? default : value
9
+ end
10
+
11
+ def local_list(filename, name)
12
+ list = `git config --file #{filename} --get-all #{name}`
13
+ list.split($RS).map(&:strip).map(&:freeze)
14
+ end
15
+
16
+ def global_option(name, default = nil)
17
+ value = `git config --global --get #{name}`.chomp.freeze
18
+ value.empty? && default ? default : value
19
+ end
20
+
21
+ def global_list(name, default = nil)
22
+ global_option(name, default).split(',').map(&:strip).map(&:freeze)
23
+ end
24
+
25
+ def env_var(name, default = nil)
26
+ value = ENV[name].dup.freeze
27
+ (value.nil? || value.empty?) && default ? default : value
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,132 @@
1
+ module Git
2
+ module Multi
3
+ module Report
4
+
5
+ TICK = ['2714'.hex].pack('U*').green.freeze
6
+ CROSS = ['2718'.hex].pack('U*').red.freeze
7
+ ARROW = ['2794'.hex].pack('U*').blue.freeze
8
+
9
+ module_function
10
+
11
+ def home_status(home)
12
+ directory_status(['${HOME}', home], home)
13
+ end
14
+
15
+ def workarea_status(workarea)
16
+ directory_status(['${WORKAREA}', abbreviate(workarea, :home)], workarea)
17
+ end
18
+
19
+ def owner_status(message, workarea, owner)
20
+ directory_status(
21
+ [
22
+ message,
23
+ File.join(abbreviate(workarea, :workarea), owner),
24
+ ],
25
+ File.join(workarea, owner)
26
+ )
27
+
28
+ github_count = Git::Multi.repositories_for(owner).count
29
+ cloned_count = Git::Multi.cloned_repositories_for(owner).count
30
+ missing_count = (github_count - cloned_count)
31
+ subdir_count = Dir.new(workarea).git_repos(owner).count
32
+ surplus_count = (subdir_count - cloned_count)
33
+
34
+ setting_status(["\tGitHub ", "#{github_count} repositories"])
35
+ setting_status(["\tcloned ", cloned_count, "(#{missing_count} missing)"])
36
+ Git::Multi.missing_repositories_for(owner).each do |missing|
37
+ setting_status(["\tmissing", missing.full_name], false, false)
38
+ end
39
+ setting_status(["\tsubdirs", subdir_count, "(#{surplus_count} surplus)"])
40
+ end
41
+
42
+ def project_status(message, superproject)
43
+ github_count = Git::Multi.repositories_for(superproject).count
44
+
45
+ if github_count.zero?
46
+ setting_status([message, 'listed but not configured'], false, false)
47
+ else
48
+ setting_status([message], true)
49
+ Git::Multi.repositories_for(superproject).each do |repo|
50
+ if File.directory? repo.local_path
51
+ setting_status(["\tcloned ", repo.full_name], true)
52
+ else
53
+ setting_status(["\tmissing", repo.full_name], false, false)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ def for(*multi_repos)
60
+ multi_repos.each do |multi_repo|
61
+ case (user = org = project = multi_repo)
62
+ when *USERS
63
+ owner_status("user \"#{user}\"", Git::Multi::WORKAREA, user)
64
+ when *ORGANIZATIONS
65
+ owner_status("org \"#{org}\"", Git::Multi::WORKAREA, org)
66
+ when *SUPERPROJECTS
67
+ project_status("superproject \"#{project}\"", project)
68
+ else
69
+ raise "Unknown multi repo: #{multi_repo}"
70
+ end
71
+ end
72
+ end
73
+
74
+ private_class_method def describe(token)
75
+ if token.nil?
76
+ '(nil)'
77
+ elsif token.empty?
78
+ '(empty)'
79
+ else
80
+ "#{'*' * 36}#{token[36..-1]}"
81
+ end
82
+ end
83
+
84
+ private_class_method def symbolize(token)
85
+ case token
86
+ when Git::Multi.env_var('OCTOKIT_ACCESS_TOKEN')
87
+ then '${OCTOKIT_ACCESS_TOKEN}'
88
+ when Git::Multi.global_option('github.token')
89
+ then 'github.token'
90
+ else '(unset)'
91
+ end
92
+ end
93
+
94
+ private_class_method def abbreviate(directory, root_dir = nil)
95
+ case root_dir
96
+ when :home
97
+ then directory.gsub(Git::Multi::HOME, '${HOME}')
98
+ when :workarea
99
+ then directory.gsub(Git::Multi::WORKAREA, '${WORKAREA}')
100
+ else abbreviate(abbreviate(directory, :workarea), :home)
101
+ end
102
+ end
103
+
104
+ private_class_method def setting_status(messages, valid = false, optional = true)
105
+ fields = messages.compact.join(' - ')
106
+ icon = valid ? TICK : optional ? ARROW : CROSS
107
+ puts "#{icon} #{fields}"
108
+ end
109
+
110
+ private_class_method def file_status(file, message = 'File')
111
+ setting_status(
112
+ [
113
+ message,
114
+ abbreviate(file),
115
+ File.file?(file) ? "#{File.size(file).commify} bytes" : nil,
116
+ ],
117
+ file && !file.empty? && File.file?(file),
118
+ false
119
+ )
120
+ end
121
+
122
+ private_class_method def directory_status(messages, directory)
123
+ setting_status(
124
+ messages,
125
+ directory && !directory.empty? && File.directory?(directory),
126
+ false
127
+ )
128
+ end
129
+
130
+ end
131
+ end
132
+ end
@@ -6,7 +6,7 @@ require 'addressable'
6
6
  module Git
7
7
  module Multi
8
8
  NAME = 'git-multi'.freeze
9
- VERSION = '2.0.0'.freeze
9
+ VERSION = '2.1.0'.freeze
10
10
 
11
11
  DEPENDENCY_VERSIONS = [
12
12
  "octokit.rb v#{Octokit::VERSION}",
data/lib/git/multi.rb CHANGED
@@ -15,9 +15,9 @@ require 'ext/sawyer/resource'
15
15
 
16
16
  require 'git/hub'
17
17
 
18
- require 'git/multi/utils'
18
+ require 'git/multi/config'
19
+ require 'git/multi/report'
19
20
  require 'git/multi/version'
20
- require 'git/multi/settings'
21
21
  require 'git/multi/commands'
22
22
 
23
23
  module Git
@@ -26,16 +26,23 @@ module Git
26
26
  HOME = Dir.home
27
27
 
28
28
  DEFAULT_WORKAREA = File.join(HOME, 'Workarea')
29
- WORKAREA = git_option('git.multi.workarea', DEFAULT_WORKAREA)
29
+ WORKAREA = global_option('git.multi.workarea', DEFAULT_WORKAREA)
30
30
 
31
31
  DEFAULT_TOKEN = env_var('OCTOKIT_ACCESS_TOKEN') # same as Octokit
32
- TOKEN = git_option('github.token', DEFAULT_TOKEN)
32
+ TOKEN = global_option('github.token', DEFAULT_TOKEN)
33
33
 
34
- CACHE = File.join(HOME, '.git', 'multi')
35
- REPOSITORIES = File.join(CACHE, 'repositories.byte')
34
+ GIT_MULTI_DIR = File.join(HOME, '.git', 'multi')
36
35
 
37
- USERS = git_list('git.multi.users')
38
- ORGANIZATIONS = git_list('git.multi.organizations')
36
+ FileUtils.mkdir_p(GIT_MULTI_DIR) # ensure `~/.git/multi` directory exists
37
+
38
+ GITHUB_CACHE = File.join(GIT_MULTI_DIR, 'repositories.byte')
39
+ SUPERPROJECTS_CONFIG = File.join(GIT_MULTI_DIR, 'superprojects.config')
40
+
41
+ USERS = global_list('git.multi.users')
42
+ ORGANIZATIONS = global_list('git.multi.organizations')
43
+ SUPERPROJECTS = global_list('git.multi.superprojects')
44
+
45
+ MULTI_REPOS = (USERS + ORGANIZATIONS + SUPERPROJECTS)
39
46
 
40
47
  MAN_PAGE = File.expand_path('../../man/git-multi.1', __dir__)
41
48
  HTML_PAGE = File.expand_path('../../man/git-multi.html', __dir__)
@@ -47,7 +54,11 @@ module Git
47
54
  #
48
55
 
49
56
  def valid?(multi_repo)
50
- (USERS + ORGANIZATIONS).include? multi_repo
57
+ MULTI_REPOS.include? multi_repo
58
+ end
59
+
60
+ def full_names_for(superproject)
61
+ local_list(SUPERPROJECTS_CONFIG, "superproject.#{superproject}.repo")
51
62
  end
52
63
 
53
64
  #
@@ -69,16 +80,16 @@ module Git
69
80
  ).flatten
70
81
  end
71
82
 
72
- def local_repositories_for(multi_repo = nil)
73
- case (owner = multi_repo)
83
+ def local_repositories_for(owner = nil)
84
+ case owner
74
85
  when nil
75
- local_repositories
86
+ local_repositories # all of them
76
87
  when *USERS
77
88
  @local_user_repositories[owner]
78
89
  when *ORGANIZATIONS
79
90
  @local_org_repositories[owner]
80
91
  else
81
- raise "Unknown multi repo: #{multi_repo}"
92
+ raise "Unknown owner: #{owner}"
82
93
  end
83
94
  end
84
95
 
@@ -101,16 +112,16 @@ module Git
101
112
  ).flatten
102
113
  end
103
114
 
104
- def github_repositories_for(multi_repo = nil)
105
- case (owner = multi_repo)
115
+ def github_repositories_for(owner = nil)
116
+ case owner
106
117
  when nil
107
- github_repositories
118
+ github_repositories # all of them
108
119
  when *USERS
109
120
  @github_user_repositories[owner]
110
121
  when *ORGANIZATIONS
111
122
  @github_org_repositories[owner]
112
123
  else
113
- raise "Unknown multi repo: #{multi_repo}"
124
+ raise "Unknown owner: #{owner}"
114
125
  end
115
126
  end
116
127
 
@@ -119,9 +130,7 @@ module Git
119
130
  #
120
131
 
121
132
  def refresh_repositories
122
- File.directory?(CACHE) || FileUtils.mkdir_p(CACHE)
123
-
124
- File.open(REPOSITORIES, 'wb') do |file|
133
+ File.open(GITHUB_CACHE, 'wb') do |file|
125
134
  Marshal.dump(github_repositories, file)
126
135
  end
127
136
  end
@@ -151,22 +160,22 @@ module Git
151
160
  end
152
161
 
153
162
  def repositories
154
- if File.size?(REPOSITORIES)
163
+ if File.size?(GITHUB_CACHE)
155
164
  # rubocop:disable Security/MarshalLoad
156
- @repositories ||= Marshal.load(File.read(REPOSITORIES)).tap do |projects|
157
- projects.each_with_index do |project, index|
158
- # ensure 'project' has handle on an Octokit client
159
- project.client = Git::Hub.send(:client)
160
- # adorn 'project', which is a Sawyer::Resource
161
- project.parent_dir = Pathname.new(File.join(WORKAREA, project.owner.login))
162
- project.local_path = Pathname.new(File.join(WORKAREA, project.full_name))
163
- project.fractional_index = "#{index + 1}/#{projects.count}"
164
- # fix 'project' => https://github.com/octokit/octokit.rb/issues/727
165
- project.compliant_ssh_url = 'ssh://' + project.ssh_url.split(':', 2).join('/')
165
+ @repositories ||= Marshal.load(File.read(GITHUB_CACHE)).tap do |repos|
166
+ repos.each_with_index do |repo, index|
167
+ # ensure 'repo' has handle on an Octokit client
168
+ repo.client = Git::Hub.send(:client)
169
+ # adorn 'repo', which is a Sawyer::Resource
170
+ repo.parent_dir = Pathname.new(File.join(WORKAREA, repo.owner.login))
171
+ repo.local_path = Pathname.new(File.join(WORKAREA, repo.full_name))
172
+ repo.fractional_index = "#{index + 1}/#{repos.count}"
173
+ # fix 'repo' => https://github.com/octokit/octokit.rb/issues/727
174
+ repo.compliant_ssh_url = 'ssh://' + repo.ssh_url.split(':', 2).join('/')
166
175
  # remove optional '.git' suffix from 'git@github.com:pvdb/git-multi.git'
167
- project.abbreviated_ssh_url = project.ssh_url.chomp('.git')
168
- # extend 'project' with 'just do it' capabilities
169
- project.extend Nike
176
+ repo.abbreviated_ssh_url = repo.ssh_url.chomp('.git')
177
+ # extend 'repo' with 'just do it' capabilities
178
+ repo.extend Nike
170
179
  end
171
180
  end
172
181
  # rubocop:enable Security/MarshalLoad
@@ -181,12 +190,20 @@ module Git
181
190
  #
182
191
 
183
192
  def repositories_for(multi_repo = nil)
184
- if multi_repo.nil?
185
- repositories
186
- else
193
+ case (owner = superproject = multi_repo)
194
+ when nil
195
+ repositories # all of them
196
+ when *USERS, *ORGANIZATIONS
197
+ repositories.find_all { |repository|
198
+ repository.owner.login == owner
199
+ }
200
+ when *SUPERPROJECTS
201
+ full_names = full_names_for(superproject)
187
202
  repositories.find_all { |repository|
188
- repository.owner.login == multi_repo
203
+ full_names.include?(repository.full_name)
189
204
  }
205
+ else
206
+ raise "Unknown multi repo: #{multi_repo}"
190
207
  end
191
208
  end
192
209
 
@@ -212,40 +229,41 @@ module Git
212
229
 
213
230
  def excess_repositories_for(multi_repo = nil)
214
231
  repository_full_names = repositories_for(multi_repo).map(&:full_name)
215
- local_repositories_for(multi_repo).reject { |project|
216
- repository_full_names.include? project.full_name
232
+ local_repositories_for(multi_repo).reject { |repo|
233
+ repository_full_names.include? repo.full_name
217
234
  }
218
235
  end
219
236
 
220
237
  def stale_repositories_for(multi_repo = nil)
221
238
  repository_full_names = github_repositories_for(multi_repo).map(&:full_name)
222
- repositories_for(multi_repo).reject { |project|
223
- repository_full_names.include? project.full_name
239
+ repositories_for(multi_repo).reject { |repo|
240
+ repository_full_names.include? repo.full_name
224
241
  }
225
242
  end
226
243
 
227
244
  def spurious_repositories_for(multi_repo = nil)
228
- cloned_repositories_for(multi_repo).find_all { |project|
229
- origin_url = `git -C #{project.local_path} config --get remote.origin.url`.chomp
245
+ cloned_repositories_for(multi_repo).find_all { |repo|
246
+ origin_url = local_option(repo.local_path, 'remote.origin.url')
247
+
230
248
  ![
231
- project.clone_url,
232
- project.ssh_url,
233
- project.compliant_ssh_url,
234
- project.abbreviated_ssh_url,
235
- project.git_url,
249
+ repo.clone_url,
250
+ repo.ssh_url,
251
+ repo.compliant_ssh_url,
252
+ repo.abbreviated_ssh_url,
253
+ repo.git_url,
236
254
  ].include? origin_url
237
255
  }
238
256
  end
239
257
 
240
258
  def missing_repositories_for(multi_repo = nil)
241
- repositories_for(multi_repo).find_all { |project|
242
- !File.directory? project.local_path
259
+ repositories_for(multi_repo).find_all { |repo|
260
+ !File.directory? repo.local_path
243
261
  }
244
262
  end
245
263
 
246
264
  def cloned_repositories_for(multi_repo = nil)
247
- repositories_for(multi_repo).find_all { |project|
248
- File.directory? project.local_path
265
+ repositories_for(multi_repo).find_all { |repo|
266
+ File.directory? repo.local_path
249
267
  }
250
268
  end
251
269
 
data/man/git-multi.1 CHANGED
@@ -2,12 +2,12 @@
2
2
  .\" Title: git-multi
3
3
  .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
4
4
  .\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
5
- .\" Date: 11/10/2018
5
+ .\" Date: 11/12/2018
6
6
  .\" Manual: Git Manual
7
7
  .\" Source: Git 2.19.1.542.gc4df23f792.dirty
8
8
  .\" Language: English
9
9
  .\"
10
- .TH "GIT\-MULTI" "1" "11/10/2018" "Git 2\&.19\&.1\&.542\&.gc4df23" "Git Manual"
10
+ .TH "GIT\-MULTI" "1" "11/12/2018" "Git 2\&.19\&.1\&.542\&.gc4df23" "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 \fBv2\&.0\&.0\fR of \fIgit multi\fR \&... hooray!
34
+ This is \fBv2\&.1\&.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:
@@ -539,6 +539,11 @@ root directory where repos will been cloned
539
539
  .RS 4
540
540
  local, binary cache of GitHub repository metadata
541
541
  .RE
542
+ .PP
543
+ \fB${HOME}/\&.git/multi/superprojects\&.config\fR
544
+ .RS 4
545
+ definitions for so\-called "superproject" multi repos
546
+ .RE
542
547
  .SH "REFERENCES"
543
548
  .sp
544
549
  .RS 4
data/man/git-multi.erb CHANGED
@@ -248,6 +248,9 @@ FILES
248
248
  `${HOME}/.git/multi/repositories.byte`::
249
249
  local, binary cache of GitHub repository metadata
250
250
 
251
+ `${HOME}/.git/multi/superprojects.config`::
252
+ definitions for so-called "superproject" multi repos
253
+
251
254
  REFERENCES
252
255
  ----------
253
256
 
data/man/git-multi.html CHANGED
@@ -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>v2.0.0</code> of <em>git multi</em> &#8230; hooray!</p></div>
751
+ <div class="paragraph"><p>This is <code>v2.1.0</code> of <em>git multi</em> &#8230; hooray!</p></div>
752
752
  </div>
753
753
  </div>
754
754
  <div class="sect1">
@@ -1168,6 +1168,14 @@ git multi --json | jq -r '.[] | select(.fork == true) | .full_name'</code></pre>
1168
1168
  local, binary cache of GitHub repository metadata
1169
1169
  </p>
1170
1170
  </dd>
1171
+ <dt class="hdlist1">
1172
+ <code>${HOME}/.git/multi/superprojects.config</code>
1173
+ </dt>
1174
+ <dd>
1175
+ <p>
1176
+ definitions for so-called "superproject" multi repos
1177
+ </p>
1178
+ </dd>
1171
1179
  </dl></div>
1172
1180
  </div>
1173
1181
  </div>
@@ -1201,7 +1209,7 @@ the <code>jq</code> command-line utility:
1201
1209
  <div id="footer">
1202
1210
  <div id="footer-text">
1203
1211
  Last updated
1204
- 2018-11-10 08:44:16 GMT
1212
+ 2018-11-12 14:05:11 GMT
1205
1213
  </div>
1206
1214
  </div>
1207
1215
  </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: 2.0.0
4
+ version: 2.1.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: 2018-11-10 00:00:00.000000000 Z
11
+ date: 2018-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: octokit
@@ -97,9 +97,9 @@ files:
97
97
  - lib/git/hub.rb
98
98
  - lib/git/multi.rb
99
99
  - lib/git/multi/commands.rb
100
+ - lib/git/multi/config.rb
100
101
  - lib/git/multi/gemspec.rb
101
- - lib/git/multi/settings.rb
102
- - lib/git/multi/utils.rb
102
+ - lib/git/multi/report.rb
103
103
  - lib/git/multi/version.rb
104
104
  - man/git-multi.1
105
105
  - man/git-multi.erb
@@ -1,99 +0,0 @@
1
- module Git
2
- module Multi
3
- module Settings
4
-
5
- TICK = ['2714'.hex].pack('U*').green.freeze
6
- CROSS = ['2718'.hex].pack('U*').red.freeze
7
- ARROW = ['2794'.hex].pack('U*').blue.freeze
8
-
9
- module_function
10
-
11
- def setting_status(messages, valid = false, optional = true)
12
- fields = messages.compact.join(' - ')
13
- icon = valid ? TICK : optional ? ARROW : CROSS
14
- puts "#{icon} #{fields}"
15
- end
16
-
17
- def file_status(file, message = 'File')
18
- setting_status(
19
- [
20
- message,
21
- abbreviate(file),
22
- File.file?(file) ? "#{File.size(file).commify} bytes" : nil,
23
- ],
24
- file && !file.empty? && File.file?(file),
25
- false
26
- )
27
- end
28
-
29
- def directory_status(messages, directory)
30
- setting_status(
31
- messages,
32
- directory && !directory.empty? && File.directory?(directory),
33
- false
34
- )
35
- end
36
-
37
- def workarea_status(message, workarea, owner)
38
- directory_status(
39
- [
40
- message,
41
- File.join(abbreviate(workarea, :workarea), owner),
42
- ],
43
- File.join(workarea, owner)
44
- )
45
-
46
- github_count = Git::Multi.repositories_for(owner).count
47
- cloned_count = Git::Multi.cloned_repositories_for(owner).count
48
- missing_count = (github_count - cloned_count)
49
- subdir_count = Dir.new(workarea).git_repos(owner).count
50
- surplus_count = (subdir_count - cloned_count)
51
-
52
- setting_status(["\tGitHub ", github_count])
53
- setting_status(["\tcloned ", cloned_count, "(#{missing_count} missing)"])
54
- Git::Multi.missing_repositories_for(owner).each do |missing|
55
- setting_status(["\tmissing", missing.full_name], false, false)
56
- end
57
- setting_status(["\tsubdirs", subdir_count, "(#{surplus_count} surplus)"])
58
- end
59
-
60
- def user_status(user)
61
- setting_status(['User', user], user && !user.empty?)
62
- end
63
-
64
- def organization_status(orgs)
65
- orgs.each do |org|
66
- setting_status(['Organization', org], org && !org.empty?, true)
67
- setting_status(['Organization', 'member?'], Git::Hub.orgs.include?(org), !Git::Hub.connected?)
68
- end
69
- end
70
-
71
- def token_status(token)
72
- setting_status(['Token', symbolize(token), describe(token)], !token.nil? && !token.empty?)
73
- setting_status(['Token', 'valid?'], !token.nil? && !token.empty? && Git::Hub.login, !Git::Hub.connected?)
74
- setting_status(['Token', "owned by #{Git::Multi::USER}?"], Git::Hub.login == Git::Multi::USER, !Git::Hub.connected?)
75
- end
76
-
77
- def home_status(home)
78
- directory_status(['${HOME}', home], home)
79
- end
80
-
81
- def main_workarea_status(workarea)
82
- directory_status(['${WORKAREA}', abbreviate(workarea, :home)], workarea)
83
- end
84
-
85
- def user_workarea_status(users)
86
- users.each do |user|
87
- workarea_status("Workarea (user: #{user})", Git::Multi::WORKAREA, user)
88
- end
89
- end
90
-
91
- def organization_workarea_status(orgs)
92
- orgs.each do |org|
93
- workarea_status("Workarea (org: #{org})", Git::Multi::WORKAREA, org)
94
- end
95
- end
96
-
97
- end
98
- end
99
- end
@@ -1,57 +0,0 @@
1
- module Git
2
- module Multi
3
-
4
- module Settings
5
-
6
- module_function
7
-
8
- def describe(token)
9
- if token.nil?
10
- '(nil)'
11
- elsif token.empty?
12
- '(empty)'
13
- else
14
- "#{'*' * 36}#{token[36..-1]}"
15
- end
16
- end
17
-
18
- def symbolize(token)
19
- case token
20
- when Git::Multi.env_var('OCTOKIT_ACCESS_TOKEN')
21
- then '${OCTOKIT_ACCESS_TOKEN}'
22
- when Git::Multi.git_option('github.token')
23
- then 'github.token'
24
- else '(unset)'
25
- end
26
- end
27
-
28
- def abbreviate(directory, root_dir = nil)
29
- case root_dir
30
- when :home
31
- then directory.gsub(Git::Multi::HOME, '${HOME}')
32
- when :workarea
33
- then directory.gsub(Git::Multi::WORKAREA, '${WORKAREA}')
34
- else abbreviate(abbreviate(directory, :workarea), :home)
35
- end
36
- end
37
-
38
- end
39
-
40
- module_function
41
-
42
- def git_option(name, default = nil)
43
- value = `git config #{name}`.chomp.freeze
44
- value.empty? && default ? default : value
45
- end
46
-
47
- def git_list(name, default = nil)
48
- git_option(name, default).split(',').map(&:strip)
49
- end
50
-
51
- def env_var(name, default = nil)
52
- value = ENV[name].freeze
53
- (value.nil? || value.empty?) && default ? default : value
54
- end
55
-
56
- end
57
- end