git-lfs/pointer/smudge.go

81 lines
1.4 KiB
Go
Raw Normal View History

package pointer
2013-10-04 15:22:32 +00:00
import (
"github.com/github/git-media/gitmedia"
"github.com/github/git-media/gitmediaclient"
2013-10-04 15:22:32 +00:00
"io"
"os"
2013-10-04 15:22:32 +00:00
)
2014-07-28 19:37:57 +00:00
func Smudge(writer io.Writer, oid string) error {
mediafile, err := gitmedia.LocalMediaPath(oid)
2014-06-05 19:05:02 +00:00
if err != nil {
return err
}
2013-10-04 15:22:32 +00:00
2014-07-28 23:11:39 +00:00
if stat, statErr := os.Stat(mediafile); statErr != nil || stat == nil {
err = downloadFile(writer, oid, mediafile)
} else {
err = readLocalFile(writer, mediafile)
}
if err != nil {
2014-07-28 19:37:57 +00:00
return &SmudgeError{oid, mediafile, err.Error()}
} else {
return nil
}
}
func downloadFile(writer io.Writer, oid, mediafile string) error {
reader, err := gitmediaclient.Get(mediafile)
if err != nil {
return err
}
defer reader.Close()
mediaWriter, err := newFile(mediafile, oid)
if err != nil {
return err
}
copyErr := copyFile(reader, writer, mediaWriter)
closeErr := mediaWriter.Close()
if copyErr != nil {
return copyErr
}
if closeErr != nil {
return closeErr
}
return nil
}
func readLocalFile(writer io.Writer, mediafile string) error {
reader, err := os.Open(mediafile)
if err != nil {
return err
}
defer reader.Close()
return copyFile(reader, writer)
}
func copyFile(reader io.ReadCloser, writers ...io.Writer) error {
multiWriter := io.MultiWriter(writers...)
2013-10-04 15:22:32 +00:00
_, err := io.Copy(multiWriter, reader)
return err
2013-10-04 15:22:32 +00:00
}
2013-10-22 18:09:06 +00:00
type SmudgeError struct {
2014-07-28 19:37:57 +00:00
Oid string
2013-10-22 18:09:06 +00:00
Filename string
ErrorMessage string
}
func (e *SmudgeError) Error() string {
return e.ErrorMessage
}