func lsFilesCommand(cmd *cobra.Command, args []string) { requireInRepo() var ref string var err error if len(args) == 1 { ref = args[0] } else { fullref, err := git.CurrentRef() if err != nil { Exit(err.Error()) } ref = fullref.Sha } showOidLen := 10 if longOIDs { showOidLen = 64 } files, err := lfs.ScanTree(ref) if err != nil { Panic(err, "Could not scan for Git LFS tree: %s", err) } for _, p := range files { Print("%s %s %s", p.Oid[0:showOidLen], lsFilesMarker(p), p.Name) } }
func checkoutWithIncludeExclude(include []string, exclude []string) { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not checkout") } pointers, err := lfs.ScanTree(ref) if err != nil { Panic(err, "Could not scan for Git LFS files") } var wait sync.WaitGroup wait.Add(1) c := make(chan *lfs.WrappedPointer) go func() { checkoutWithChan(c) wait.Done() }() for _, pointer := range pointers { if lfs.FilenamePassesIncludeExcludeFilter(pointer.Name, include, exclude) { c <- pointer } } close(c) wait.Wait() }
func pointersToFetchForRef(ref string) ([]*lfs.WrappedPointer, error) { // Use SkipDeletedBlobs to avoid fetching ALL previous versions of modified files opts := lfs.NewScanRefsOptions() opts.ScanMode = lfs.ScanRefsMode opts.SkipDeletedBlobs = true return lfs.ScanTree(ref) }
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() }
func checkoutFromFetchChan(include []string, exclude []string, in chan *lfs.WrappedPointer) { ref, err := git.CurrentRef() if err != nil { Panic(err, "Could not checkout") } // Need to ScanTree to identify multiple files with the same content (fetch will only report oids once) pointers, err := lfs.ScanTree(ref.Sha) if err != nil { Panic(err, "Could not scan for Git LFS files") } // Map oid to multiple pointers mapping := make(map[string][]*lfs.WrappedPointer) for _, pointer := range pointers { if lfs.FilenamePassesIncludeExcludeFilter(pointer.Name, include, exclude) { mapping[pointer.Oid] = append(mapping[pointer.Oid], pointer) } } // Launch git update-index c := make(chan *lfs.WrappedPointer) var wait sync.WaitGroup wait.Add(1) go func() { checkoutWithChan(c) wait.Done() }() // Feed it from in, which comes from fetch for p := range in { // Add all of the files for this oid for _, fp := range mapping[p.Oid] { c <- fp } } close(c) wait.Wait() }