git-fastclone 1.2.6 → 1.3.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: 01c5d2b0002171f3ace397e442a8999737eebb0058fb5ad28fd731324ccac7e3
4
- data.tar.gz: 4cd6568ac0f74b314e8bd861f5957e3bc7f1e76cdf663308aa8c85702919bbb5
3
+ metadata.gz: 3e6bcf21a8d3b9c1b30b93efc17487fa8dfa0c319b8636efc1f96a430e27c876
4
+ data.tar.gz: 7720184507344bc94ad63e45b135e0948aab6776d371867159a4cd84dcfd2a0d
5
5
  SHA512:
6
- metadata.gz: '09963171d37af7b9c8eb01fbec2de51e9f35319e1367284a635dac32424651e7a719f7e42489843d7b11333a321e938ff94ca0413ef3aa72b907c53d2e37c75f'
7
- data.tar.gz: 91aaeec03b1b9144b8859802646bd6caa466daa6d7e0763536ce0d7e10dfc8acbd5d7939b0b24455a2754c39b3f7999e5873a763ecc45fbed92446d45136c8ae
6
+ metadata.gz: 13e48d37e5162a8288da830232476fb12ba7b8bb01c0ef0834a8eb372a224c0a2f8430d10002a9c54c1ec7fc7713db384ef32d0da9f1707366663bbe10e9ff04
7
+ data.tar.gz: 1f74af758cfbd3f47f98f6d4fc1a47e24bf574f9e7b58116b9aa3f6186ab334e66c66e413416641b7ce6494b3099b45158142fbd88b4c1bb3a0bb48a86c9b912
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Version string for git-fastclone
4
4
  module GitFastCloneVersion
5
- VERSION = '1.2.6'.freeze
5
+ VERSION = '1.3.0'.freeze
6
6
  end
data/lib/git-fastclone.rb CHANGED
@@ -121,7 +121,7 @@ module GitFastClone
121
121
  puts "Cloning #{path_from_git_url(url)} to #{File.join(abs_clone_path, path)}"
122
122
  Terrapin::CommandLine.environment['GIT_ALLOW_PROTOCOL'] =
123
123
  ENV['GIT_ALLOW_PROTOCOL'] || DEFAULT_GIT_ALLOW_PROTOCOL
124
- clone(url, options[:branch], path)
124
+ clone(url, options[:branch], path, options[:config])
125
125
  end
126
126
 
127
127
  def parse_options
@@ -148,6 +148,10 @@ module GitFastClone
148
148
  self.color = true
149
149
  end
150
150
 
151
+ opts.on('--config CONFIG', 'Git config applied to the cloned repo') do |config|
152
+ options[:config] = config
153
+ end
154
+
151
155
  opts.on('--lock-timeout N', 'Timeout in seconds to acquire a lock on any reference repo.
152
156
  Default is 0 which waits indefinitely.') do |timeout_secs|
153
157
  self.flock_timeout_secs = timeout_secs
@@ -187,14 +191,17 @@ module GitFastClone
187
191
 
188
192
  # Checkout to SOURCE_DIR. Update all submodules recursively. Use reference
189
193
  # repos everywhere for speed.
190
- def clone(url, rev, src_dir)
194
+ def clone(url, rev, src_dir, config)
191
195
  initial_time = Time.now
192
196
 
193
197
  with_git_mirror(url) do |mirror|
194
- Terrapin::CommandLine.new('git clone', '--quiet --reference :mirror :url :path')
198
+ clone_command = '--quiet --reference :mirror :url :path'
199
+ clone_command += ' --config :config' unless config.nil?
200
+ Terrapin::CommandLine.new('git clone', clone_command)
195
201
  .run(mirror: mirror.to_s,
196
202
  url: url.to_s,
197
- path: File.join(abs_clone_path, src_dir).to_s)
203
+ path: File.join(abs_clone_path, src_dir).to_s,
204
+ config: config.to_s)
198
205
  end
199
206
 
200
207
  # Only checkout if we're changing branches to a non-default branch
@@ -358,7 +365,8 @@ module GitFastClone
358
365
  /fatal: packed object [a-z0-9]+ \(stored in .*?\) is corrupt/,
359
366
  /fatal: pack has \d+ unresolved delta/,
360
367
  'error: unable to read sha1 file of ',
361
- 'fatal: did not receive expected object'
368
+ 'fatal: did not receive expected object',
369
+ /^fatal: unable to read tree [a-z0-9]+\n^warning: Clone succeeded, but checkout failed/
362
370
  ]
363
371
  if e.to_s =~ /^STDERR:\n.+^#{Regexp.union(error_strings)}/m
364
372
  # To avoid corruption of the cache, if we failed to update or check out we remove
@@ -56,11 +56,22 @@ describe GitFastClone::Runner do
56
56
  let(:options) { { branch: placeholder_arg } }
57
57
 
58
58
  it 'should run with the correct args' do
59
- allow(subject).to receive(:parse_inputs) { [placeholder_arg, placeholder_arg, options] }
60
- expect(subject).to receive(:clone).with(placeholder_arg, placeholder_arg, placeholder_arg)
59
+ allow(subject).to receive(:parse_inputs) { [placeholder_arg, placeholder_arg, options, nil] }
60
+ expect(subject).to receive(:clone).with(placeholder_arg, placeholder_arg, placeholder_arg, nil)
61
61
 
62
62
  subject.run
63
63
  end
64
+
65
+ describe 'with custom configs' do
66
+ let(:options) { { branch: placeholder_arg, config: 'conf' } }
67
+
68
+ it 'should clone correctly' do
69
+ allow(subject).to receive(:parse_inputs) { [placeholder_arg, placeholder_arg, options, 'conf'] }
70
+ expect(subject).to receive(:clone).with(placeholder_arg, placeholder_arg, placeholder_arg, 'conf')
71
+
72
+ subject.run
73
+ end
74
+ end
64
75
  end
