git-lfs/pointer/smudge.go

89 lines
2.0 KiB
Go
Raw Normal View History

package pointer
2013-10-04 15:22:32 +00:00
import (
2015-03-22 16:01:26 +00:00
"fmt"
"github.com/cheggaaa/pb"
2015-03-19 19:30:55 +00:00
"github.com/github/git-lfs/lfs"
"github.com/technoweenie/go-contentaddressable"
2013-10-04 15:22:32 +00:00
"io"
"os"
2015-03-20 17:30:24 +00:00
"path/filepath"
2013-10-04 15:22:32 +00:00
)
2015-03-22 16:01:26 +00:00
func Smudge(writer io.Writer, ptr *Pointer, workingfile string, cb lfs.CopyCallback) error {
2015-03-19 19:30:55 +00:00
mediafile, err := lfs.LocalMediaPath(ptr.Oid)
2014-06-05 19:05:02 +00:00
if err != nil {
return err
}
2013-10-04 15:22:32 +00:00
2015-03-19 19:30:55 +00:00
var wErr *lfs.WrappedError
2014-07-28 23:11:39 +00:00
if stat, statErr := os.Stat(mediafile); statErr != nil || stat == nil {
2015-03-22 16:01:26 +00:00
wErr = downloadFile(writer, ptr, workingfile, mediafile, cb)
} else {
2014-08-08 16:51:47 +00:00
wErr = readLocalFile(writer, ptr, mediafile, cb)
}
2014-08-08 16:51:47 +00:00
if wErr != nil {
return &SmudgeError{ptr.Oid, mediafile, wErr}
} else {
return nil
}
}
2015-03-22 16:01:26 +00:00
func downloadFile(writer io.Writer, ptr *Pointer, workingfile, mediafile string, cb lfs.CopyCallback) *lfs.WrappedError {
fmt.Fprintf(os.Stderr, "Downloading %s (%s)\n", workingfile, pb.FormatBytes(ptr.Size))
2015-03-20 17:30:24 +00:00
reader, size, wErr := lfs.Download(filepath.Base(mediafile))
2014-08-08 17:31:33 +00:00
if reader != nil {
defer reader.Close()
}
if wErr != nil {
2014-08-08 16:51:47 +00:00
wErr.Errorf("Error downloading %s.", mediafile)
return wErr
}
if ptr.Size == 0 {
ptr.Size = size
}
mediaFile, err := contentaddressable.NewFile(mediafile)
if err != nil {
2015-03-19 19:30:55 +00:00
return lfs.Errorf(err, "Error opening media file buffer.")
}
2015-03-19 19:30:55 +00:00
_, err = lfs.CopyWithCallback(mediaFile, reader, ptr.Size, cb)
if err == nil {
err = mediaFile.Accept()
}
2014-08-21 20:36:39 +00:00
mediaFile.Close()
if err != nil {
2015-03-19 19:30:55 +00:00
return lfs.Errorf(err, "Error buffering media file.")
}
return readLocalFile(writer, ptr, mediafile, nil)
}
2015-03-19 19:30:55 +00:00
func readLocalFile(writer io.Writer, ptr *Pointer, mediafile string, cb lfs.CopyCallback) *lfs.WrappedError {
reader, err := os.Open(mediafile)
if err != nil {
2015-03-19 19:30:55 +00:00
return lfs.Errorf(err, "Error opening media file.")
}
defer reader.Close()
if ptr.Size == 0 {
if stat, _ := os.Stat(mediafile); stat != nil {
ptr.Size = stat.Size()
}
}
2015-03-19 19:30:55 +00:00
_, err = lfs.CopyWithCallback(writer, reader, ptr.Size, cb)
return lfs.Errorf(err, "Error reading from media file.")
2013-10-04 15:22:32 +00:00
}
2013-10-22 18:09:06 +00:00
type SmudgeError struct {
2014-08-08 16:51:47 +00:00
Oid string
Filename string
2015-03-19 19:30:55 +00:00
*lfs.WrappedError
2013-10-22 18:09:06 +00:00
}