// newTransferQueue builds a TransferQueue, direction and underlying mechanism determined by adapter func newTransferQueue(files int, size int64, dryRun bool, dir transfer.Direction) *TransferQueue { logPath, _ := config.Config.Os.Get("GIT_LFS_PROGRESS") q := &TransferQueue{ direction: dir, dryRun: dryRun, meter: progress.NewProgressMeter(files, size, dryRun, logPath), apic: make(chan Transferable, batchSize), retriesc: make(chan Transferable, batchSize), errorc: make(chan error), oldApiWorkers: config.Config.ConcurrentTransfers(), transferables: make(map[string]Transferable), trMutex: &sync.Mutex{}, manifest: transfer.ConfigureManifest(transfer.NewManifest(), config.Config), retryCount: make(map[string]uint32), maxRetries: defaultMaxRetries, } q.errorwait.Add(1) q.retrywait.Add(1) q.run() return q }
func checkoutWithIncludeExclude(include []string, exclude []string) { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not checkout") } pointers, err := lfs.ScanTree(ref.Sha) if err != nil { Panic(err, "Could not scan for Git LFS files") } var wait sync.WaitGroup wait.Add(1) c := make(chan *lfs.WrappedPointer, 1) go func() { checkoutWithChan(c) wait.Done() }() // Count bytes for progress var totalBytes int64 for _, pointer := range pointers { totalBytes += pointer.Size } logPath, _ := cfg.Os.Get("GIT_LFS_PROGRESS") progress := progress.NewProgressMeter(len(pointers), totalBytes, false, logPath) progress.Start() totalBytes = 0 for _, pointer := range pointers { totalBytes += pointer.Size if lfs.FilenamePassesIncludeExcludeFilter(pointer.Name, include, exclude) { progress.Add(pointer.Name) c <- pointer // not strictly correct (parallel) but we don't have a callback & it's just local // plus only 1 slot in channel so it'll block & be close progress.TransferBytes("checkout", pointer.Name, pointer.Size, totalBytes, int(pointer.Size)) progress.FinishTransfer(pointer.Name) } else { progress.Skip(pointer.Size) } } close(c) wait.Wait() progress.Finish() }
// newTransferQueue builds a TransferQueue, direction and underlying mechanism determined by adapter func newTransferQueue(files int, size int64, dryRun bool, dir transfer.Direction) *TransferQueue { q := &TransferQueue{ direction: dir, dryRun: dryRun, meter: progress.NewProgressMeter(files, size, dryRun, config.Config.Getenv("GIT_LFS_PROGRESS")), apic: make(chan Transferable, batchSize), retriesc: make(chan Transferable, batchSize), errorc: make(chan error), oldApiWorkers: config.Config.ConcurrentTransfers(), transferables: make(map[string]Transferable), trMutex: &sync.Mutex{}, } q.errorwait.Add(1) q.retrywait.Add(1) q.run() return q }