From 80997c6fa55da6a25c30dccab379e808d9f07b28 Mon Sep 17 00:00:00 2001 From: Ben Navetta Date: Mon, 25 Aug 2014 23:18:00 -0400 Subject: [PATCH] fix status list to handle null head_to_index in entries --- status.go | 16 ++++++++++++++-- status_test.go | 22 ++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/status.go b/status.go index f69cd14..09a06c4 100644 --- a/status.go +++ b/status.go @@ -35,10 +35,21 @@ type StatusEntry struct { } func statusEntryFromC(statusEntry *C.git_status_entry) StatusEntry { + var headToIndex DiffDelta = DiffDelta{} + var indexToWorkdir DiffDelta = DiffDelta{} + + // Based on the libgit2 status example, head_to_index can be null in some cases + if statusEntry.head_to_index != nil { + headToIndex = diffDeltaFromC(statusEntry.head_to_index) + } + if statusEntry.index_to_workdir != nil { + indexToWorkdir = diffDeltaFromC(statusEntry.index_to_workdir) + } + return StatusEntry { Status: Status(statusEntry.status), - HeadToIndex: diffDeltaFromC(statusEntry.head_to_index), - IndexToWorkdir: diffDeltaFromC(statusEntry.index_to_workdir), + HeadToIndex: headToIndex, + IndexToWorkdir: indexToWorkdir, } } @@ -158,6 +169,7 @@ func (v *Repository) StatusList(opts *StatusOptions) (*StatusList, error) { if ret < 0 { return nil, MakeGitError(ret) } + return newStatusListFromC(ptr), nil } diff --git a/status_test.go b/status_test.go index 228ee0e..4be4824 100644 --- a/status_test.go +++ b/status_test.go @@ -23,22 +23,36 @@ func TestStatusFile(t *testing.T) { } } -func TestEntryCount(t *testing.T) { +func TestStatusList(t *testing.T) { repo := createTestRepo(t) + // This commits the test repo README, so it doesn't show up in the status list and there's a head to compare to + seedTestRepo(t, repo) defer repo.Free() defer os.RemoveAll(repo.Workdir()) err := ioutil.WriteFile(path.Join(path.Dir(repo.Workdir()), "hello.txt"), []byte("Hello, World"), 0644) checkFatal(t, err) - statusList, err := repo.StatusList(nil) + opts := &StatusOptions{} + opts.Show = StatusShowIndexAndWorkdir + opts.Flags = StatusOptIncludeUntracked | StatusOptRenamesHeadToIndex | StatusOptSortCaseSensitively + + statusList, err := repo.StatusList(opts) checkFatal(t, err) entryCount, err := statusList.EntryCount() checkFatal(t, err) if entryCount != 1 { - // FIXME: this is 0 even though the same setup above returns the correct status, as does a call to StatusFile here - // t.Fatal("Incorrect number of status entries: ", entryCount) + t.Fatal("Incorrect number of status entries: ", entryCount) + } + + entry, err := statusList.ByIndex(0) + checkFatal(t, err) + if entry.Status != StatusWtNew { + t.Fatal("Incorrect status flags: ", entry.Status) + } + if entry.IndexToWorkdir.NewFile.Path != "hello.txt" { + t.Fatal("Incorrect entry path: ", entry.IndexToWorkdir.NewFile.Path) } }