implement a copy callback for pushing files

This commit is contained in:
Rick Olson 2014-08-07 11:37:04 -06:00
parent d7a787dab8
commit defae1cef6
3 changed files with 27 additions and 11 deletions

@ -53,7 +53,15 @@ func pushAsset(oid, filename string) *wrappedError {
}
if err == nil {
err = gitmediaclient.Put(path, filename, nil)
cb, file, cbErr := gitmedia.CopyCallbackFile("push", filename)
if cbErr != nil {
Error(cbErr.Error())
}
err = gitmediaclient.Put(path, filename, cb)
if file != nil {
file.Close()
}
}
if err != nil {

@ -51,12 +51,12 @@ func CopyCallbackFile(event, filename string) (CopyCallback, *os.File, error) {
cbDir := filepath.Dir(cbFilename)
if err := os.MkdirAll(cbDir, 0755); err != nil {
return nil, nil, wrapProgressError(err, cbFilename)
return nil, nil, wrapProgressError(err, event, cbFilename)
}
file, err := os.OpenFile(cbFilename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
return nil, file, wrapProgressError(err, cbFilename)
return nil, file, wrapProgressError(err, event, cbFilename)
}
var prevProgress int
@ -71,7 +71,7 @@ func CopyCallbackFile(event, filename string) (CopyCallback, *os.File, error) {
if progress != prevProgress {
_, err := file.Write([]byte(fmt.Sprintf("%s %d %s\n", event, progress, filename)))
prevProgress = progress
return wrapProgressError(err, cbFilename)
return wrapProgressError(err, event, cbFilename)
}
return nil
@ -81,10 +81,10 @@ func CopyCallbackFile(event, filename string) (CopyCallback, *os.File, error) {
return cb, file, nil
}
func wrapProgressError(err error, filename string) error {
func wrapProgressError(err error, event, filename string) error {
if err == nil {
return nil
}
return fmt.Errorf("Error writing Git Media progress to %s: %s", filename, err.Error())
return fmt.Errorf("Error writing Git Media %s progress to %s: %s", event, filename, err.Error())
}

@ -48,12 +48,13 @@ func Put(filehash, filename string, cb gitmedia.CopyCallback) error {
}
oid := filepath.Base(filehash)
stat, err := os.Stat(filehash)
file, err := os.Open(filehash)
if err != nil {
return err
}
defer file.Close()
file, err := os.Open(filehash)
stat, err := file.Stat()
if err != nil {
return err
}
@ -63,14 +64,21 @@ func Put(filehash, filename string, cb gitmedia.CopyCallback) error {
return err
}
bar := pb.StartNew(int(stat.Size()))
fileSize := stat.Size()
reader := &gitmedia.CallbackReader{
C: cb,
TotalSize: fileSize,
Reader: file,
}
bar := pb.StartNew(int(fileSize))
bar.SetUnits(pb.U_BYTES)
bar.Start()
req.Header.Set("Content-Type", gitMediaType)
req.Header.Set("Accept", gitMediaMetaType)
req.Body = ioutil.NopCloser(bar.NewProxyReader(file))
req.ContentLength = stat.Size()
req.Body = ioutil.NopCloser(bar.NewProxyReader(reader))
req.ContentLength = fileSize
fmt.Printf("Sending %s\n", filename)