From 024d62b96ac19b40473f04931f9c12c8e24e0f7a Mon Sep 17 00:00:00 2001 From: hansmi Date: Wed, 27 Jan 2021 10:49:40 +0100 Subject: [PATCH] worktree: Don't remove root directory when cleaning (#230) When using a separate worktree directory while working on a bare repository, cleaning with CleanOptions{Dir: true} would also remove the root worktree directory if empty. Signed-off-by: Michael Hanselmann --- worktree.go | 2 +- worktree_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/worktree.go b/worktree.go index 73e638a2c..4aeae0191 100644 --- a/worktree.go +++ b/worktree.go @@ -771,7 +771,7 @@ func (w *Worktree) doClean(status Status, opts *CleanOptions, dir string, files } } - if opts.Dir { + if opts.Dir && dir != "" { return doCleanDirectories(w.Filesystem, dir) } return nil diff --git a/worktree_test.go b/worktree_test.go index 8a7586a6e..1086735c7 100644 --- a/worktree_test.go +++ b/worktree_test.go @@ -1826,7 +1826,39 @@ func (s *WorktreeSuite) TestClean(c *C) { // An empty dir should be deleted, as well. _, err = fs.Lstat("pkgA") c.Assert(err, ErrorMatches, ".*(no such file or directory.*|.*file does not exist)*.") +} + +func (s *WorktreeSuite) TestCleanBare(c *C) { + storer := memory.NewStorage() + + r, err := Init(storer, nil) + c.Assert(err, IsNil) + c.Assert(r, NotNil) + + wtfs := memfs.New() + + err = wtfs.MkdirAll("worktree", os.ModePerm) + c.Assert(err, IsNil) + + wtfs, err = wtfs.Chroot("worktree") + c.Assert(err, IsNil) + + r, err = Open(storer, wtfs) + c.Assert(err, IsNil) + wt, err := r.Worktree() + c.Assert(err, IsNil) + + _, err = wt.Filesystem.Lstat(".") + c.Assert(err, IsNil) + + // Clean with Dir: true. + err = wt.Clean(&CleanOptions{Dir: true}) + c.Assert(err, IsNil) + + // Root worktree directory must remain after cleaning + _, err = wt.Filesystem.Lstat(".") + c.Assert(err, IsNil) } func (s *WorktreeSuite) TestAlternatesRepo(c *C) {