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:
Steve Streeting 2015-08-06 17:12:11 +01:00
parent 5df23bf4ec
commit e0e56caccd
5 changed files with 45 additions and 11 deletions

@ -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