Merge pull request #1540 from github/status-initial-commit
Status initial commit
This commit is contained in:
commit
06b4c1463d
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user