Skip to content

Commit

Permalink
git:worktree, ignore .gitignore in diffStagingWithWorktree for reset: F…
Browse files Browse the repository at this point in the history
…ixes go-git#819
  • Loading branch information
daolis committed Sep 4, 2023
1 parent cd3a21c commit 1d32747
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 7 deletions.
4 changes: 2 additions & 2 deletions worktree.go
Expand Up @@ -368,7 +368,7 @@ func (w *Worktree) resetIndex(t *object.Tree, dirs []string) error {
}

func (w *Worktree) resetWorktree(t *object.Tree) error {
changes, err := w.diffStagingWithWorktree(true)
changes, err := w.diffStagingWithWorktree(true, false)
if err != nil {
return err
}
Expand Down Expand Up @@ -420,7 +420,7 @@ func (w *Worktree) checkoutChange(ch merkletrie.Change, t *object.Tree, idx *ind
}

func (w *Worktree) containsUnstagedChanges() (bool, error) {
ch, err := w.diffStagingWithWorktree(false)
ch, err := w.diffStagingWithWorktree(false, true)
if err != nil {
return false, err
}
Expand Down
9 changes: 6 additions & 3 deletions worktree_status.go
Expand Up @@ -74,7 +74,7 @@ func (w *Worktree) status(commit plumbing.Hash) (Status, error) {
}
}

right, err := w.diffStagingWithWorktree(false)
right, err := w.diffStagingWithWorktree(false, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -113,7 +113,7 @@ func nameFromAction(ch *merkletrie.Change) string {
return name
}

func (w *Worktree) diffStagingWithWorktree(reverse bool) (merkletrie.Changes, error) {
func (w *Worktree) diffStagingWithWorktree(reverse, excludeIgnoredChanges bool) (merkletrie.Changes, error) {
idx, err := w.r.Storer.Index()
if err != nil {
return nil, err
Expand All @@ -138,7 +138,10 @@ func (w *Worktree) diffStagingWithWorktree(reverse bool) (merkletrie.Changes, er
return nil, err
}

return w.excludeIgnoredChanges(c), nil
if excludeIgnoredChanges {
return w.excludeIgnoredChanges(c), nil
}
return c, nil
}

func (w *Worktree) excludeIgnoredChanges(changes merkletrie.Changes) merkletrie.Changes {
Expand Down
52 changes: 50 additions & 2 deletions worktree_test.go
Expand Up @@ -29,6 +29,10 @@ import (
. "gopkg.in/check.v1"
)

var (
defaultTestCommitOptions = &CommitOptions{Author: &object.Signature{Name: "testuser", Email: "testemail"}}
)

type WorktreeSuite struct {
BaseSuite
}
Expand Down Expand Up @@ -884,14 +888,15 @@ func (s *WorktreeSuite) TestStatusCheckedInBeforeIgnored(c *C) {
c.Assert(err, IsNil)
_, err = w.Add("fileToIgnore")
c.Assert(err, IsNil)
_, err = w.Commit("Added file that will be ignored later", &CommitOptions{})

_, err = w.Commit("Added file that will be ignored later", defaultTestCommitOptions)
c.Assert(err, IsNil)

err = util.WriteFile(fs, ".gitignore", []byte("fileToIgnore\nsecondIgnoredFile"), 0755)
c.Assert(err, IsNil)
_, err = w.Add(".gitignore")
c.Assert(err, IsNil)
_, err = w.Commit("Added .gitignore", &CommitOptions{})
_, err = w.Commit("Added .gitignore", defaultTestCommitOptions)
c.Assert(err, IsNil)
status, err := w.Status()
c.Assert(err, IsNil)
Expand Down Expand Up @@ -1097,6 +1102,49 @@ func (s *WorktreeSuite) TestResetHard(c *C) {
c.Assert(branch.Hash(), Equals, commit)
}

func (s *WorktreeSuite) TestResetHardWithGitIgnore(c *C) {
fs := memfs.New()
w := &Worktree{
r: s.Repository,
Filesystem: fs,
}

err := w.Checkout(&CheckoutOptions{})
c.Assert(err, IsNil)

tf, err := fs.Create("newTestFile.txt")
c.Assert(err, IsNil)
_, err = tf.Write([]byte("testfile content"))
c.Assert(err, IsNil)
err = tf.Close()
c.Assert(err, IsNil)
_, err = w.Add("newTestFile.txt")
c.Assert(err, IsNil)
_, err = w.Commit("testcommit", &CommitOptions{Author: &object.Signature{Name: "name", Email: "email"}})
c.Assert(err, IsNil)

err = fs.Remove("newTestFile.txt")
c.Assert(err, IsNil)
f, err := fs.Create(".gitignore")
c.Assert(err, IsNil)
_, err = f.Write([]byte("foo\n"))
_, err = f.Write([]byte("newTestFile.txt\n"))
c.Assert(err, IsNil)
err = f.Close()
c.Assert(err, IsNil)

status, err := w.Status()
c.Assert(err, IsNil)
c.Assert(status.IsClean(), Equals, false)

err = w.Reset(&ResetOptions{Mode: HardReset})
c.Assert(err, IsNil)

status, err = w.Status()
c.Assert(err, IsNil)
c.Assert(status.IsClean(), Equals, true)
}

func (s *WorktreeSuite) TestStatusAfterCheckout(c *C) {
fs := memfs.New()
w := &Worktree{
Expand Down

0 comments on commit 1d32747

Please sign in to comment.