diff --git a/aptly/interfaces.go b/aptly/interfaces.go index ddc017807..4761a5db6 100644 --- a/aptly/interfaces.go +++ b/aptly/interfaces.go @@ -109,6 +109,8 @@ type Progress interface { Printf(msg string, a ...interface{}) // ColoredPrintf does printf in colored way + newline ColoredPrintf(msg string, a ...interface{}) + // PrintfStdErr does printf but in safe manner to stderr + PrintfStdErr(msg string, a ...interface{}) } // Downloader is parallel HTTP fetcher diff --git a/console/progress.go b/console/progress.go index 4c13ab287..5a2baeb8a 100644 --- a/console/progress.go +++ b/console/progress.go @@ -2,6 +2,7 @@ package console import ( "fmt" + "os" "strings" "github.com/cheggaaa/pb" @@ -11,6 +12,7 @@ import ( const ( codePrint = iota + codePrintStdErr codeProgress codeHideProgress codeStop @@ -127,6 +129,11 @@ func (p *Progress) Printf(msg string, a ...interface{}) { p.queue <- printTask{code: codePrint, message: fmt.Sprintf(msg, a...)} } +// PrintfStdErr does printf but in safe manner to stderr +func (p *Progress) PrintfStdErr(msg string, a ...interface{}) { + p.queue <- printTask{code: codePrintStdErr, message: fmt.Sprintf(msg, a...)} +} + // ColoredPrintf does printf in colored way + newline func (p *Progress) ColoredPrintf(msg string, a ...interface{}) { if RunningOnTerminal() { @@ -182,6 +189,12 @@ func (p *Progress) worker() { p.barShown = false } fmt.Print(task.message) + case codePrintStdErr: + if p.barShown { + fmt.Print("\r\033[2K") + p.barShown = false + } + fmt.Fprint(os.Stderr, task.message) case codeProgress: if hasBar { fmt.Print("\r" + task.message) diff --git a/context/context.go b/context/context.go index 180e56292..3adeabe33 100644 --- a/context/context.go +++ b/context/context.go @@ -262,7 +262,7 @@ func (context *AptlyContext) _database() (database.Storage, error) { delay = time.Second } - context._progress().Printf("Unable to open database, sleeping %s, attempts left %d...\n", delay, tries) + context._progress().PrintfStdErr("Unable to open database, sleeping %s, attempts left %d...\n", delay, tries) time.Sleep(delay) } }