Skip to content

Commit aa74b3a

Browse files
committed
remote: fix Worktree.Status on empty repository
1 parent 6b3a6df commit aa74b3a

File tree

4 files changed

+51
-16
lines changed

4 files changed

+51
-16
lines changed

utils/merkletrie/iter.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ func newIter(root noder.Noder, base noder.Path) (*Iter, error) {
8383
base: base,
8484
}
8585

86+
if root == nil {
87+
return ret, nil
88+
}
89+
8690
frame, err := frame.New(root)
8791
if err != nil {
8892
return nil, err

utils/merkletrie/iter_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ var _ = Suite(&IterSuite{})
1919
// A test is a list of operations we want to perform on an iterator and
2020
// their expected results.
2121
//
22-
// The operations are expresed as a sequence of `n` and `s`,
22+
// The operations are expressed as a sequence of `n` and `s`,
2323
// representing the amount of next and step operations we want to call
2424
// on the iterator and their order. For example, an operations value of
2525
// "nns" means: call a `n`ext, then another `n`ext and finish with a
2626
// `s`tep.
2727
//
28-
// The expeced is the full path of the noders returned by the
28+
// The expected is the full path of the noders returned by the
2929
// operations, separated by spaces.
3030
//
3131
// For instance:
@@ -446,6 +446,13 @@ func (e *errorNoder) Children() ([]noder.Noder, error) {
446446
return nil, fmt.Errorf("mock error")
447447
}
448448

449+
func (s *IterSuite) TestNewIterNil(c *C) {
450+
i, err := merkletrie.NewIter(nil)
451+
c.Assert(err, IsNil)
452+
_, err = i.Next()
453+
c.Assert(err, Equals, io.EOF)
454+
}
455+
449456
func (s *IterSuite) TestNewIterFailsOnChildrenErrors(c *C) {
450457
_, err := merkletrie.NewIter(&errorNoder{})
451458
c.Assert(err, ErrorMatches, "mock error")

worktree_status.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,18 @@ var ErrDestinationExists = errors.New("destination exists")
2424

2525
// Status returns the working tree status.
2626
func (w *Worktree) Status() (Status, error) {
27+
var hash plumbing.Hash
28+
2729
ref, err := w.r.Head()
28-
if err == plumbing.ErrReferenceNotFound {
29-
return make(Status, 0), nil
30+
if err != nil && err != plumbing.ErrReferenceNotFound {
31+
return nil, err
3032
}
3133

32-
if err != nil {
33-
return nil, err
34+
if err == nil {
35+
hash = ref.Hash()
3436
}
3537

36-
return w.status(ref.Hash())
38+
return w.status(hash)
3739
}
3840

3941
func (w *Worktree) status(commit plumbing.Hash) (Status, error) {
@@ -182,19 +184,22 @@ func (w *Worktree) diffCommitWithStaging(commit plumbing.Hash, reverse bool) (me
182184
return nil, err
183185
}
184186

185-
c, err := w.r.CommitObject(commit)
186-
if err != nil {
187-
return nil, err
188-
}
187+
var from noder.Noder
188+
if !commit.IsZero() {
189+
c, err := w.r.CommitObject(commit)
190+
if err != nil {
191+
return nil, err
192+
}
189193

190-
t, err := c.Tree()
191-
if err != nil {
192-
return nil, err
194+
t, err := c.Tree()
195+
if err != nil {
196+
return nil, err
197+
}
198+
199+
from = object.NewTreeRootNode(t)
193200
}
194201

195202
to := mindex.NewRootNode(idx)
196-
from := object.NewTreeRootNode(t)
197-
198203
if reverse {
199204
return merkletrie.DiffTree(to, from, diffTreeIsEquals)
200205
}

worktree_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,25 @@ func (s *WorktreeSuite) TestStatusEmpty(c *C) {
344344
c.Assert(status, NotNil)
345345
}
346346

347+
func (s *WorktreeSuite) TestStatusEmptyDirty(c *C) {
348+
fs := memfs.New()
349+
err := util.WriteFile(fs, "foo", []byte("foo"), 0755)
350+
c.Assert(err, IsNil)
351+
352+
storage := memory.NewStorage()
353+
354+
r, err := Init(storage, fs)
355+
c.Assert(err, IsNil)
356+
357+
w, err := r.Worktree()
358+
c.Assert(err, IsNil)
359+
360+
status, err := w.Status()
361+
c.Assert(err, IsNil)
362+
c.Assert(status.IsClean(), Equals, false)
363+
c.Assert(status, HasLen, 1)
364+
}
365+
347366
func (s *WorktreeSuite) TestReset(c *C) {
348367
fs := memfs.New()
349368
w := &Worktree{

0 commit comments

Comments
 (0)