Add options pattern to progress.NewMeter()
This commit is contained in:
parent
46adf24004
commit
e9686f1c38
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user