git-lfs/filters/smudge.go

60 lines
1.3 KiB
Go
Raw Normal View History

package filters
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
)
func Smudge(writer io.Writer, sha string) error {
2013-10-04 15:22:32 +00:00
mediafile := gitmedia.LocalMediaPath(sha)
if stat, err := os.Stat(mediafile); err != nil || stat == nil {
reader, err := gitmediaclient.Get(mediafile)
if err != nil {
return &SmudgeError{sha, mediafile, err.Error()}
}
defer reader.Close()
mediaWriter, err := os.Create(mediafile)
if err != nil {
return &SmudgeError{sha, mediafile, err.Error()}
}
defer mediaWriter.Close()
if err := copyFile(reader, writer, mediaWriter); err != nil {
return &SmudgeError{sha, mediafile, err.Error()}
}
} else {
reader, err := os.Open(mediafile)
if err != nil {
return &SmudgeError{sha, mediafile, err.Error()}
}
defer reader.Close()
if err := copyFile(reader, writer); err != nil {
return &SmudgeError{sha, mediafile, err.Error()}
}
}
return nil
}
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 {
Sha string
Filename string
ErrorMessage string
}
func (e *SmudgeError) Error() string {
return e.ErrorMessage
}