git-fastclone 1.4.1 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/git-fastclone/version.rb +1 -1
- data/lib/git-fastclone.rb +17 -7
- data/lib/runner_execution.rb +8 -5
- data/spec/git_fastclone_runner_spec.rb +20 -5
- data/spec/runner_execution_spec.rb +58 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da2eb17be407c42dbabdb002d8cee1fb56820f6543df47758b0376e84ed2344e
|
4
|
+
data.tar.gz: 0c1ca35bca06f608f8087670eba49cb5cc7d6c1af7c308e38159477455bd33c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a3d27522c916ac8883ad8abceb5d19529bb406409b3f7904652a54640b2edc91184420baad3118d8379b7c26ce2331018367c994375843c9130ae9511f1108f
|
7
|
+
data.tar.gz: 413c42026762c4bf1a80d693d2920c0a519969a7d5c4f215fb810b88f6dabb5e449a15d331214c0751e0daa92c4cbc706915e7ca4d9691ec2aaefb292b8cbef6
|
data/lib/git-fastclone.rb
CHANGED
@@ -74,7 +74,7 @@ module GitFastClone
|
|
74
74
|
DEFAULT_GIT_ALLOW_PROTOCOL = 'file:git:http:https:ssh'
|
75
75
|
|
76
76
|
attr_accessor :reference_dir, :prefetch_submodules, :reference_updated, :reference_mutex,
|
77
|
-
:options, :abs_clone_path, :using_local_repo, :verbose, :color,
|
77
|
+
:options, :abs_clone_path, :using_local_repo, :verbose, :print_git_errors, :color,
|
78
78
|
:flock_timeout_secs
|
79
79
|
|
80
80
|
def initialize
|
@@ -100,6 +100,8 @@ module GitFastClone
|
|
100
100
|
|
101
101
|
self.verbose = false
|
102
102
|
|
103
|
+
self.print_git_errors = false
|
104
|
+
|
103
105
|
self.color = false
|
104
106
|
|
105
107
|
self.flock_timeout_secs = 0
|
@@ -133,9 +135,15 @@ module GitFastClone
|
|
133
135
|
end
|
134
136
|
|
135
137
|
opts.on('-v', '--verbose', 'Verbose mode') do
|
138
|
+
puts '--print_git_errors is redundant when using --verbose' if print_git_errors
|
136
139
|
self.verbose = true
|
137
140
|
end
|
138
141
|
|
142
|
+
opts.on('--print_git_errors', 'Print git output if a command fails') do
|
143
|
+
puts '--print_git_errors is redundant when using --verbose' if verbose
|
144
|
+
self.print_git_errors = true
|
145
|
+
end
|
146
|
+
|
139
147
|
opts.on('-c', '--color', 'Display colored output') do
|
140
148
|
self.color = true
|
141
149
|
end
|
@@ -212,13 +220,14 @@ module GitFastClone
|
|
212
220
|
clone_commands = ['git', 'clone', verbose ? '--verbose' : '--quiet']
|
213
221
|
clone_commands << '--reference' << mirror.to_s << url.to_s << clone_dest
|
214
222
|
clone_commands << '--config' << config.to_s unless config.nil?
|
215
|
-
fail_on_error(*clone_commands, quiet: !verbose)
|
223
|
+
fail_on_error(*clone_commands, quiet: !verbose, print_on_failure: print_git_errors)
|
216
224
|
end
|
217
225
|
|
218
226
|
# Only checkout if we're changing branches to a non-default branch
|
219
227
|
if rev
|
220
228
|
Dir.chdir(File.join(abs_clone_path, src_dir)) do
|
221
|
-
fail_on_error('git', 'checkout', '--quiet', rev.to_s, quiet: !verbose
|
229
|
+
fail_on_error('git', 'checkout', '--quiet', rev.to_s, quiet: !verbose,
|
230
|
+
print_on_failure: print_git_errors)
|
222
231
|
end
|
223
232
|
end
|
224
233
|
|
@@ -243,7 +252,8 @@ module GitFastClone
|
|
243
252
|
submodule_url_list = []
|
244
253
|
output = ''
|
245
254
|
Dir.chdir(File.join(abs_clone_path, pwd).to_s) do
|
246
|
-
output = fail_on_error('git', 'submodule', 'init', quiet: !verbose
|
255
|
+
output = fail_on_error('git', 'submodule', 'init', quiet: !verbose,
|
256
|
+
print_on_failure: print_git_errors)
|
247
257
|
end
|
248
258
|
|
249
259
|
output.split("\n").each do |line|
|
@@ -263,7 +273,7 @@ module GitFastClone
|
|
263
273
|
Dir.chdir(File.join(abs_clone_path, pwd).to_s) do
|
264
274
|
cmd = ['git', 'submodule', verbose ? nil : '--quiet', 'update', '--reference', mirror.to_s,
|
265
275
|
submodule_path.to_s].compact
|
266
|
-
fail_on_error(*cmd, quiet: !verbose)
|
276
|
+
fail_on_error(*cmd, quiet: !verbose, print_on_failure: print_git_errors)
|
267
277
|
end
|
268
278
|
end
|
269
279
|
|
@@ -337,12 +347,12 @@ module GitFastClone
|
|
337
347
|
def store_updated_repo(url, mirror, repo_name, fail_hard)
|
338
348
|
unless Dir.exist?(mirror)
|
339
349
|
fail_on_error('git', 'clone', verbose ? '--verbose' : '--quiet', '--mirror', url.to_s, mirror.to_s,
|
340
|
-
quiet: !verbose)
|
350
|
+
quiet: !verbose, print_on_failure: print_git_errors)
|
341
351
|
end
|
342
352
|
|
343
353
|
Dir.chdir(mirror) do
|
344
354
|
cmd = ['git', 'remote', verbose ? '--verbose' : nil, 'update', '--prune'].compact
|
345
|
-
fail_on_error(*cmd, quiet: !verbose)
|
355
|
+
fail_on_error(*cmd, quiet: !verbose, print_on_failure: print_git_errors)
|
346
356
|
end
|
347
357
|
reference_updated[repo_name] = true
|
348
358
|
rescue RunnerExecutionRuntimeError => e
|
data/lib/runner_execution.rb
CHANGED
@@ -22,7 +22,7 @@ module RunnerExecution
|
|
22
22
|
|
23
23
|
# Runs a command that fails on error.
|
24
24
|
# Uses popen2e wrapper. Handles bad statuses with potential for retries.
|
25
|
-
def fail_on_error(*cmd, stdin_data: nil, binmode: false, quiet: false, **opts)
|
25
|
+
def fail_on_error(*cmd, stdin_data: nil, binmode: false, quiet: false, print_on_failure: false, **opts)
|
26
26
|
print_command('Running Shell Safe Command:', [cmd]) unless quiet
|
27
27
|
shell_safe_cmd = shell_safe(cmd)
|
28
28
|
retry_times = opts[:retry] || 0
|
@@ -39,7 +39,9 @@ module RunnerExecution
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# Get out with the status, good or bad.
|
42
|
-
|
42
|
+
# When quiet, we don't need to print the output, as it is already streamed from popen2e_wrapper
|
43
|
+
needs_print_on_failure = quiet && print_on_failure
|
44
|
+
exit_on_status(output, [shell_safe_cmd], [status], quiet: quiet, print_on_failure: needs_print_on_failure)
|
43
45
|
end
|
44
46
|
module_function :fail_on_error
|
45
47
|
|
@@ -155,20 +157,21 @@ module RunnerExecution
|
|
155
157
|
# return code of the first one.
|
156
158
|
#
|
157
159
|
# Otherwise returns first argument (output)
|
158
|
-
def exit_on_status(output, cmd_list, status_list, quiet: false)
|
160
|
+
def exit_on_status(output, cmd_list, status_list, quiet: false, print_on_failure: false)
|
159
161
|
status_list.each_index do |index|
|
160
162
|
status = status_list[index]
|
161
163
|
cmd = cmd_list[index]
|
162
|
-
check_status(cmd, status, output: output, quiet: quiet)
|
164
|
+
check_status(cmd, status, output: output, quiet: quiet, print_on_failure: print_on_failure)
|
163
165
|
end
|
164
166
|
|
165
167
|
output
|
166
168
|
end
|
167
169
|
module_function :exit_on_status
|
168
170
|
|
169
|
-
def check_status(cmd, status, output: nil, quiet: false)
|
171
|
+
def check_status(cmd, status, output: nil, quiet: false, print_on_failure: false)
|
170
172
|
return if status.exited? && status.exitstatus == 0
|
171
173
|
|
174
|
+
logger.info(output) if print_on_failure
|
172
175
|
# If we exited nonzero or abnormally, print debugging info and explode.
|
173
176
|
if status.exited?
|
174
177
|
logger.debug("Process Exited normally. Exit status:#{status.exitstatus}") unless quiet
|
@@ -99,11 +99,11 @@ describe GitFastClone::Runner do
|
|
99
99
|
it 'should clone correctly' do
|
100
100
|
expect(subject).to receive(:fail_on_error).with(
|
101
101
|
'git', 'checkout', '--quiet', 'PH',
|
102
|
-
{ quiet: true }
|
102
|
+
{ quiet: true, print_on_failure: false }
|
103
103
|
) { runner_execution_double }
|
104
104
|
expect(subject).to receive(:fail_on_error).with(
|
105
105
|
'git', 'clone', '--quiet', '--reference', '/cache', 'PH', '/pwd/.',
|
106
|
-
{ quiet: true }
|
106
|
+
{ quiet: true, print_on_failure: false }
|
107
107
|
) { runner_execution_double }
|
108
108
|
|
109
109
|
subject.clone(placeholder_arg, placeholder_arg, '.', nil)
|
@@ -113,11 +113,11 @@ describe GitFastClone::Runner do
|
|
113
113
|
subject.verbose = true
|
114
114
|
expect(subject).to receive(:fail_on_error).with(
|
115
115
|
'git', 'checkout', '--quiet', 'PH',
|
116
|
-
{ quiet: false }
|
116
|
+
{ quiet: false, print_on_failure: false }
|
117
117
|
) { runner_execution_double }
|
118
118
|
expect(subject).to receive(:fail_on_error).with(
|
119
119
|
'git', 'clone', '--verbose', '--reference', '/cache', 'PH', '/pwd/.',
|
120
|
-
{ quiet: false }
|
120
|
+
{ quiet: false, print_on_failure: false }
|
121
121
|
) { runner_execution_double }
|
122
122
|
|
123
123
|
subject.clone(placeholder_arg, placeholder_arg, '.', nil)
|
@@ -126,11 +126,26 @@ describe GitFastClone::Runner do
|
|
126
126
|
it 'should clone correctly with custom configs' do
|
127
127
|
expect(subject).to receive(:fail_on_error).with(
|
128
128
|
'git', 'clone', '--quiet', '--reference', '/cache', 'PH', '/pwd/.', '--config', 'config',
|
129
|
-
{ quiet: true }
|
129
|
+
{ quiet: true, print_on_failure: false }
|
130
130
|
) { runner_execution_double }
|
131
131
|
|
132
132
|
subject.clone(placeholder_arg, nil, '.', 'config')
|
133
133
|
end
|
134
|
+
|
135
|
+
context 'with printing errors' do
|
136
|
+
before(:each) do
|
137
|
+
subject.print_git_errors = true
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'prints failures' do
|
141
|
+
expect(subject).to receive(:fail_on_error).with(
|
142
|
+
'git', 'clone', '--quiet', '--reference', '/cache', 'PH', '/pwd/.', '--config', 'config',
|
143
|
+
{ quiet: true, print_on_failure: true }
|
144
|
+
) { runner_execution_double }
|
145
|
+
|
146
|
+
subject.clone(placeholder_arg, nil, '.', 'config')
|
147
|
+
end
|
148
|
+
end
|
134
149
|
end
|
135
150
|
|
136
151
|
describe '.clear_clone_dest_if_needed' do
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2023 Square Inc.
|
4
|
+
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
require 'git-fastclone'
|
19
|
+
|
20
|
+
# Integration tests use real demo_tool.sh to inspect the E2E behavior
|
21
|
+
describe RunnerExecution do
|
22
|
+
subject { described_class }
|
23
|
+
let(:external_tool) { "#{__dir__}/../script/spec_demo_tool.sh" }
|
24
|
+
let(:logger) { double('logger') }
|
25
|
+
|
26
|
+
before do
|
27
|
+
allow($stdout).to receive(:puts)
|
28
|
+
allow(logger).to receive(:info)
|
29
|
+
allow(logger).to receive(:debug)
|
30
|
+
allow(logger).to receive(:warn)
|
31
|
+
allow(RunnerExecution).to receive(:logger).and_return(logger)
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '.fail_on_error' do
|
35
|
+
it 'should log failure info on command error' do
|
36
|
+
expect(logger).to receive(:info).with("My error output\n")
|
37
|
+
|
38
|
+
expect do
|
39
|
+
described_class.fail_on_error(external_tool, '1', 'My error output', quiet: true,
|
40
|
+
print_on_failure: true)
|
41
|
+
end.to raise_error(RunnerExecution::RunnerExecutionRuntimeError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should not log failure output on command success' do
|
45
|
+
expect($stdout).not_to receive(:info)
|
46
|
+
|
47
|
+
described_class.fail_on_error(external_tool, '0', 'My success output', quiet: true,
|
48
|
+
print_on_failure: true)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should not log failure output when not in the quiet mode' do
|
52
|
+
expect($stdout).not_to receive(:info)
|
53
|
+
|
54
|
+
described_class.fail_on_error(external_tool, '0', 'My success output', quiet: false,
|
55
|
+
print_on_failure: true)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-fastclone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Tauraso
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: colorize
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/runner_execution.rb
|
45
45
|
- spec/git_fastclone_runner_spec.rb
|
46
46
|
- spec/git_fastclone_url_helper_spec.rb
|
47
|
+
- spec/runner_execution_spec.rb
|
47
48
|
- spec/spec_helper.rb
|
48
49
|
homepage: http://square.github.io/git-fastclone/
|
49
50
|
licenses:
|
@@ -65,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
66
|
- !ruby/object:Gem::Version
|
66
67
|
version: '0'
|
67
68
|
requirements: []
|
68
|
-
rubygems_version: 3.
|
69
|
+
rubygems_version: 3.4.13
|
69
70
|
signing_key:
|
70
71
|
specification_version: 4
|
71
72
|
summary: git-clone --recursive on steroids!
|