@@ -18,35 +18,28 @@ import (
18
18
)
19
19
20
20
var (
21
- fetchRecentArg bool
22
- fetchAllArg bool
23
- fetchPruneArg bool
24
- fetchDryRunArg bool
25
- fetchJsonArg bool
21
+ fetchRecentArg bool
22
+ fetchAllArg bool
23
+ fetchPruneArg bool
24
+ fetchRefetchArg bool
25
+ fetchDryRunArg bool
26
+ fetchJsonArg bool
26
27
)
27
28
28
29
type fetchWatcher struct {
29
- transfers []* tq.Transfer
30
- virtuallyFetched map [string ]bool
31
- }
32
-
33
- func newfetchWatcher () * fetchWatcher {
34
- ret := & fetchWatcher {}
35
- if fetchJsonArg {
36
- ret .transfers = make ([]* tq.Transfer , 0 )
37
- }
38
- if fetchDryRunArg {
39
- ret .virtuallyFetched = make (map [string ]bool )
40
- }
41
- return ret
30
+ transfers []* tq.Transfer
31
+ observed map [string ]bool
42
32
}
43
33
44
34
func (d * fetchWatcher ) registerTransfer (t * tq.Transfer ) {
45
- if d . transfers != nil {
35
+ if fetchJsonArg {
46
36
d .transfers = append (d .transfers , t )
47
37
}
48
- if d .virtuallyFetched != nil {
49
- d .virtuallyFetched [t .Oid ] = true
38
+ if fetchDryRunArg || fetchRefetchArg {
39
+ if d .observed == nil {
40
+ d .observed = make (map [string ]bool )
41
+ }
42
+ d .observed [t .Oid ] = true
50
43
}
51
44
if fetchDryRunArg {
52
45
printProgress ("%s %s => %s" , tr .Tr .Get ("fetch" ), t .Oid , t .Name )
@@ -57,15 +50,18 @@ func (d *fetchWatcher) dumpJson() {
57
50
data := struct {
58
51
Transfers []* tq.Transfer `json:"transfers"`
59
52
}{Transfers : d .transfers }
53
+ if data .Transfers == nil {
54
+ data .Transfers = []* tq.Transfer {}
55
+ }
60
56
encoder := json .NewEncoder (os .Stdout )
61
57
encoder .SetIndent ("" , " " )
62
58
if err := encoder .Encode (data ); err != nil {
63
59
ExitWithError (err )
64
60
}
65
61
}
66
62
67
- func (d * fetchWatcher ) hasVirtuallyFetched (oid string ) bool {
68
- return d .virtuallyFetched [oid ]
63
+ func (d * fetchWatcher ) hasObserved (oid string ) bool {
64
+ return d .observed [oid ]
69
65
}
70
66
71
67
func hasToPrintTransfers () bool {
@@ -126,7 +122,7 @@ func fetchCommand(cmd *cobra.Command, args []string) {
126
122
include , exclude := getIncludeExcludeArgs (cmd )
127
123
fetchPruneCfg := lfs .NewFetchPruneConfig (cfg .Git )
128
124
129
- watcher := newfetchWatcher ()
125
+ watcher := & fetchWatcher {}
130
126
131
127
if fetchAllArg {
132
128
if fetchRecentArg {
@@ -392,8 +388,8 @@ func scanAll() []*lfs.WrappedPointer {
392
388
393
389
// Fetch
394
390
// Returns true if all completed with no errors, false if errors were written to stderr/log
395
- func fetch (allpointers []* lfs.WrappedPointer , watcher * fetchWatcher ) bool {
396
- pointers , meter := missingPointers ( allpointers , watcher )
391
+ func fetch (allPointers []* lfs.WrappedPointer , watcher * fetchWatcher ) bool {
392
+ pointersToFetch , meter := pointersToFetch ( allPointers , watcher )
397
393
q := newDownloadQueue (
398
394
getTransferManifestOperationRemote ("download" , cfg .Remote ()),
399
395
cfg .Remote (), tq .WithProgress (meter ), tq .DryRun (fetchDryRunArg ),
@@ -411,7 +407,7 @@ func fetch(allpointers []*lfs.WrappedPointer, watcher *fetchWatcher) bool {
411
407
}()
412
408
}
413
409
414
- for _ , p := range pointers {
410
+ for _ , p := range pointersToFetch {
415
411
tracerx .Printf ("fetch %v [%v]" , p .Name , p .Oid )
416
412
417
413
q .Add (downloadTransfer (p ))
@@ -432,31 +428,38 @@ func fetch(allpointers []*lfs.WrappedPointer, watcher *fetchWatcher) bool {
432
428
return ok
433
429
}
434
430
435
- func missingPointers ( allpointers []* lfs.WrappedPointer , watcher * fetchWatcher ) ([]* lfs.WrappedPointer , * tq.Meter ) {
431
+ func pointersToFetch ( allPointers []* lfs.WrappedPointer , watcher * fetchWatcher ) ([]* lfs.WrappedPointer , * tq.Meter ) {
436
432
logger := tasklog .NewLogger (os .Stdout ,
437
433
tasklog .ForceProgress (cfg .ForceProgress ()),
438
434
)
439
435
meter := buildProgressMeter (hasToPrintTransfers (), tq .Download )
440
436
logger .Enqueue (meter )
441
437
442
- missing := make ([]* lfs.WrappedPointer , 0 , len (allpointers ))
438
+ pointersToFetch := make ([]* lfs.WrappedPointer , 0 , len (allPointers ))
443
439
444
- for _ , p := range allpointers {
445
- // no need to download objects that exist locally already
446
- lfs . LinkOrCopyFromReference ( cfg , p . Oid , p . Size )
447
- if cfg . LFSObjectExists (p .Oid , p . Size ) {
440
+ for _ , p := range allPointers {
441
+ // if running with --dry-run or --refetch, skip objects that have already been virtually or
442
+ // already forcefully fetched
443
+ if watcher != nil && watcher . hasObserved (p .Oid ) {
448
444
continue
449
445
}
450
- // also if running with --dry-run, skip objects that have already been virtually fetched
451
- if watcher != nil && watcher .hasVirtuallyFetched (p .Oid ) {
446
+
447
+ // empty files are special, we always skip them in upload/download operations
448
+ if p .Size == 0 {
449
+ continue
450
+ }
451
+
452
+ // no need to download objects that exist locally already, unless `--refetch` was provided
453
+ lfs .LinkOrCopyFromReference (cfg , p .Oid , p .Size )
454
+ if ! fetchRefetchArg && cfg .LFSObjectExists (p .Oid , p .Size ) {
452
455
continue
453
456
}
454
457
455
- missing = append (missing , p )
458
+ pointersToFetch = append (pointersToFetch , p )
456
459
meter .Add (p .Size )
457
460
}
458
461
459
- return missing , meter
462
+ return pointersToFetch , meter
460
463
}
461
464
462
465
func init () {
@@ -466,6 +469,7 @@ func init() {
466
469
cmd .Flags ().BoolVarP (& fetchRecentArg , "recent" , "r" , false , "Fetch recent refs & commits" )
467
470
cmd .Flags ().BoolVarP (& fetchAllArg , "all" , "a" , false , "Fetch all LFS files ever referenced" )
468
471
cmd .Flags ().BoolVarP (& fetchPruneArg , "prune" , "p" , false , "After fetching, prune old data" )
472
+ cmd .Flags ().BoolVar (& fetchRefetchArg , "refetch" , false , "Also fetch objects that are already present locally" )
469
473
cmd .Flags ().BoolVarP (& fetchDryRunArg , "dry-run" , "d" , false , "Do not fetch, only show what would be fetched" )
470
474
cmd .Flags ().BoolVarP (& fetchJsonArg , "json" , "j" , false , "Give the output in a stable JSON format for scripts" )
471
475
})
0 commit comments