Add options pattern to progress.NewMeter()

This commit is contained in:
risk danger olson 2016-12-07 09:27:51 -07:00
parent 46adf24004
commit e9686f1c38
5 changed files with 55 additions and 41 deletions

@ -127,8 +127,7 @@ func checkoutWithIncludeExclude(filter *filepathfilter.Filter) {
wait.Done() wait.Done()
}() }()
logPath, _ := cfg.Os.Get("GIT_LFS_PROGRESS") meter := progress.NewMeter(progress.WithOSEnv(cfg.Os))
meter := progress.NewMeter(logPath)
meter.Start() meter.Start()
var totalBytes int64 var totalBytes int64
for _, pointer := range pointers { for _, pointer := range pointers {

@ -262,8 +262,7 @@ func determineIncludeExcludePaths(config *config.Configuration, includeArg, excl
} }
func buildProgressMeter() *progress.ProgressMeter { func buildProgressMeter() *progress.ProgressMeter {
logPath, _ := cfg.Os.Get("GIT_LFS_PROGRESS") return progress.NewMeter(progress.WithOSEnv(cfg.Os))
return progress.NewMeter(logPath)
} }
// isCommandEnabled returns whether the environment variable GITLFS<CMD>ENABLED // isCommandEnabled returns whether the environment variable GITLFS<CMD>ENABLED

@ -1,10 +1,6 @@
package progress package progress
import ( import "os"
"fmt"
"os"
"path/filepath"
)
// progressLogger provides a wrapper around an os.File that can either // progressLogger provides a wrapper around an os.File that can either
// write to the file or ignore all writes completely. // write to the file or ignore all writes completely.
@ -37,27 +33,3 @@ func (l *progressLogger) Close() error {
func (l *progressLogger) Shutdown() { func (l *progressLogger) Shutdown() {
l.writeData = false l.writeData = false
} }
// newProgressLogger creates a progressLogger with a log file path.
// If a log file is able to be created, the logger will write to the file. If
// there is an err creating the file, the logger will ignore all writes.
func newProgressLogger(logPath string) (*progressLogger, error) {
if len(logPath) == 0 {
return &progressLogger{}, nil
}
if !filepath.IsAbs(logPath) {
return &progressLogger{}, fmt.Errorf("GIT_LFS_PROGRESS must be an absolute path")
}
cbDir := filepath.Dir(logPath)
if err := os.MkdirAll(cbDir, 0755); err != nil {
return &progressLogger{}, err
}
file, err := os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
return &progressLogger{}, err
}
return &progressLogger{true, file}, nil
}

@ -3,6 +3,7 @@ package progress
import ( import (
"fmt" "fmt"
"os" "os"
"path/filepath"
"strings" "strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -32,20 +33,64 @@ type ProgressMeter struct {
DryRun bool DryRun bool
} }
// NewMeter creates a new ProgressMeter. type env interface {
func NewMeter(logPath string) *ProgressMeter { Get(key string) (val string, ok bool)
logger, err := newProgressLogger(logPath) }
if err != nil {
type MeterOption func(*ProgressMeter)
func WithLogFile(name string) MeterOption {
printErr := func(err string) {
fmt.Fprintf(os.Stderr, "Error creating progress logger: %s\n", err) fmt.Fprintf(os.Stderr, "Error creating progress logger: %s\n", err)
} }
return &ProgressMeter{ return func(m *ProgressMeter) {
logger: logger, if len(name) == 0 {
return
}
if !filepath.IsAbs(name) {
printErr("GIT_LFS_PROGRESS must be an absolute path")
return
}
cbDir := filepath.Dir(name)
if err := os.MkdirAll(cbDir, 0755); err != nil {
printErr(err.Error())
return
}
file, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
printErr(err.Error())
return
}
m.logger.writeData = true
m.logger.log = file
}
}
func WithOSEnv(os env) MeterOption {
name, _ := os.Get("GIT_LFS_PROGRESS")
return WithLogFile(name)
}
// NewMeter creates a new ProgressMeter.
func NewMeter(options ...MeterOption) *ProgressMeter {
m := &ProgressMeter{
logger: &progressLogger{},
startTime: time.Now(), startTime: time.Now(),
fileIndex: make(map[string]int64), fileIndex: make(map[string]int64),
fileIndexMutex: &sync.Mutex{}, fileIndexMutex: &sync.Mutex{},
finished: make(chan interface{}), finished: make(chan interface{}),
} }
for _, opt := range options {
opt(m)
}
return m
} }
func (p *ProgressMeter) Start() { func (p *ProgressMeter) Start() {

@ -138,8 +138,7 @@ func buildTestData() (oidsExist, oidsMissing []TestObject, err error) {
const oidCount = 50 const oidCount = 50
oidsExist = make([]TestObject, 0, oidCount) oidsExist = make([]TestObject, 0, oidCount)
oidsMissing = make([]TestObject, 0, oidCount) oidsMissing = make([]TestObject, 0, oidCount)
logPath, _ := config.Config.Os.Get("GIT_LFS_PROGRESS") meter := progress.NewMeter(progress.WithOSEnv(config.Config.Os))
meter := progress.NewMeter(logPath)
// Build test data for existing files & upload // Build test data for existing files & upload
// Use test repo for this to simplify the process of making sure data matches oid // Use test repo for this to simplify the process of making sure data matches oid