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()
}()
logPath, _ := cfg.Os.Get("GIT_LFS_PROGRESS")
meter := progress.NewMeter(logPath)
meter := progress.NewMeter(progress.WithOSEnv(cfg.Os))
meter.Start()
var totalBytes int64
for _, pointer := range pointers {

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

@ -1,10 +1,6 @@
package progress
import (
"fmt"
"os"
"path/filepath"
)
import "os"
// progressLogger provides a wrapper around an os.File that can either
// write to the file or ignore all writes completely.
@ -37,27 +33,3 @@ func (l *progressLogger) Close() error {
func (l *progressLogger) Shutdown() {
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 (
"fmt"
"os"
"path/filepath"
"strings"
"sync"
"sync/atomic"
@ -32,20 +33,64 @@ type ProgressMeter struct {
DryRun bool
}
// NewMeter creates a new ProgressMeter.
func NewMeter(logPath string) *ProgressMeter {
logger, err := newProgressLogger(logPath)
if err != nil {
type env interface {
Get(key string) (val string, ok bool)
}
type MeterOption func(*ProgressMeter)
func WithLogFile(name string) MeterOption {
printErr := func(err string) {
fmt.Fprintf(os.Stderr, "Error creating progress logger: %s\n", err)
}
return &ProgressMeter{
logger: logger,
return func(m *ProgressMeter) {
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(),
fileIndex: make(map[string]int64),
fileIndexMutex: &sync.Mutex{},
finished: make(chan interface{}),
}
for _, opt := range options {
opt(m)
}
return m
}
func (p *ProgressMeter) Start() {

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