Better handling for tiny files below the blob size threshold that contain 'git-lfs'
This commit is contained in:
parent
d402f5b330
commit
4e7bc74874
@ -162,6 +162,19 @@ func IsNotAPointerError(err error) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsBadPointerKeyError indicates that the parsed data has an invalid key.
|
||||||
|
func IsBadPointerKeyError(err error) bool {
|
||||||
|
if e, ok := err.(interface {
|
||||||
|
BadPointerKeyError() bool
|
||||||
|
}); ok {
|
||||||
|
return e.BadPointerKeyError()
|
||||||
|
}
|
||||||
|
if e, ok := err.(errorWrapper); ok {
|
||||||
|
return IsBadPointerKeyError(e.InnerError())
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// IsDownloadDeclinedError indicates that the smudge operation should not download.
|
// IsDownloadDeclinedError indicates that the smudge operation should not download.
|
||||||
// TODO: I don't really like using errors to control that flow, it should be refactored.
|
// TODO: I don't really like using errors to control that flow, it should be refactored.
|
||||||
func IsDownloadDeclinedError(err error) bool {
|
func IsDownloadDeclinedError(err error) bool {
|
||||||
@ -483,6 +496,25 @@ func newNotAPointerError(err error) error {
|
|||||||
return notAPointerError{newWrappedError(err, "Not a valid Git LFS pointer file.")}
|
return notAPointerError{newWrappedError(err, "Not a valid Git LFS pointer file.")}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type badPointerKeyError struct {
|
||||||
|
Expected string
|
||||||
|
Actual string
|
||||||
|
errorWrapper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e badPointerKeyError) InnerError() error {
|
||||||
|
return e.errorWrapper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e badPointerKeyError) BadPointerKeyError() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func newBadPointerKeyError(expected, actual string) error {
|
||||||
|
err := fmt.Errorf("Error parsing LFS Pointer. Expected key %s, got %s", expected, actual)
|
||||||
|
return badPointerKeyError{expected, actual, newWrappedError(err, "")}
|
||||||
|
}
|
||||||
|
|
||||||
// Definitions for IsDownloadDeclinedError()
|
// Definitions for IsDownloadDeclinedError()
|
||||||
|
|
||||||
type downloadDeclinedError struct {
|
type downloadDeclinedError struct {
|
||||||
|
@ -131,6 +131,12 @@ func verifyVersion(version string) error {
|
|||||||
func decodeKV(data []byte) (*Pointer, error) {
|
func decodeKV(data []byte) (*Pointer, error) {
|
||||||
kvps, exts, err := decodeKVData(data)
|
kvps, exts, err := decodeKVData(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if IsBadPointerKeyError(err) {
|
||||||
|
badErr := err.(badPointerKeyError)
|
||||||
|
if badErr.Expected == "version" {
|
||||||
|
return nil, newNotAPointerError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +258,7 @@ func decodeKVData(data []byte) (kvps map[string]string, exts map[string]string,
|
|||||||
|
|
||||||
if expected := pointerKeys[line]; key != expected {
|
if expected := pointerKeys[line]; key != expected {
|
||||||
if !extRE.Match([]byte(key)) {
|
if !extRE.Match([]byte(key)) {
|
||||||
err = fmt.Errorf("Expected key %s, got %s", expected, key)
|
err = newBadPointerKeyError(expected, key)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if exts == nil {
|
if exts == nil {
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -60,6 +61,18 @@ func assertLine(t *testing.T, r *bufio.Reader, expected string) {
|
|||||||
assert.Equal(t, expected, actual)
|
assert.Equal(t, expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDecodeTinyFile(t *testing.T) {
|
||||||
|
ex := "this is not a git-lfs file!"
|
||||||
|
p, err := DecodePointer(bytes.NewBufferString(ex))
|
||||||
|
if p != nil {
|
||||||
|
t.Errorf("pointer was decoded: %v", p)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !IsNotAPointerError(err) {
|
||||||
|
t.Errorf("error is not a NotAPointerError: %s: '%v'", reflect.TypeOf(err), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDecode(t *testing.T) {
|
func TestDecode(t *testing.T) {
|
||||||
ex := `version https://git-lfs.github.com/spec/v1
|
ex := `version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
|
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
|
||||||
|
@ -69,7 +69,6 @@ begin_test "pull"
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
[ "a" = "$(cat a.dat)" ]
|
[ "a" = "$(cat a.dat)" ]
|
||||||
|
|
||||||
|
|
||||||
# Test include / exclude filters supplied in gitconfig
|
# Test include / exclude filters supplied in gitconfig
|
||||||
rm -rf .git/lfs/objects
|
rm -rf .git/lfs/objects
|
||||||
git config "lfs.fetchinclude" "a*"
|
git config "lfs.fetchinclude" "a*"
|
||||||
@ -91,8 +90,6 @@ begin_test "pull"
|
|||||||
rm -rf .git/lfs/objects
|
rm -rf .git/lfs/objects
|
||||||
git lfs pull --exclude="a*"
|
git lfs pull --exclude="a*"
|
||||||
refute_local_object "$contents_oid"
|
refute_local_object "$contents_oid"
|
||||||
|
|
||||||
|
|
||||||
)
|
)
|
||||||
end_test
|
end_test
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ begin_test "smudge with invalid pointer"
|
|||||||
|
|
||||||
cd repo
|
cd repo
|
||||||
[ "wat" = "$(echo "wat" | git lfs smudge)" ]
|
[ "wat" = "$(echo "wat" | git lfs smudge)" ]
|
||||||
|
[ "not a git-lfs file" = "$(echo "wat" | git lfs smudge)" ]
|
||||||
)
|
)
|
||||||
end_test
|
end_test
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user