2014-07-28 19:26:10 +00:00
|
|
|
package pointer
|
2013-10-04 14:56:56 +00:00
|
|
|
|
|
|
|
import (
|
2015-04-28 21:37:17 +00:00
|
|
|
"bytes"
|
2013-10-24 16:55:46 +00:00
|
|
|
"crypto/sha256"
|
2013-10-04 14:56:56 +00:00
|
|
|
"encoding/hex"
|
2015-03-19 19:30:55 +00:00
|
|
|
"github.com/github/git-lfs/lfs"
|
2013-10-04 14:56:56 +00:00
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
2014-07-28 19:28:05 +00:00
|
|
|
type cleanedAsset struct {
|
2013-10-04 14:56:56 +00:00
|
|
|
File *os.File
|
|
|
|
mediafilepath string
|
2014-07-28 19:26:10 +00:00
|
|
|
*Pointer
|
2013-10-04 14:56:56 +00:00
|
|
|
}
|
|
|
|
|
2015-04-28 21:37:17 +00:00
|
|
|
type CleanedPointerError struct {
|
|
|
|
Bytes []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *CleanedPointerError) Error() string {
|
|
|
|
return "Cannot clean a Git LFS pointer. Skipping."
|
|
|
|
}
|
|
|
|
|
2015-03-19 19:30:55 +00:00
|
|
|
func Clean(reader io.Reader, size int64, cb lfs.CopyCallback) (*cleanedAsset, error) {
|
|
|
|
tmp, err := lfs.TempFile("")
|
2013-10-04 14:56:56 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2013-10-24 16:55:46 +00:00
|
|
|
oidHash := sha256.New()
|
|
|
|
writer := io.MultiWriter(oidHash, tmp)
|
2014-08-07 17:01:06 +00:00
|
|
|
|
|
|
|
if size == 0 {
|
|
|
|
cb = nil
|
|
|
|
}
|
|
|
|
|
2015-04-28 21:37:17 +00:00
|
|
|
by, _, err := DecodeFrom(reader)
|
|
|
|
if err == nil && len(by) < 512 {
|
|
|
|
return nil, &CleanedPointerError{by}
|
|
|
|
}
|
|
|
|
|
|
|
|
multi := io.MultiReader(bytes.NewReader(by), reader)
|
|
|
|
written, err := lfs.CopyWithCallback(writer, multi, size, cb)
|
2013-10-04 14:56:56 +00:00
|
|
|
|
2014-07-28 19:26:10 +00:00
|
|
|
pointer := NewPointer(hex.EncodeToString(oidHash.Sum(nil)), written)
|
2014-07-28 19:28:05 +00:00
|
|
|
return &cleanedAsset{tmp, "", pointer}, err
|
2013-10-04 14:56:56 +00:00
|
|
|
}
|
|
|
|
|
2014-07-28 19:28:05 +00:00
|
|
|
func (a *cleanedAsset) Close() error {
|
2014-08-07 21:32:45 +00:00
|
|
|
return a.File.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *cleanedAsset) Teardown() error {
|
2013-10-04 17:19:11 +00:00
|
|
|
return os.Remove(a.File.Name())
|
2013-10-04 14:56:56 +00:00
|
|
|
}
|