git-fastclone 1.2.1 → 1.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b66c5e0946f4cfae0ecb36ac298f9b6e76e85a829ee17fd8a3425c92468e3c8d
4
- data.tar.gz: 3364449b9348575acf9ec4dfd2f73883e19e634340d35a0aa8df9ffe4f9c3aaf
3
+ metadata.gz: 22f5537cbc1297198ea1aa106a305ef5ad9526dc24fc9a39048c6889e6d441b4
4
+ data.tar.gz: 0f1f38ba2756185c3c02b7a5ec3cf40c01e4498e743388f41991ca1d817793de
5
5
  SHA512:
6
- metadata.gz: 04a9315f022dba1cdb0ac34dd4daa768d9c19a1cbdb7eea3767098e8bc120e1a5ad2676c0e9791dc964f0b4fabd373b8d807faecbd9a4dde243ab1e97f927f5b
7
- data.tar.gz: 96ea39ac905ac8f512322a03c3556acdd8d13174d9b5ad8591ab8ee73ea12f679c7481817e099d3300ccfea714977b9b72e93efd9148f7a878035dd8c68f4b6f
6
+ metadata.gz: 22634dabfc0c4d91682dc7db8d9e18e6cdc4a6d6db079a66c5e498ccc6ed70c8bcb7ccd24657b91e5142d0fe8be0f34169223d1d70cb1262ed3c6d88e3ec0e83
7
+ data.tar.gz: 8dd73fac0eb7eec9b8e8ead616a48549860722982b756b950ad020cd295da4dffeaf4b89b7dad3c88f2dc4b82119a40172a499441924bbcf2885e280313850eb
data/lib/git-fastclone.rb CHANGED
@@ -352,7 +352,16 @@ module GitFastClone
352
352
  begin
353
353
  yield dir
354
354
  rescue Terrapin::ExitStatusError => e
355
- if e.to_s =~ /^STDERR:\n.+^fatal: (missing blob object|remote did not send all necessary objects)/m
355
+ error_strings = [
356
+ 'fatal: missing blob object',
357
+ 'fatal: remote did not send all necessary objects',
358
+ /fatal: packed object [a-z0-9]+ \(stored in .*?\) is corrupt/,
359
+ /fatal: pack has \d+ unresolved delta/,
360
+ 'error: unable to read sha1 file of ',
361
+ 'fatal: did not receive expected object',
362
+ /^fatal: unable to read tree [a-z0-9]+\n^warning: Clone succeeded, but checkout failed/
363
+ ]
364
+ if e.to_s =~ /^STDERR:\n.+^#{Regexp.union(error_strings)}/m
356
365
  # To avoid corruption of the cache, if we failed to update or check out we remove
357
366
  # the cache directory entirely. This may cause the current clone to fail, but if the
358
367
  # underlying error from git is transient it will not affect future clones.
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Version string for git-fastclone
4
4
  module GitFastCloneVersion
5
- VERSION = '1.2.1'.freeze
5
+ VERSION = '1.2.7'.freeze
6
6
  end
@@ -305,5 +305,172 @@ describe GitFastClone::Runner do
305
305
  expect(responses).to be_empty
306
306
  expect(yielded).to eq([test_url_valid])
307
307
  end
