func scanAll() []*lfs.WrappedPointer { // converts to `git rev-list --all` // We only pick up objects in real commits and not the reflog opts := lfs.NewScanRefsOptions() opts.ScanMode = lfs.ScanAllMode opts.SkipDeletedBlobs = false // This could be a long process so use the chan version & report progress Print("Scanning for all objects ever referenced...") spinner := lfs.NewSpinner() var numObjs int64 pointerchan, err := lfs.ScanRefsToChan("", "", opts) if err != nil { Panic(err, "Could not scan for Git LFS files") } pointers := make([]*lfs.WrappedPointer, 0) for p := range pointerchan { numObjs++ spinner.Print(OutputWriter, fmt.Sprintf("%d objects found", numObjs)) pointers = append(pointers, p) } spinner.Finish(OutputWriter, fmt.Sprintf("%d objects found", numObjs)) return pointers }
// Background task, must call waitg.Done() once at end func pruneTaskGetRetainedAtRef(ref string, retainChan chan string, errorChan chan error, waitg *sync.WaitGroup) { defer waitg.Done() // Only files AT ref, recent is checked in pruneTaskGetRetainedRecentRefs opts := lfs.NewScanRefsOptions() opts.ScanMode = lfs.ScanRefsMode opts.SkipDeletedBlobs = true refchan, err := lfs.ScanRefsToChan(ref, "", opts) if err != nil { errorChan <- err return } for wp := range refchan { retainChan <- wp.Pointer.Oid tracerx.Printf("RETAIN: %v via ref %v", wp.Pointer.Oid, ref) } }
// Background task, must call waitg.Done() once at end func pruneTaskGetReachableObjects(outObjectSet *lfs.StringSet, errorChan chan error, waitg *sync.WaitGroup) { defer waitg.Done() // converts to `git rev-list --all` // We only pick up objects in real commits and not the reflog opts := lfs.NewScanRefsOptions() opts.ScanMode = lfs.ScanAllMode opts.SkipDeletedBlobs = false pointerchan, err := lfs.ScanRefsToChan("", "", opts) if err != nil { errorChan <- fmt.Errorf("Error scanning for reachable objects: %v", err) return } for p := range pointerchan { outObjectSet.Add(p.Oid) } }