nucleon 0.1.9 → 0.1.10
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.
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -14
- data/VERSION +1 -1
- data/lib/core/facade.rb +1 -1
- data/lib/core/manager.rb +0 -1
- data/lib/core/mixin/action/project.rb +8 -7
- data/lib/core/plugin/action.rb +1 -1
- data/lib/core/plugin/project.rb +41 -16
- data/lib/core/util/git.rb +33 -28
- data/lib/nucleon/action/add.rb +23 -5
- data/lib/nucleon/action/create.rb +5 -11
- data/lib/nucleon/action/extract.rb +1 -1
- data/lib/nucleon/action/remove.rb +4 -3
- data/lib/nucleon/action/save.rb +3 -2
- data/lib/nucleon/action/update.rb +4 -3
- data/lib/nucleon/command/bash.rb +10 -1
- data/lib/nucleon/project/git.rb +176 -142
- data/lib/nucleon_base.rb +4 -1
- data/locales/en.yml +15 -14
- data/nucleon.gemspec +5 -5
- metadata +34 -34
data/lib/nucleon/action/save.rb
CHANGED
@@ -16,6 +16,7 @@ class Save < Nucleon.plugin_class(:action)
|
|
16
16
|
:commit_failure,
|
17
17
|
:push_failure
|
18
18
|
|
19
|
+
register :path, :str, Dir.pwd
|
19
20
|
register :files, :array, '.'
|
20
21
|
|
21
22
|
project_config
|
@@ -34,10 +35,10 @@ class Save < Nucleon.plugin_class(:action)
|
|
34
35
|
# Operations
|
35
36
|
|
36
37
|
def execute
|
37
|
-
super do
|
38
|
+
super do
|
38
39
|
info('nucleon.actions.save.start')
|
39
40
|
|
40
|
-
if project = project_load(
|
41
|
+
if project = project_load(settings[:path], false, false)
|
41
42
|
if commit(project, settings[:files])
|
42
43
|
myself.status = code.push_failure unless push(project)
|
43
44
|
else
|
@@ -12,7 +12,8 @@ class Update < Nucleon.plugin_class(:action)
|
|
12
12
|
super do
|
13
13
|
codes :project_failure
|
14
14
|
|
15
|
-
|
15
|
+
register :path, :str, Dir.pwd
|
16
|
+
project_config
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -20,10 +21,10 @@ class Update < Nucleon.plugin_class(:action)
|
|
20
21
|
# Operations
|
21
22
|
|
22
23
|
def execute
|
23
|
-
super do
|
24
|
+
super do
|
24
25
|
info('nucleon.actions.update.start')
|
25
26
|
|
26
|
-
project = project_load(
|
27
|
+
project = project_load(settings[:path], false, true)
|
27
28
|
myself.status = code.project_failure unless project
|
28
29
|
end
|
29
30
|
end
|
data/lib/nucleon/command/bash.rb
CHANGED
@@ -129,7 +129,16 @@ class Bash < Plugin::Command
|
|
129
129
|
|
130
130
|
def exec(options = {}, overrides = nil, &code)
|
131
131
|
config = Config.ensure(options)
|
132
|
-
Nucleon.cli_run(build(export, overrides), config.import({ :ui => @ui }), &code)
|
132
|
+
result = Nucleon.cli_run(build(export, overrides), config.import({ :ui => @ui }), &code)
|
133
|
+
|
134
|
+
if result
|
135
|
+
logger.debug("Command status: #{result.status}")
|
136
|
+
logger.debug("Command output:\n#{result.output}")
|
137
|
+
logger.debug("Command errors:\n#{result.errors}")
|
138
|
+
else
|
139
|
+
logger.debug("Command returned no result")
|
140
|
+
end
|
141
|
+
result
|
133
142
|
end
|
134
143
|
|
135
144
|
#-----------------------------------------------------------------------------
|
data/lib/nucleon/project/git.rb
CHANGED
@@ -7,28 +7,28 @@ class Git < Plugin::Project
|
|
7
7
|
# Project plugin interface
|
8
8
|
|
9
9
|
def normalize(reload)
|
10
|
-
|
10
|
+
unless reload
|
11
|
+
@cli = Util::Liquid.new do |method, args, &code|
|
12
|
+
options = {}
|
13
|
+
options = args.shift if args.length > 0
|
14
|
+
git_exec(method, options, args, &code)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
super
|
11
18
|
end
|
12
19
|
|
13
20
|
#-----------------------------------------------------------------------------
|
14
21
|
# Git interface (local)
|
15
22
|
|
16
23
|
def ensure_git(reset = false)
|
17
|
-
if reset || @
|
18
|
-
@git_lib = nil
|
19
|
-
|
24
|
+
if reset || @repo.nil?
|
20
25
|
if directory.empty?
|
21
26
|
logger.warn("Can not manage Git project at #{directory} as it does not exist")
|
22
27
|
else
|
23
28
|
logger.debug("Ensuring Git instance to manage #{directory}")
|
24
|
-
@
|
25
|
-
|
26
|
-
|
27
|
-
unless File.directory?(directory) && @git_lib.git.exist?
|
28
|
-
FileUtils.mkdir_p(directory) unless File.directory?(directory)
|
29
|
-
@git_lib.git.init({ :bare => false })
|
30
|
-
end
|
31
|
-
end
|
29
|
+
@repo = Util::Git.load(directory, {
|
30
|
+
:create => get(:create, false)
|
31
|
+
})
|
32
32
|
end
|
33
33
|
end
|
34
34
|
return myself
|
@@ -40,7 +40,7 @@ class Git < Plugin::Project
|
|
40
40
|
|
41
41
|
def can_persist?
|
42
42
|
ensure_git
|
43
|
-
return true unless @
|
43
|
+
return true unless @repo.nil?
|
44
44
|
return false
|
45
45
|
end
|
46
46
|
|
@@ -98,7 +98,11 @@ class Git < Plugin::Project
|
|
98
98
|
|
99
99
|
def new?(reset = false)
|
100
100
|
if get(:new, nil).nil? || reset
|
101
|
-
|
101
|
+
result = cli.rev_parse({ :all => true })
|
102
|
+
|
103
|
+
if result && result.status == code.success
|
104
|
+
set(:new, result.output.empty?)
|
105
|
+
end
|
102
106
|
end
|
103
107
|
get(:new, false)
|
104
108
|
end
|
@@ -106,17 +110,17 @@ class Git < Plugin::Project
|
|
106
110
|
#-----------------------------------------------------------------------------
|
107
111
|
# Property accessors / modifiers
|
108
112
|
|
109
|
-
def
|
110
|
-
return @
|
113
|
+
def repo
|
114
|
+
return @repo if can_persist?
|
115
|
+
return nil
|
111
116
|
end
|
112
|
-
|
117
|
+
protected :repo
|
118
|
+
|
113
119
|
#---
|
114
120
|
|
115
|
-
def
|
116
|
-
|
117
|
-
return nil
|
121
|
+
def cli
|
122
|
+
@cli
|
118
123
|
end
|
119
|
-
protected :git
|
120
124
|
|
121
125
|
#---
|
122
126
|
|
@@ -131,7 +135,9 @@ class Git < Plugin::Project
|
|
131
135
|
|
132
136
|
def config(name, options = {})
|
133
137
|
return super do |config|
|
134
|
-
|
138
|
+
result = cli.config(config.export, name)
|
139
|
+
next Util::Data.value(result.output) if result.status == code.success
|
140
|
+
nil
|
135
141
|
end
|
136
142
|
end
|
137
143
|
|
@@ -139,7 +145,8 @@ class Git < Plugin::Project
|
|
139
145
|
|
140
146
|
def set_config(name, value, options = {})
|
141
147
|
return super do |config, processed_value|
|
142
|
-
|
148
|
+
result = cli.config(config.export, name, processed_value)
|
149
|
+
result.status == code.success
|
143
150
|
end
|
144
151
|
end
|
145
152
|
|
@@ -147,7 +154,8 @@ class Git < Plugin::Project
|
|
147
154
|
|
148
155
|
def delete_config(name, options = {})
|
149
156
|
return super do |config|
|
150
|
-
|
157
|
+
result = cli.config(config.import({ :remove_section => true }).export, name)
|
158
|
+
result.status == code.success
|
151
159
|
end
|
152
160
|
end
|
153
161
|
|
@@ -160,26 +168,26 @@ class Git < Plugin::Project
|
|
160
168
|
if new?
|
161
169
|
logger.debug("Project has no sub project configuration yet (has not been committed to)")
|
162
170
|
else
|
163
|
-
|
164
|
-
|
171
|
+
gitmodules_file = File.join(directory, '.gitmodules')
|
172
|
+
|
173
|
+
gitmodules_data = ''
|
174
|
+
gitmodules_data = Util::Disk.read(gitmodules_file) if File.exists?(gitmodules_file)
|
165
175
|
|
166
|
-
|
167
|
-
logger.debug("Houston, we have
|
176
|
+
unless gitmodules_data.empty?
|
177
|
+
logger.debug("Houston, we have some gitmodules!")
|
168
178
|
|
169
|
-
lines =
|
179
|
+
lines = gitmodules_data.gsub(/\r\n?/, "\n" ).split("\n")
|
170
180
|
current = nil
|
171
181
|
|
172
182
|
lines.each do |line|
|
173
183
|
if line =~ /^\[submodule "(.+)"\]$/
|
174
184
|
current = $1
|
175
185
|
result[current] = {}
|
176
|
-
result[current]['id'] = (commit.tree/current).id
|
177
186
|
|
178
187
|
logger.debug("Reading: #{current}")
|
179
188
|
|
180
|
-
elsif line =~ /^\
|
181
|
-
result[current][$1]
|
182
|
-
result[current]['id'] = (commit.tree/$2).id if $1 == 'path'
|
189
|
+
elsif line =~ /^\s*(\w+)\s*=\s*(.+)\s*$/
|
190
|
+
result[current][$1] = $2
|
183
191
|
end
|
184
192
|
end
|
185
193
|
end
|
@@ -195,11 +203,14 @@ class Git < Plugin::Project
|
|
195
203
|
return super do
|
196
204
|
if new?
|
197
205
|
logger.debug("Project has no current revision yet (has not been committed to)")
|
198
|
-
nil
|
199
|
-
|
206
|
+
nil
|
200
207
|
else
|
201
|
-
current_revision =
|
202
|
-
|
208
|
+
current_revision = nil
|
209
|
+
result = cli.rev_parse({ :abbrev_ref => true }, 'HEAD')
|
210
|
+
|
211
|
+
if result && result.status == code.success
|
212
|
+
current_revision = result.output
|
213
|
+
end
|
203
214
|
logger.debug("Current revision: #{current_revision}")
|
204
215
|
current_revision
|
205
216
|
end
|
@@ -213,13 +224,11 @@ class Git < Plugin::Project
|
|
213
224
|
if new?
|
214
225
|
logger.debug("Project can not be checked out (has not been committed to)")
|
215
226
|
else
|
216
|
-
unless
|
217
|
-
|
218
|
-
git.checkout({ :raise => true }, revision)
|
219
|
-
end
|
227
|
+
unless repo.bare?
|
228
|
+
result = cli.checkout({}, revision)
|
220
229
|
end
|
221
230
|
end
|
222
|
-
success
|
231
|
+
result && result.status == code.success
|
223
232
|
end
|
224
233
|
end
|
225
234
|
|
@@ -227,27 +236,29 @@ class Git < Plugin::Project
|
|
227
236
|
|
228
237
|
def commit(files = '.', options = {})
|
229
238
|
return super do |config, time, user, message|
|
230
|
-
|
231
|
-
git.reset({}, 'HEAD') # Clear the index so we get a clean commit
|
239
|
+
cli.reset({}, 'HEAD') unless new? # Clear the index so we get a clean commit
|
232
240
|
|
233
|
-
|
241
|
+
files = array(files)
|
234
242
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
243
|
+
logger.debug("Adding files to Git index")
|
244
|
+
|
245
|
+
cli.add({}, *files) # Get all added and updated files
|
246
|
+
cli.add({ :update => true }, *files) # Get all deleted files
|
239
247
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
commit_options[:author] = config[:author] if config.get(:author, false)
|
248
|
+
commit_options = {
|
249
|
+
:m => "<#{user}> #{message}",
|
250
|
+
:allow_empty => config.get(:allow_empty, false)
|
251
|
+
}
|
252
|
+
commit_options[:author] = config[:author] if config.get(:author, false)
|
246
253
|
|
247
|
-
|
248
|
-
|
254
|
+
logger.debug("Composing commit options: #{commit_options.inspect}")
|
255
|
+
result = cli.commit(commit_options)
|
249
256
|
|
257
|
+
if result.status == code.success
|
250
258
|
new?(true)
|
259
|
+
true
|
260
|
+
else
|
261
|
+
false
|
251
262
|
end
|
252
263
|
end
|
253
264
|
end
|
@@ -265,16 +276,19 @@ class Git < Plugin::Project
|
|
265
276
|
|
266
277
|
def add_subproject(path, url, revision, options = {})
|
267
278
|
return super do |config|
|
268
|
-
|
269
|
-
|
270
|
-
branch_options = [ '-b', config[:revision] ] if config.get(:revision, false)
|
279
|
+
branch_options = ''
|
280
|
+
branch_options = [ '-b', config[:revision] ] if config.get(:revision, false)
|
271
281
|
|
272
|
-
|
273
|
-
|
282
|
+
path = config[:path]
|
283
|
+
url = config[:url]
|
274
284
|
|
275
|
-
|
285
|
+
result = cli.submodule({}, 'add', *branch_options, url, path)
|
276
286
|
|
277
|
-
|
287
|
+
if result.status == code.success
|
288
|
+
config.set(:files, [ '.gitmodules', path ])
|
289
|
+
true
|
290
|
+
else
|
291
|
+
false
|
278
292
|
end
|
279
293
|
end
|
280
294
|
end
|
@@ -283,33 +297,30 @@ class Git < Plugin::Project
|
|
283
297
|
|
284
298
|
def delete_subproject(path)
|
285
299
|
return super do |config|
|
286
|
-
|
287
|
-
|
288
|
-
submodule_key = "submodule.#{path}"
|
300
|
+
path = config[:path]
|
301
|
+
submodule_key = "submodule.#{path}"
|
289
302
|
|
290
|
-
|
291
|
-
|
292
|
-
|
303
|
+
logger.debug("Deleting Git configurations for #{submodule_key}")
|
304
|
+
delete_config(submodule_key)
|
305
|
+
delete_config(submodule_key, { :file => '.gitmodules' })
|
293
306
|
|
294
|
-
|
295
|
-
|
307
|
+
logger.debug("Cleaning Git index cache for #{path}")
|
308
|
+
cli.rm({ :cached => true }, path)
|
296
309
|
|
297
|
-
|
298
|
-
|
299
|
-
|
310
|
+
logger.debug("Removing Git submodule directories")
|
311
|
+
FileUtils.rm_rf(File.join(directory, path))
|
312
|
+
FileUtils.rm_rf(File.join(repo.path, 'modules', path))
|
300
313
|
|
301
|
-
|
302
|
-
end
|
314
|
+
config.set(:files, [ '.gitmodules', path ])
|
303
315
|
end
|
304
316
|
end
|
305
317
|
|
306
318
|
#---
|
307
319
|
|
308
|
-
def update_subprojects
|
309
|
-
return super do
|
310
|
-
|
311
|
-
|
312
|
-
end
|
320
|
+
def update_subprojects(options = {})
|
321
|
+
return super do |config|
|
322
|
+
result = cli.submodule({}, 'update', '--init', '--recursive')
|
323
|
+
result.status == code.success
|
313
324
|
end
|
314
325
|
end
|
315
326
|
|
@@ -318,9 +329,9 @@ class Git < Plugin::Project
|
|
318
329
|
|
319
330
|
def init_remotes
|
320
331
|
return super do
|
321
|
-
origin_url = config('remote.origin.url')
|
332
|
+
origin_url = config('remote.origin.url')
|
322
333
|
|
323
|
-
logger.debug("Original origin remote url: #{origin_url}")
|
334
|
+
logger.debug("Original origin remote url: #{origin_url}") if origin_url
|
324
335
|
origin_url
|
325
336
|
end
|
326
337
|
end
|
@@ -329,8 +340,8 @@ class Git < Plugin::Project
|
|
329
340
|
|
330
341
|
def remote(name)
|
331
342
|
return super do
|
332
|
-
url = config("remote.#{name}.url")
|
333
|
-
url.empty? ? nil : url
|
343
|
+
url = config("remote.#{name}.url")
|
344
|
+
url.nil? || url.empty? ? nil : url
|
334
345
|
end
|
335
346
|
end
|
336
347
|
|
@@ -338,9 +349,8 @@ class Git < Plugin::Project
|
|
338
349
|
|
339
350
|
def set_remote(name, url)
|
340
351
|
return super do |processed_url|
|
341
|
-
|
342
|
-
|
343
|
-
end
|
352
|
+
result = cli.remote({}, 'add', name, processed_url)
|
353
|
+
result.status == code.success
|
344
354
|
end
|
345
355
|
end
|
346
356
|
|
@@ -348,14 +358,12 @@ class Git < Plugin::Project
|
|
348
358
|
|
349
359
|
def add_remote_url(name, url, options = {})
|
350
360
|
return super do |config, processed_url|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
}, 'set-url', name.to_s, processed_url)
|
358
|
-
end
|
361
|
+
result = cli.remote({
|
362
|
+
:add => true,
|
363
|
+
:delete => config.get(:delete, false),
|
364
|
+
:push => config.get(:push, false)
|
365
|
+
}, 'set-url', name, processed_url)
|
366
|
+
result.status == code.success
|
359
367
|
end
|
360
368
|
end
|
361
369
|
|
@@ -363,13 +371,13 @@ class Git < Plugin::Project
|
|
363
371
|
|
364
372
|
def delete_remote(name)
|
365
373
|
return super do
|
366
|
-
|
374
|
+
remote = remote(name)
|
375
|
+
if ! remote || remote.empty?
|
367
376
|
logger.debug("Project can not delete remote #{name} because it does not exist yet")
|
368
377
|
true
|
369
378
|
else
|
370
|
-
|
371
|
-
|
372
|
-
end
|
379
|
+
result = cli.remote({}, 'rm', name)
|
380
|
+
result.status == code.success
|
373
381
|
end
|
374
382
|
end
|
375
383
|
end
|
@@ -386,20 +394,11 @@ class Git < Plugin::Project
|
|
386
394
|
#-----------------------------------------------------------------------------
|
387
395
|
# SSH operations
|
388
396
|
|
389
|
-
def git_fetch(remote = :edit, options = {})
|
397
|
+
def git_fetch(remote = :edit, options = {}, &block)
|
390
398
|
config = Config.ensure(options)
|
391
399
|
local_revision = config.get(:revision, get(:revision, :master))
|
392
400
|
|
393
|
-
result =
|
394
|
-
:command => :git,
|
395
|
-
:data => { 'git-dir=' => git.git_dir },
|
396
|
-
:subcommand => {
|
397
|
-
:command => :fetch,
|
398
|
-
:args => [ remote ]
|
399
|
-
}
|
400
|
-
}, config.get(:provider, Nucleon.type_default(:command))).exec(config.import({ :quiet => true })) do |op, command, data|
|
401
|
-
block_given? ? yield(op, command, data) : true
|
402
|
-
end
|
401
|
+
result = cli.fetch({}, remote, &block)
|
403
402
|
|
404
403
|
if result.status == code.success
|
405
404
|
new?(true)
|
@@ -412,30 +411,20 @@ class Git < Plugin::Project
|
|
412
411
|
|
413
412
|
#---
|
414
413
|
|
415
|
-
def pull(remote = :edit, options = {})
|
414
|
+
def pull(remote = :edit, options = {}, &block)
|
416
415
|
return super do |config, processed_remote|
|
417
416
|
success = false
|
418
417
|
|
419
418
|
if new? || get(:create, false)
|
420
419
|
success = git_fetch(processed_remote, config)
|
421
420
|
else
|
422
|
-
|
423
|
-
|
421
|
+
pull_options = {}
|
422
|
+
pull_options[:tags] = true if config.get(:tags, true)
|
424
423
|
|
425
424
|
local_revision = config.get(:revision, get(:revision, :master))
|
426
425
|
|
427
426
|
if checkout(local_revision)
|
428
|
-
result =
|
429
|
-
:command => :git,
|
430
|
-
:data => { 'git-dir=' => git.git_dir },
|
431
|
-
:subcommand => {
|
432
|
-
:command => :pull,
|
433
|
-
:flags => flags,
|
434
|
-
:args => [ processed_remote, local_revision ]
|
435
|
-
}
|
436
|
-
}, config.get(:provider, Nucleon.type_default(:command))).exec(config.import({ :quiet => true })) do |op, command, data|
|
437
|
-
block_given? ? yield(op, command, data) : true
|
438
|
-
end
|
427
|
+
result = cli.pull(pull_options, processed_remote, local_revision, &block)
|
439
428
|
|
440
429
|
if result.status == code.success
|
441
430
|
new?(true)
|
@@ -449,26 +438,15 @@ class Git < Plugin::Project
|
|
449
438
|
|
450
439
|
#---
|
451
440
|
|
452
|
-
def push(remote = :edit, options = {})
|
441
|
+
def push(remote = :edit, options = {}, &block)
|
453
442
|
return super do |config, processed_remote|
|
454
443
|
push_branch = config.get(:revision, '')
|
455
444
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
result = Nucleon.command({
|
461
|
-
:command => :git,
|
462
|
-
:data => { 'git-dir=' => git.git_dir },
|
463
|
-
:subcommand => {
|
464
|
-
:command => :push,
|
465
|
-
:flags => flags,
|
466
|
-
:args => [ processed_remote, push_branch ]
|
467
|
-
}
|
468
|
-
}, config.get(:provider, :bash)).exec(config.import({ :quiet => true })) do |op, command, data|
|
469
|
-
block_given? ? yield(op, command, data) : true
|
470
|
-
end
|
445
|
+
push_options = {}
|
446
|
+
push_options[:all] = true if push_branch.empty?
|
447
|
+
push_options[:tags] = true if ! push_branch.empty? && config.get(:tags, true)
|
471
448
|
|
449
|
+
result = cli.push(push_options, processed_remote, push_branch, &block)
|
472
450
|
result.status == code.success
|
473
451
|
end
|
474
452
|
end
|
@@ -495,6 +473,62 @@ class Git < Plugin::Project
|
|
495
473
|
end
|
496
474
|
end
|
497
475
|
end
|
476
|
+
|
477
|
+
#---
|
478
|
+
|
479
|
+
def git_exec(command, options = {}, args = [])
|
480
|
+
result = nil
|
481
|
+
|
482
|
+
if can_persist?
|
483
|
+
check_value = lambda do |value|
|
484
|
+
next false if value.nil?
|
485
|
+
next false unless value.is_a?(String) || value.is_a?(Symbol)
|
486
|
+
next false if value.to_s.empty?
|
487
|
+
true
|
488
|
+
end
|
489
|
+
|
490
|
+
localize(repo.workdir) do
|
491
|
+
flags = []
|
492
|
+
data = {}
|
493
|
+
processed_args = []
|
494
|
+
|
495
|
+
options.each do |key, value|
|
496
|
+
cli_option = key.to_s.gsub('_', '-')
|
497
|
+
|
498
|
+
if value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
499
|
+
flags << cli_option if value == true
|
500
|
+
|
501
|
+
elsif check_value.call(value)
|
502
|
+
data[cli_option] = value.to_s
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
506
|
+
args.each do |value|
|
507
|
+
if check_value.call(value)
|
508
|
+
processed_args << value.to_s
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
command_provider = get(:command_provider, Nucleon.type_default(:command))
|
513
|
+
quiet = get(:quiet, true)
|
514
|
+
|
515
|
+
result = Nucleon.command({
|
516
|
+
:command => :git,
|
517
|
+
:data => { 'git-dir=' => repo.path },
|
518
|
+
:subcommand => {
|
519
|
+
:command => command.to_s.gsub('_', '-'),
|
520
|
+
:flags => flags,
|
521
|
+
:data => data,
|
522
|
+
:args => processed_args
|
523
|
+
}
|
524
|
+
}, command_provider).exec({ :quiet => quiet }) do |op, cli_command, cli_data|
|
525
|
+
block_given? ? yield(op, cli_command, cli_data) : true
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
result
|
530
|
+
end
|
531
|
+
protected :git_exec
|
498
532
|
end
|
499
533
|
end
|
500
534
|
end
|