Never download anything when using the checkout command
This was always the intention but the PointerSmudge functions would automatically do it if the local files were missing. Now they take a boolean argument to say whether to download or not, and the case of skipped smudge is dealt with by writing out the original pointer data and returning a known non-fatal error.
This commit is contained in:
parent
5df23bf4ec
commit
e0e56caccd
@ -182,9 +182,15 @@ func checkoutWithChan(in <-chan *lfs.WrappedPointer) {
|
||||
// OK now we can (over)write the file content
|
||||
repopathchan <- pointer.Name
|
||||
cwdfilepath := <-cwdpathchan
|
||||
err = lfs.PointerSmudgeToFile(cwdfilepath, pointer.Pointer, nil)
|
||||
// smudge but set auto-download to false
|
||||
err = lfs.PointerSmudgeToFile(cwdfilepath, pointer.Pointer, false, nil)
|
||||
if err != nil {
|
||||
Panic(err, "Could not checkout file")
|
||||
if err == lfs.DownloadDeclinedError {
|
||||
// acceptable error, data not local (fetch not run or include/exclude)
|
||||
LoggedError(err, "Skipped checkout for %v, content not local. Use fetch to download.", pointer.Name)
|
||||
} else {
|
||||
Panic(err, "Could not checkout file")
|
||||
}
|
||||
}
|
||||
|
||||
updateIdxStdin.Write([]byte(cwdfilepath + "\n"))
|
||||
|
@ -57,7 +57,7 @@ func smudgeCommand(cmd *cobra.Command, args []string) {
|
||||
Error(err.Error())
|
||||
}
|
||||
|
||||
err = ptr.Smudge(os.Stdout, filename, cb)
|
||||
err = ptr.Smudge(os.Stdout, filename, true, cb)
|
||||
if file != nil {
|
||||
file.Close()
|
||||
}
|
||||
|
@ -59,8 +59,8 @@ func NewPointerExtension(name string, priority int, oid string) *PointerExtensio
|
||||
return &PointerExtension{name, priority, oid, oidType}
|
||||
}
|
||||
|
||||
func (p *Pointer) Smudge(writer io.Writer, workingfile string, cb CopyCallback) error {
|
||||
return PointerSmudge(writer, p, workingfile, cb)
|
||||
func (p *Pointer) Smudge(writer io.Writer, workingfile string, download bool, cb CopyCallback) error {
|
||||
return PointerSmudge(writer, p, workingfile, download, cb)
|
||||
}
|
||||
|
||||
func (p *Pointer) Encode(writer io.Writer) (int, error) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
package lfs
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@ -11,19 +12,30 @@ import (
|
||||
contentaddressable "github.com/github/git-lfs/vendor/_nuts/github.com/technoweenie/go-contentaddressable"
|
||||
)
|
||||
|
||||
func PointerSmudgeToFile(filename string, ptr *Pointer, cb CopyCallback) error {
|
||||
var (
|
||||
DownloadDeclinedError = errors.New("File missing and download is not allowed")
|
||||
)
|
||||
|
||||
func PointerSmudgeToFile(filename string, ptr *Pointer, download bool, cb CopyCallback) error {
|
||||
os.MkdirAll(filepath.Dir(filename), 0755)
|
||||
file, err := os.Create(filename)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not create working directory file: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
if err := PointerSmudge(file, ptr, filename, cb); err != nil {
|
||||
return fmt.Errorf("Could not write working directory file: %v", err)
|
||||
if err := PointerSmudge(file, ptr, filename, download, cb); err != nil {
|
||||
if err == DownloadDeclinedError {
|
||||
// write placeholder data instead
|
||||
file.Seek(0, os.SEEK_SET)
|
||||
ptr.Encode(file)
|
||||
return err
|
||||
} else {
|
||||
return fmt.Errorf("Could not write working directory file: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func PointerSmudge(writer io.Writer, ptr *Pointer, workingfile string, cb CopyCallback) error {
|
||||
func PointerSmudge(writer io.Writer, ptr *Pointer, workingfile string, download bool, cb CopyCallback) error {
|
||||
mediafile, err := LocalMediaPath(ptr.Oid)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -41,7 +53,11 @@ func PointerSmudge(writer io.Writer, ptr *Pointer, workingfile string, cb CopyCa
|
||||
|
||||
var wErr *WrappedError
|
||||
if statErr != nil || stat == nil {
|
||||
wErr = downloadFile(writer, ptr, workingfile, mediafile, cb)
|
||||
if download {
|
||||
wErr = downloadFile(writer, ptr, workingfile, mediafile, cb)
|
||||
} else {
|
||||
return DownloadDeclinedError
|
||||
}
|
||||
} else {
|
||||
wErr = readLocalFile(writer, ptr, mediafile, workingfile, cb)
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ begin_test "checkout"
|
||||
grep "Tracking \*.dat" track.log
|
||||
|
||||
contents="something something"
|
||||
contentsize=19
|
||||
contents_oid=$(printf "$contents" | shasum -a 256 | cut -f 1 -d " ")
|
||||
|
||||
# Same content everywhere is ok, just one object in lfs db
|
||||
@ -34,7 +35,7 @@ begin_test "checkout"
|
||||
[ "$contents" = "$(cat folder1/nested.dat)" ]
|
||||
[ "$contents" = "$(cat folder2/nested.dat)" ]
|
||||
|
||||
assert_pointer "master" "file1.dat" "$contents_oid" 19
|
||||
assert_pointer "master" "file1.dat" "$contents_oid" $contentsize
|
||||
|
||||
# Remove the working directory
|
||||
rm -rf file1.dat file2.dat file3.dat folder1/nested.dat folder2/nested.dat
|
||||
@ -89,5 +90,16 @@ begin_test "checkout"
|
||||
[ "$contents" = "$(cat folder1/nested.dat)" ]
|
||||
[ "$contents" = "$(cat folder2/nested.dat)" ]
|
||||
|
||||
# test checkout with missing data doesn't fail
|
||||
git push origin master
|
||||
rm -rf .git/lfs/objects
|
||||
rm file*.dat
|
||||
git lfs checkout
|
||||
[ "$(pointer $contents_oid $contentsize)" = "$(cat file1.dat)" ]
|
||||
[ "$(pointer $contents_oid $contentsize)" = "$(cat file2.dat)" ]
|
||||
[ "$(pointer $contents_oid $contentsize)" = "$(cat file3.dat)" ]
|
||||
[ "$contents" = "$(cat folder1/nested.dat)" ]
|
||||
[ "$contents" = "$(cat folder2/nested.dat)" ]
|
||||
|
||||
)
|
||||
end_test
|
||||
|
Loading…
Reference in New Issue
Block a user