From 093134604cde84f51625efdcf5266a62cd5ab6e9 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Mon, 5 Feb 2024 10:55:04 -0300 Subject: [PATCH] git: worktree, Build status based on the current index instead of building it empty. Fixes #119 --- worktree_status.go | 39 ++++++++++++++++++++++++++++++++++++++- worktree_test.go | 19 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/worktree_status.go b/worktree_status.go index dd9b2439c..2f865ce80 100644 --- a/worktree_status.go +++ b/worktree_status.go @@ -47,8 +47,45 @@ func (w *Worktree) Status() (Status, error) { return w.status(hash) } +func (w *Worktree) newStatusFromIndex() (Status, error) { + idx, err := w.r.Storer.Index() + if err != nil { + return nil, err + } + + idxRoot := mindex.NewRootNode(idx) + nodes := []noder.Noder{idxRoot} + + if err != nil { + return nil, err + } + + status := make(Status) + + for len(nodes) > 0 { + var node noder.Noder + node, nodes = nodes[0], nodes[1:] + if node.IsDir() { + children, err := node.Children() + if err != nil { + return nil, err + } + nodes = append(nodes, children...) + continue + } + fs := status.File(node.Name()) + fs.Worktree = Unmodified + fs.Staging = Unmodified + } + + return status, nil +} + func (w *Worktree) status(commit plumbing.Hash) (Status, error) { - s := make(Status) + s, err := w.newStatusFromIndex() + if err != nil { + return nil, err + } left, err := w.diffCommitWithStaging(commit, false) if err != nil { diff --git a/worktree_test.go b/worktree_test.go index 2c3c59293..deaf5e58d 100644 --- a/worktree_test.go +++ b/worktree_test.go @@ -1052,6 +1052,25 @@ func (s *WorktreeSuite) TestStatusEmptyDirty(c *C) { c.Assert(status, HasLen, 1) } +func (s *WorktreeSuite) TestStatusUnmodified(c *C) { + fs := memfs.New() + w := &Worktree{ + r: s.Repository, + Filesystem: fs, + } + + err := w.Checkout(&CheckoutOptions{Force: true}) + c.Assert(err, IsNil) + + status, err := w.Status() + c.Assert(err, IsNil) + c.Assert(status.IsClean(), Equals, true) + c.Assert(status.IsUntracked("LICENSE"), Equals, false) + + c.Assert(status.File("LICENSE").Staging, Equals, Unmodified) + c.Assert(status.File("LICENSE").Worktree, Equals, Unmodified) +} + func (s *WorktreeSuite) TestReset(c *C) { fs := memfs.New() w := &Worktree{