19
19
fetchRecentArg bool
20
20
fetchAllArg bool
21
21
fetchPruneArg bool
22
+ fetchDryRunArg bool
22
23
)
23
24
24
25
func getIncludeExcludeArgs (cmd * cobra.Command ) (include , exclude * string ) {
@@ -106,7 +107,7 @@ func fetchCommand(cmd *cobra.Command, args []string) {
106
107
verifyUnreachable := fetchPruneCfg .PruneVerifyUnreachableAlways
107
108
108
109
// assume false for non available options in fetch
109
- prune (fetchPruneCfg , verify , verifyUnreachable , false , false , false )
110
+ prune (fetchPruneCfg , verify , verifyUnreachable , false , fetchDryRunArg , fetchDryRunArg )
110
111
}
111
112
112
113
if ! success {
@@ -147,7 +148,7 @@ func fetchRef(ref string, filter *filepathfilter.Filter) bool {
147
148
if err != nil {
148
149
Panic (err , tr .Tr .Get ("Could not scan for Git LFS files" ))
149
150
}
150
- return fetchAndReportToChan (pointers , filter , nil )
151
+ return fetch (pointers )
151
152
}
152
153
153
154
func pointersToFetchForRefs (refs []string ) ([]* lfs.WrappedPointer , error ) {
@@ -189,7 +190,7 @@ func fetchRefs(refs []string) bool {
189
190
if err != nil {
190
191
Panic (err , tr .Tr .Get ("Could not scan for Git LFS files" ))
191
192
}
192
- return fetchAndReportToChan (pointers , nil , nil )
193
+ return fetch (pointers )
193
194
}
194
195
195
196
// Fetch all previous versions of objects from since to ref (not including final state at ref)
@@ -212,7 +213,7 @@ func fetchPreviousVersions(ref string, since time.Time, filter *filepathfilter.F
212
213
ExitWithError (err )
213
214
}
214
215
215
- return fetchAndReportToChan (pointers , filter , nil )
216
+ return fetch (pointers )
216
217
}
217
218
218
219
// Fetch recent objects based on config
@@ -282,7 +283,7 @@ func fetchRecent(fetchconf lfs.FetchPruneConfig, alreadyFetchedRefs []*git.Ref,
282
283
func fetchAll () bool {
283
284
pointers := scanAll ()
284
285
Print ("fetch: %s" , tr .Tr .Get ("Fetching all references..." ))
285
- return fetchAndReportToChan (pointers , nil , nil )
286
+ return fetch (pointers )
286
287
}
287
288
288
289
func scanAll () []* lfs.WrappedPointer {
@@ -323,44 +324,23 @@ func scanAll() []*lfs.WrappedPointer {
323
324
return pointers
324
325
}
325
326
326
- // Fetch and report completion of each OID to a channel (optional, pass nil to skip)
327
+ func printTransfers (out <- chan * tq.Transfer ) {
328
+ for p := range out {
329
+ Print ("%s %s => %s" , tr .Tr .Get ("fetch" ), p .Oid , p .Name )
330
+ }
331
+ }
332
+
333
+ // Fetch
327
334
// Returns true if all completed with no errors, false if errors were written to stderr/log
328
- func fetchAndReportToChan (allpointers []* lfs. WrappedPointer , filter * filepathfilter. Filter , out chan <- * lfs.WrappedPointer ) bool {
329
- ready , pointers , meter := readyAndMissingPointers (allpointers , filter )
335
+ func fetch (allpointers []* lfs.WrappedPointer ) bool {
336
+ pointers , meter := missingPointers (allpointers )
330
337
q := newDownloadQueue (
331
338
getTransferManifestOperationRemote ("download" , cfg .Remote ()),
332
- cfg .Remote (), tq .WithProgress (meter ),
339
+ cfg .Remote (), tq .WithProgress (meter ), tq . DryRun ( fetchDryRunArg ),
333
340
)
334
341
335
- if out != nil {
336
- // If we already have it, or it won't be fetched
337
- // report it to chan immediately to support pull/checkout
338
- for _ , p := range ready {
339
- out <- p
340
- }
341
-
342
- dlwatch := q .Watch ()
343
-
344
- go func () {
345
- // fetch only reports single OID, but OID *might* be referenced by multiple
346
- // WrappedPointers if same content is at multiple paths, so map oid->slice
347
- oidToPointers := make (map [string ][]* lfs.WrappedPointer , len (pointers ))
348
- for _ , pointer := range pointers {
349
- plist := oidToPointers [pointer .Oid ]
350
- oidToPointers [pointer .Oid ] = append (plist , pointer )
351
- }
352
-
353
- for t := range dlwatch {
354
- plist , ok := oidToPointers [t .Oid ]
355
- if ! ok {
356
- continue
357
- }
358
- for _ , p := range plist {
359
- out <- p
360
- }
361
- }
362
- close (out )
363
- }()
342
+ if fetchDryRunArg {
343
+ go printTransfers (q .Watch ())
364
344
}
365
345
366
346
for _ , p := range pointers {
@@ -381,37 +361,27 @@ func fetchAndReportToChan(allpointers []*lfs.WrappedPointer, filter *filepathfil
381
361
return ok
382
362
}
383
363
384
- func readyAndMissingPointers (allpointers []* lfs.WrappedPointer , filter * filepathfilter. Filter ) ([] * lfs. WrappedPointer , []* lfs.WrappedPointer , * tq.Meter ) {
364
+ func missingPointers (allpointers []* lfs.WrappedPointer ) ([]* lfs.WrappedPointer , * tq.Meter ) {
385
365
logger := tasklog .NewLogger (os .Stdout ,
386
366
tasklog .ForceProgress (cfg .ForceProgress ()),
387
367
)
388
- meter := buildProgressMeter (false , tq .Download )
368
+ meter := buildProgressMeter (fetchDryRunArg , tq .Download )
389
369
logger .Enqueue (meter )
390
370
391
- seen := make (map [string ]bool , len (allpointers ))
392
371
missing := make ([]* lfs.WrappedPointer , 0 , len (allpointers ))
393
- ready := make ([]* lfs.WrappedPointer , 0 , len (allpointers ))
394
372
395
373
for _ , p := range allpointers {
396
- // no need to download the same object multiple times
397
- if seen [p .Oid ] {
398
- continue
399
- }
400
-
401
- seen [p .Oid ] = true
402
-
403
374
// no need to download objects that exist locally already
404
375
lfs .LinkOrCopyFromReference (cfg , p .Oid , p .Size )
405
376
if cfg .LFSObjectExists (p .Oid , p .Size ) {
406
- ready = append (ready , p )
407
377
continue
408
378
}
409
379
410
380
missing = append (missing , p )
411
381
meter .Add (p .Size )
412
382
}
413
383
414
- return ready , missing , meter
384
+ return missing , meter
415
385
}
416
386
417
387
func init () {
@@ -421,5 +391,6 @@ func init() {
421
391
cmd .Flags ().BoolVarP (& fetchRecentArg , "recent" , "r" , false , "Fetch recent refs & commits" )
422
392
cmd .Flags ().BoolVarP (& fetchAllArg , "all" , "a" , false , "Fetch all LFS files ever referenced" )
423
393
cmd .Flags ().BoolVarP (& fetchPruneArg , "prune" , "p" , false , "After fetching, prune old data" )
394
+ cmd .Flags ().BoolVarP (& fetchDryRunArg , "dry-run" , "d" , false , "Do not fetch, only show what would be fetched" )
424
395
})
425
396
}
0 commit comments