65
76
 
66
77
  describe '.parse_inputs' do
@@ -74,17 +85,50 @@ describe GitFastClone::Runner do
74
85
  end
75
86
 
76
87
  describe '.clone' do
77
- it 'should clone correctly' do
78
- terrapin_commandline_double = double('new_terrapin_commandline')
79
- allow(subject).to receive(:with_git_mirror) {}
88
+ let(:terrapin_commandline_double) { double('new_terrapin_commandline') }
89
+ before(:each) do
80
90
  allow(terrapin_commandline_double).to receive(:run) {}
81
- allow(Terrapin::CommandLine).to receive(:new) { terrapin_commandline_double }
82
-
83
91
  expect(Time).to receive(:now).twice { 0 }
84
- expect(Terrapin::CommandLine).to receive(:new)
85
- expect(terrapin_commandline_double).to receive(:run)
92
+ allow(Dir).to receive(:pwd) { '/pwd' }
93
+ allow(Dir).to receive(:chdir).and_yield
94
+ allow(subject).to receive(:with_git_mirror).and_yield('/cache')
95
+ end
86
96
 
87
- subject.clone(placeholder_arg, placeholder_arg, '.')
97
+ it 'should clone correctly' do
98
+ expect(Terrapin::CommandLine).to receive(:new).with(
99
+ 'git clone',
100
+ '--quiet --reference :mirror :url :path'
101
+ ) { terrapin_commandline_double }
102
+ expect(Terrapin::CommandLine).to receive(:new).with(
103
+ 'git checkout',
104
+ '--quiet :rev'
105
+ ) { terrapin_commandline_double }
106
+ expect(terrapin_commandline_double).to receive(:run).with(
107
+ mirror: '/cache',
108
+ url: placeholder_arg,
109
+ path: '/pwd/.',
110
+ config: ''
111
+ )
112
+ expect(terrapin_commandline_double).to receive(:run).with(rev: placeholder_arg)
113
+
114
+ subject.clone(placeholder_arg, placeholder_arg, '.', nil)
115
+ end
116
+
117
+ describe 'with custom configs' do
118
+ it 'should clone correctly' do
119
+ expect(Terrapin::CommandLine).to receive(:new).with(
120
+ 'git clone',
121
+ '--quiet --reference :mirror :url :path --config :config'
122
+ ) { terrapin_commandline_double }
123
+ expect(terrapin_commandline_double).to receive(:run).with(
124
+ mirror: '/cache',
125
+ url: placeholder_arg,
126
+ path: '/pwd/.',
127
+ config: 'config'
128
+ )
129
+
130
+ subject.clone(placeholder_arg, nil, '.', 'config')
131
+ end
88
132
  end
89
133
  end
90
134
 
@@ -306,7 +350,7 @@ describe GitFastClone::Runner do
306
350
  expect(yielded).to eq([test_url_valid])
307
351
  end
308
352
 
309
- it 'should retry when the clone succeeds but checkout fails' do
353
+ it 'should retry when the clone succeeds but checkout fails with corrupt packed object' do
310
354
  allow(subject).to receive(:update_reference_repo) {}
311
355
  expect(subject).to receive(:reference_repo_dir)
312
356
  expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
@@ -333,6 +377,35 @@ describe GitFastClone::Runner do
333
377
  expect(yielded).to eq([test_url_valid])
334
378
  end
335
379
 
380
+ it 'should retry when the clone succeeds but checkout fails with unable to read tree' do
381
+ allow(subject).to receive(:update_reference_repo) {}
382
+ expect(subject).to receive(:reference_repo_dir)
383
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
384
+
385
+ responses = [
386
+ lambda { |_url|
387
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
388
+ STDOUT:
389
+
390
+ STDERR:
391
+
392
+ error: Could not read 92cf57b8f07df010ab5f607b109c325e30e46235
393
+ fatal: unable to read tree 0c32c0521d3b0bfb4e74e4a39b97a84d1a3bb9a1
394
+ warning: Clone succeeded, but checkout failed.
395
+ You can inspect what was checked out with 'git status'
396
+ and retry with 'git restore --source=HEAD :/'
397
+ ERROR
398
+ },
399
+ ->(url) { url }
400
+ ]
401
+ subject.with_git_mirror(test_url_valid) do
402
+ yielded << responses.shift.call(test_url_valid)
403
+ end
404
+
405
+ expect(responses).to be_empty
406
+ expect(yielded).to eq([test_url_valid])
407
+ end
408
+
336
409
  it 'should retry when one delta is missing' do
337
410
  allow(subject).to receive(:update_reference_repo) {}
338
411
  expect(subject).to receive(:reference_repo_dir)
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-fastclone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Tauraso
8
8
  - James Chang
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-09-17 00:00:00.000000000 Z
12
+ date: 2022-12-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
@@ -62,7 +62,7 @@ homepage: http://square.github.io/git-fastclone/
62
62
  licenses:
63
63
  - Apache
64
64
  metadata: {}
65
- post_install_message:
65
+ post_install_message:
66
66
  rdoc_options: []
67
67
  require_paths:
68
68
  - lib
@@ -77,8 +77,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  - !ruby/object:Gem::Version
78
78
  version: '0'
79
79
  requirements: []
80
- rubygems_version: 3.0.4
81
- signing_key:
80
+ rubygems_version: 3.1.6
81
+ signing_key:
82
82
  specification_version: 4
83
83
  summary: git-clone --recursive on steroids!
84
84
  test_files: