commands/prune: log progress to os.Stdout

This commit is contained in:
Taylor Blau 2017-11-16 08:38:11 -08:00
parent d8c18d8092
commit df732acf64

@ -9,6 +9,7 @@ import (
"github.com/git-lfs/git-lfs/fs" "github.com/git-lfs/git-lfs/fs"
"github.com/git-lfs/git-lfs/git" "github.com/git-lfs/git-lfs/git"
"github.com/git-lfs/git-lfs/git/githistory/log"
"github.com/git-lfs/git-lfs/lfs" "github.com/git-lfs/git-lfs/lfs"
"github.com/git-lfs/git-lfs/progress" "github.com/git-lfs/git-lfs/progress"
"github.com/git-lfs/git-lfs/tools" "github.com/git-lfs/git-lfs/tools"
@ -55,6 +56,11 @@ type PruneProgressChan chan PruneProgress
func prune(fetchPruneConfig lfs.FetchPruneConfig, verifyRemote, dryRun, verbose bool) { func prune(fetchPruneConfig lfs.FetchPruneConfig, verifyRemote, dryRun, verbose bool) {
localObjects := make([]fs.Object, 0, 100) localObjects := make([]fs.Object, 0, 100)
retainedObjects := tools.NewStringSetWithCapacity(100) retainedObjects := tools.NewStringSetWithCapacity(100)
logger := log.NewLogger(OutputWriter)
spinner := progress.NewSpinner()
logger.Enqueue(spinner)
var reachableObjects tools.StringSet var reachableObjects tools.StringSet
var taskwait sync.WaitGroup var taskwait sync.WaitGroup
@ -98,7 +104,7 @@ func prune(fetchPruneConfig lfs.FetchPruneConfig, verifyRemote, dryRun, verbose
// Report progress // Report progress
var progresswait sync.WaitGroup var progresswait sync.WaitGroup
progresswait.Add(1) progresswait.Add(1)
go pruneTaskDisplayProgress(progressChan, &progresswait) go pruneTaskDisplayProgress(progressChan, &progresswait, spinner)
taskwait.Wait() // wait for subtasks taskwait.Wait() // wait for subtasks
gitscanner.Close() gitscanner.Close()
@ -183,7 +189,13 @@ func prune(fetchPruneConfig lfs.FetchPruneConfig, verifyRemote, dryRun, verbose
if verbose { if verbose {
Print(verboseOutput.String()) Print(verboseOutput.String())
} }
pruneDeleteFiles(prunableObjects)
// Since the above progress will have completed, create and
// enqueue a _new_ spinner to track deletion progress.
spinner := progress.NewSpinner()
logger.Enqueue(spinner)
pruneDeleteFiles(prunableObjects, spinner)
} }
} }
@ -220,10 +232,9 @@ func pruneCheckErrors(taskErrors []error) {
} }
} }
func pruneTaskDisplayProgress(progressChan PruneProgressChan, waitg *sync.WaitGroup) { func pruneTaskDisplayProgress(progressChan PruneProgressChan, waitg *sync.WaitGroup, spinner *progress.Spinner) {
defer waitg.Done() defer waitg.Done()
spinner := progress.NewSpinner()
localCount := 0 localCount := 0
retainCount := 0 retainCount := 0
verifyCount := 0 verifyCount := 0
@ -241,9 +252,9 @@ func pruneTaskDisplayProgress(progressChan PruneProgressChan, waitg *sync.WaitGr
if verifyCount > 0 { if verifyCount > 0 {
msg += fmt.Sprintf(", %d verified with remote", verifyCount) msg += fmt.Sprintf(", %d verified with remote", verifyCount)
} }
spinner.Print(OutputWriter, msg) spinner.Spinf(msg)
} }
spinner.Finish(OutputWriter, msg) spinner.Finish(msg)
} }
func pruneTaskCollectRetained(outRetainedObjects *tools.StringSet, retainChan chan string, func pruneTaskCollectRetained(outRetainedObjects *tools.StringSet, retainChan chan string,
@ -267,13 +278,12 @@ func pruneTaskCollectErrors(outtaskErrors *[]error, errorChan chan error, errorw
} }
} }
func pruneDeleteFiles(prunableObjects []string) { func pruneDeleteFiles(prunableObjects []string, spinner *progress.Spinner) {
spinner := progress.NewSpinner()
var problems bytes.Buffer var problems bytes.Buffer
// In case we fail to delete some // In case we fail to delete some
var deletedFiles int var deletedFiles int
for i, oid := range prunableObjects { for i, oid := range prunableObjects {
spinner.Print(OutputWriter, fmt.Sprintf("Deleting object %d/%d", i, len(prunableObjects))) spinner.Spinf("Deleting object %d/%d", i, len(prunableObjects))
mediaFile, err := cfg.Filesystem().ObjectPath(oid) mediaFile, err := cfg.Filesystem().ObjectPath(oid)
if err != nil { if err != nil {
problems.WriteString(fmt.Sprintf("Unable to find media path for %v: %v\n", oid, err)) problems.WriteString(fmt.Sprintf("Unable to find media path for %v: %v\n", oid, err))
@ -286,7 +296,7 @@ func pruneDeleteFiles(prunableObjects []string) {
} }
deletedFiles++ deletedFiles++
} }
spinner.Finish(OutputWriter, fmt.Sprintf("Deleted %d files", deletedFiles)) spinner.Finish("Deleted %d files", deletedFiles)
if problems.Len() > 0 { if problems.Len() > 0 {
LoggedError(fmt.Errorf("Failed to delete some files"), problems.String()) LoggedError(fmt.Errorf("Failed to delete some files"), problems.String())
Exit("Prune failed, see errors above") Exit("Prune failed, see errors above")