308
+
309
+ it 'should retry when the clone succeeds but checkout fails with corrupt packed object' do
310
+ allow(subject).to receive(:update_reference_repo) {}
311
+ expect(subject).to receive(:reference_repo_dir)
312
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
313
+
314
+ responses = [
315
+ lambda { |_url|
316
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
317
+ STDOUT:
318
+
319
+ STDERR:
320
+
321
+ fatal: packed object 7c4d79704f8adf701f38a7bfb3e33ec5342542f1 (stored in /private/var/tmp/git-fastclone/reference/some-repo.git/objects/pack/pack-d37d7ed3e88d6e5f0ac141a7b0a2b32baf6e21a0.pack) is corrupt
322
+ warning: Clone succeeded, but checkout failed.
323
+ You can inspect what was checked out with 'git status' and retry with 'git restore --source=HEAD :/'
324
+ ERROR
325
+ },
326
+ ->(url) { url }
327
+ ]
328
+ subject.with_git_mirror(test_url_valid) do
329
+ yielded << responses.shift.call(test_url_valid)
330
+ end
331
+
332
+ expect(responses).to be_empty
333
+ expect(yielded).to eq([test_url_valid])
334
+ end
335
+
336
+ it 'should retry when the clone succeeds but checkout fails with unable to read tree' do
337
+ allow(subject).to receive(:update_reference_repo) {}
338
+ expect(subject).to receive(:reference_repo_dir)
339
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
340
+
341
+ responses = [
342
+ lambda { |_url|
343
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
344
+ STDOUT:
345
+
346
+ STDERR:
347
+
348
+ error: Could not read 92cf57b8f07df010ab5f607b109c325e30e46235
349
+ fatal: unable to read tree 0c32c0521d3b0bfb4e74e4a39b97a84d1a3bb9a1
350
+ warning: Clone succeeded, but checkout failed.
351
+ You can inspect what was checked out with 'git status'
352
+ and retry with 'git restore --source=HEAD :/'
353
+ ERROR
354
+ },
355
+ ->(url) { url }
356
+ ]
357
+ subject.with_git_mirror(test_url_valid) do
358
+ yielded << responses.shift.call(test_url_valid)
359
+ end
360
+
361
+ expect(responses).to be_empty
362
+ expect(yielded).to eq([test_url_valid])
363
+ end
364
+
365
+ it 'should retry when one delta is missing' do
366
+ allow(subject).to receive(:update_reference_repo) {}
367
+ expect(subject).to receive(:reference_repo_dir)
368
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
369
+
370
+ responses = [
371
+ lambda { |_url|
372
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
373
+ STDOUT:
374
+
375
+ STDERR:
376
+
377
+ error: Could not read f7fad86d06fee0678f9af7203b6031feabb40c3e
378
+ fatal: pack has 1 unresolved delta
379
+ fatal: index-pack failed
380
+ ERROR
381
+ },
382
+ ->(url) { url }
383
+ ]
384
+ subject.with_git_mirror(test_url_valid) do
385
+ yielded << responses.shift.call(test_url_valid)
386
+ end
387
+
388
+ expect(responses).to be_empty
389
+ expect(yielded).to eq([test_url_valid])
390
+ end
391
+
392
+ it 'should retry when deltas are missing' do
393
+ allow(subject).to receive(:update_reference_repo) {}
394
+ expect(subject).to receive(:reference_repo_dir)
395
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
396
+
397
+ responses = [
398
+ lambda { |_url|
399
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
400
+ STDOUT:
401
+
402
+ STDERR:
403
+
404
+ error: Could not read f7fad86d06fee0678f9af7203b6031feabb40c3e
405
+ fatal: pack has 138063 unresolved deltas
406
+ fatal: index-pack failed
407
+ ERROR
408
+ },
409
+ ->(url) { url }
410
+ ]
411
+ subject.with_git_mirror(test_url_valid) do
412
+ yielded << responses.shift.call(test_url_valid)
413
+ end
414
+
415
+ expect(responses).to be_empty
416
+ expect(yielded).to eq([test_url_valid])
417
+ end
418
+ end
419
+
420
+ it 'should retry when the cache errors with unable to read sha1 file' do
421
+ allow(subject).to receive(:update_reference_repo) {}
422
+ expect(subject).to receive(:reference_repo_dir)
423
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
424
+
425
+ responses = [
426
+ lambda { |_url|
427
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
428
+ STDOUT:
429
+
430
+ STDERR:
431
+
432
+ error: unable to read sha1 file of sqiosbuild/lib/action/action.rb (6113b739af82d8b07731de8a58d6e233301f80ab)
433
+ fatal: unable to checkout working tree
434
+ warning: Clone succeeded, but checkout failed.
435
+ You can inspect what was checked out with 'git status'
436
+ and retry with 'git restore --source=HEAD :/'
437
+ ERROR
438
+ },
439
+ ->(url) { url }
440
+ ]
441
+ subject.with_git_mirror(test_url_valid) do
442
+ yielded << responses.shift.call(test_url_valid)
443
+ end
444
+
445
+ expect(responses).to be_empty
446
+ expect(yielded).to eq([test_url_valid])
447
+ end
448
+
449
+ it 'should retry when the cache errors with did not receive expected object' do
450
+ allow(subject).to receive(:update_reference_repo) {}
451
+ expect(subject).to receive(:reference_repo_dir)
452
+ expect(subject).to receive(:reference_repo_lock_file).and_return(lockfile)
453
+
454
+ responses = [
455
+ lambda { |_url|
456
+ raise Terrapin::ExitStatusError, <<-ERROR.gsub(/^ {12}/, '')
457
+ STDOUT:
458
+
459
+ STDERR:
460
+
461
+ error: Could not read 6682dfe81f66656436e60883dd795e7ec6735153
462
+ error: Could not read 0cd3703c23fa44c0043d97fbc26356a23939f31b
463
+ fatal: did not receive expected object 3c64c9dd49c79bd09aa13d4b05ac18263ca29ccd
464
+ fatal: index-pack failed
465
+ ERROR
466
+ },
467
+ ->(url) { url }
468
+ ]
469
+ subject.with_git_mirror(test_url_valid) do
470
+ yielded << responses.shift.call(test_url_valid)
471
+ end
472
+
473
+ expect(responses).to be_empty
474
+ expect(yielded).to eq([test_url_valid])
308
475
  end
309
476
  end
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.1
4
+ version: 1.2.7
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: 2019-06-27 00:00:00.000000000 Z
12
+ date: 2021-02-26 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
@@ -78,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
78
  version: '0'
79
79
  requirements: []
80
80
  rubygems_version: 3.0.1
81
- signing_key:
81
+ signing_key:
82
82
  specification_version: 4
83
83
  summary: git-clone --recursive on steroids!
84
84
  test_files: