don't re-write the large asset file if it exists

This commit is contained in:
risk danger olson 2013-09-27 10:58:49 -06:00 committed by Rick Olson
parent f82779320d
commit c22d346831

@ -25,14 +25,55 @@ func main() {
written, _ := io.Copy(writer, os.Stdin)
sha := hex.EncodeToString(sha1Hash.Sum(nil))
meta := &gitmedia.LargeAsset{
asset := &gitmedia.LargeAsset{
MediaType: "application/vnd.github.large-asset",
Size: written,
MD5: hex.EncodeToString(md5Hash.Sum(nil)),
SHA1: sha,
}
mediafile := gitmedia.LocalMediaPath(sha)
output := ChooseWriter(asset, tmp)
defer output.Close()
output.Write([]byte(fmt.Sprintf("# %d\n", len(gitmedia.MediaWarning))))
output.Write(gitmedia.MediaWarning)
enc := json.NewEncoder(output)
enc.Encode(asset)
}
func ChooseWriter(asset *gitmedia.LargeAsset, tmp *os.File) io.WriteCloser {
mediafile := gitmedia.LocalMediaPath(asset.SHA1)
if stat, _ := os.Stat(mediafile); stat == nil {
return NewGitMediaCleanWriter(asset, tmp)
} else {
return NewGitMediaExistingWriter(asset, tmp)
}
}
type GitMediaExistingWriter struct {
tempfile *os.File
writer io.Writer
}
func NewGitMediaExistingWriter(asset *gitmedia.LargeAsset, tmp *os.File) io.WriteCloser {
return &GitMediaExistingWriter{tmp, os.Stdout}
}
func (w *GitMediaExistingWriter) Write(buf []byte) (int, error) {
return w.writer.Write(buf)
}
func (w *GitMediaExistingWriter) Close() error {
return os.Remove(w.tempfile.Name())
}
type GitMediaCleanWriter struct {
metafile *os.File
*GitMediaExistingWriter
}
func NewGitMediaCleanWriter(asset *gitmedia.LargeAsset, tmp *os.File) io.WriteCloser {
mediafile := gitmedia.LocalMediaPath(asset.SHA1)
metafile := mediafile + ".json"
if err := os.Rename(tmp.Name(), mediafile); err != nil {
@ -46,12 +87,17 @@ func main() {
panic(err)
}
defer file.Close()
defer func() { os.Remove(tmp.Name()) }()
writer = io.MultiWriter(os.Stdout, file)
writer.Write([]byte(fmt.Sprintf("# %d\n", len(gitmedia.MediaWarning))))
writer.Write(gitmedia.MediaWarning)
enc := json.NewEncoder(writer)
enc.Encode(meta)
return &GitMediaCleanWriter{
metafile: file,
GitMediaExistingWriter: &GitMediaExistingWriter{tmp, io.MultiWriter(os.Stdout, file)},
}
}
func (w *GitMediaCleanWriter) Write(buf []byte) (int, error) {
return w.writer.Write(buf)
}
func (w *GitMediaCleanWriter) Close() error {
w.GitMediaExistingWriter.Close()
return w.metafile.Close()
}