git-lfs/pointer/smudge.go

82 lines
1.5 KiB
Go

package pointer
import (
"errors"
"github.com/github/git-media/gitmedia"
"github.com/github/git-media/gitmediaclient"
"io"
"os"
)
func Smudge(writer io.Writer, oid string) error {
mediafile, err := gitmedia.LocalMediaPath(oid)
if err != nil {
return err
}
if stat, statErr := os.Stat(mediafile); statErr != nil || stat == nil {
err = downloadFile(writer, oid, mediafile)
} else {
err = readLocalFile(writer, mediafile)
}
if err != nil {
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 errors.New("client: " + err.Error())
}
defer reader.Close()
mediaWriter, err := newFile(mediafile, oid)
if err != nil {
return errors.New("open: " + err.Error())
}
_, copyErr := io.Copy(mediaWriter, reader)
closeErr := mediaWriter.Close()
if copyErr != nil {
return errors.New("write: " + copyErr.Error())
}
if closeErr != nil {
return errors.New("close: " + closeErr.Error())
}
file, err := os.Open(mediaWriter.Path)
if err != nil {
return err
}
_, err = io.Copy(writer, file)
return err
}
func readLocalFile(writer io.Writer, mediafile string) error {
reader, err := os.Open(mediafile)
if err != nil {
return err
}
defer reader.Close()
_, err = io.Copy(writer, reader)
return err
}
type SmudgeError struct {
Oid string
Filename string
ErrorMessage string
}
func (e *SmudgeError) Error() string {
return e.ErrorMessage
}