Merge pull request #1540 from github/status-initial-commit

Status initial commit
This commit is contained in:
Taylor Blau 2016-09-27 19:15:40 -04:00 committed by GitHub
commit 06b4c1463d
5 changed files with 57 additions and 20 deletions

@ -39,7 +39,7 @@ func doFsck() (bool, error) {
}
// TODO(zeroshirts): do we want to look for LFS stuff in past commits?
p2, err := lfs.ScanIndex()
p2, err := lfs.ScanIndex("HEAD")
if err != nil {
return false, err
}

@ -15,12 +15,15 @@ var (
func statusCommand(cmd *cobra.Command, args []string) {
requireInRepo()
ref, err := git.CurrentRef()
if err != nil {
Panic(err, "Could not get the current ref")
// tolerate errors getting ref so this works before first commit
ref, _ := git.CurrentRef()
scanIndexAt := "HEAD"
if ref == nil {
scanIndexAt = git.RefBeforeFirstCommit
}
stagedPointers, err := lfs.ScanIndex()
stagedPointers, err := lfs.ScanIndex(scanIndexAt)
if err != nil {
Panic(err, "Could not scan staging for Git LFS objects")
}
@ -39,19 +42,22 @@ func statusCommand(cmd *cobra.Command, args []string) {
return
}
Print("On branch %s", ref.Name)
if ref != nil {
remoteRef, err := git.CurrentRemoteRef()
if err == nil {
Print("On branch %s", ref.Name)
pointers, err := lfs.ScanRefs(ref.Sha, "^"+remoteRef.Sha, nil)
if err != nil {
Panic(err, "Could not scan for Git LFS objects")
}
remoteRef, err := git.CurrentRemoteRef()
if err == nil {
Print("Git LFS objects to be pushed to %s:\n", remoteRef.Name)
for _, p := range pointers {
Print("\t%s (%s)", p.Name, humanizeBytes(p.Size))
pointers, err := lfs.ScanRefs(ref.Sha, "^"+remoteRef.Sha, nil)
if err != nil {
Panic(err, "Could not scan for Git LFS objects")
}
Print("Git LFS objects to be pushed to %s:\n", remoteRef.Name)
for _, p := range pointers {
Print("\t%s (%s)", p.Name, humanizeBytes(p.Size))
}
}
}

@ -30,6 +30,10 @@ const (
RefTypeRemoteTag = RefType(iota)
RefTypeHEAD = RefType(iota) // current checkout
RefTypeOther = RefType(iota) // stash or unknown
// A ref which can be used as a placeholder for before the first commit
// Equivalent to git mktree < /dev/null, useful for diffing before first commit
RefBeforeFirstCommit = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
)
// A git reference (branch, tag etc)

@ -192,7 +192,8 @@ func (m *indexFileMap) Set(sha string, index *indexFile) {
// ScanIndex returns a slice of WrappedPointer objects for all
// Git LFS pointers it finds in the index.
// Reports unique oids once only, not multiple times if >1 file uses the same content
func ScanIndex() ([]*WrappedPointer, error) {
// Ref is the ref at which to scan, which may be "HEAD" if there is at least one commit
func ScanIndex(ref string) ([]*WrappedPointer, error) {
indexMap := &indexFileMap{
nameMap: make(map[string]*indexFile, 0),
mutex: &sync.Mutex{},
@ -203,12 +204,12 @@ func ScanIndex() ([]*WrappedPointer, error) {
tracerx.PerformanceSince("scan-staging", start)
}()
revs, err := revListIndex(false, indexMap)
revs, err := revListIndex(ref, false, indexMap)
if err != nil {
return nil, err
}
cachedRevs, err := revListIndex(true, indexMap)
cachedRevs, err := revListIndex(ref, true, indexMap)
if err != nil {
return nil, err
}
@ -402,12 +403,12 @@ func revListShas(refLeft, refRight string, opt *ScanRefsOptions) (*StringChannel
// revListIndex uses git diff-index to return the list of object sha1s
// for in the indexf. It returns a channel from which sha1 strings can be read.
// The namMap will be filled indexFile pointers mapping sha1s to indexFiles.
func revListIndex(cache bool, indexMap *indexFileMap) (*StringChannelWrapper, error) {
func revListIndex(atRef string, cache bool, indexMap *indexFileMap) (*StringChannelWrapper, error) {
cmdArgs := []string{"diff-index", "-M"}
if cache {
cmdArgs = append(cmdArgs, "--cached")
}
cmdArgs = append(cmdArgs, "HEAD")
cmdArgs = append(cmdArgs, atRef)
cmd, err := startCommand("git", cmdArgs...)
if err != nil {

@ -83,3 +83,29 @@ begin_test "status: outside git repository"
grep "Not in a git repository" status.log
)
end_test
begin_test "status - before initial commit"
(
set -e
git init repo-initial
cd repo-initial
git lfs track "*.dat"
# should not fail when nothing to display (ignore output, will be blank)
git lfs status
echo "some data" > file1.dat
git add file1.dat
expected="
Git LFS objects to be committed:
file1.dat (10 B)
Git LFS objects not staged for commit:"
[ "$expected" = "$(git lfs status)" ]
)
end_test