Skip to content

Commit f60d1b4

Browse files
authored
Merge pull request go-git#1101 from onee-only/fix-sparse-reset
git: worktree, Fix sparse reset. Fixes go-git#90
2 parents 95afe7e + db94798 commit f60d1b4

File tree

6 files changed

+67
-7
lines changed

6 files changed

+67
-7
lines changed

COMPATIBILITY.md

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ compatibility status with go-git.
3434
| `merge` | | ⚠️ (partial) | Fast-forward only | |
3535
| `mergetool` | || | |
3636
| `stash` | || | |
37+
| `sparse-checkout` | || | - [sparse-checkout](_examples/sparse-checkout/main.go) |
3738
| `tag` | || | - [tag](_examples/tag/main.go) <br/> - [tag create and push](_examples/tag-create-push/main.go) |
3839

3940
## Sharing and updating projects

_examples/common_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ var args = map[string][]string{
3434
"revision": {cloneRepository(defaultURL, tempFolder()), "master~2^"},
3535
"sha256": {tempFolder()},
3636
"showcase": {defaultURL, tempFolder()},
37+
"sparse-checkout": {defaultURL, "vendor", tempFolder()},
3738
"tag": {cloneRepository(defaultURL, tempFolder())},
3839
}
3940

_examples/sparse-checkout/main.go

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package main
2+
3+
import (
4+
"os"
5+
6+
"github.com/go-git/go-git/v5"
7+
. "github.com/go-git/go-git/v5/_examples"
8+
)
9+
10+
func main() {
11+
CheckArgs("<url>", "<sparse_path>", "<directory>")
12+
url := os.Args[1]
13+
path := os.Args[2]
14+
directory := os.Args[3]
15+
16+
Info("git clone %s %s", url, directory)
17+
18+
r, err := git.PlainClone(directory, false, &git.CloneOptions{
19+
URL: url,
20+
NoCheckout: true,
21+
})
22+
CheckIfError(err)
23+
24+
w, err := r.Worktree()
25+
CheckIfError(err)
26+
27+
err = w.Checkout(&git.CheckoutOptions{
28+
SparseCheckoutDirectories: []string{path},
29+
})
30+
CheckIfError(err)
31+
}

repository_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ func (s *RepositorySuite) TestCloneWithTags(c *C) {
299299
func (s *RepositorySuite) TestCloneSparse(c *C) {
300300
fs := memfs.New()
301301
r, err := Clone(memory.NewStorage(), fs, &CloneOptions{
302-
URL: s.GetBasicLocalRepositoryURL(),
302+
URL: s.GetBasicLocalRepositoryURL(),
303+
NoCheckout: true,
303304
})
304305
c.Assert(err, IsNil)
305306

worktree.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,10 @@ func (w *Worktree) Reset(opts *ResetOptions) error {
364364

365365
func (w *Worktree) resetIndex(t *object.Tree, dirs []string, files []string) error {
366366
idx, err := w.r.Storer.Index()
367-
if len(dirs) > 0 {
368-
idx.SkipUnless(dirs)
369-
}
370-
371367
if err != nil {
372368
return err
373369
}
370+
374371
b := newIndexBuilder(idx)
375372

376373
changes, err := w.diffTreeWithStaging(t, true)
@@ -419,6 +416,11 @@ func (w *Worktree) resetIndex(t *object.Tree, dirs []string, files []string) err
419416
}
420417

421418
b.Write(idx)
419+
420+
if len(dirs) > 0 {
421+
idx.SkipUnless(dirs)
422+
}
423+
422424
return w.r.Storer.SetIndex(idx)
423425
}
424426

@@ -1125,7 +1127,7 @@ func rmFileAndDirsIfEmpty(fs billy.Filesystem, name string) error {
11251127
dir := filepath.Dir(name)
11261128
for {
11271129
removed, err := removeDirIfEmpty(fs, dir)
1128-
if err != nil {
1130+
if err != nil && !os.IsNotExist(err) {
11291131
return err
11301132
}
11311133

worktree_test.go

+25-1
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,8 @@ func (s *WorktreeSuite) TestCheckoutSymlink(c *C) {
478478
func (s *WorktreeSuite) TestCheckoutSparse(c *C) {
479479
fs := memfs.New()
480480
r, err := Clone(memory.NewStorage(), fs, &CloneOptions{
481-
URL: s.GetBasicLocalRepositoryURL(),
481+
URL: s.GetBasicLocalRepositoryURL(),
482+
NoCheckout: true,
482483
})
483484
c.Assert(err, IsNil)
484485

@@ -1284,6 +1285,29 @@ func (s *WorktreeSuite) TestResetHardWithGitIgnore(c *C) {
12841285
c.Assert(status.IsClean(), Equals, true)
12851286
}
12861287

1288+
func (s *WorktreeSuite) TestResetSparsely(c *C) {
1289+
fs := memfs.New()
1290+
w := &Worktree{
1291+
r: s.Repository,
1292+
Filesystem: fs,
1293+
}
1294+
1295+
sparseResetDirs := []string{"php"}
1296+
1297+
err := w.ResetSparsely(&ResetOptions{Mode: HardReset}, sparseResetDirs)
1298+
c.Assert(err, IsNil)
1299+
1300+
files, err := fs.ReadDir("/")
1301+
c.Assert(err, IsNil)
1302+
c.Assert(files, HasLen, 1)
1303+
c.Assert(files[0].Name(), Equals, "php")
1304+
1305+
files, err = fs.ReadDir("/php")
1306+
c.Assert(err, IsNil)
1307+
c.Assert(files, HasLen, 1)
1308+
c.Assert(files[0].Name(), Equals, "crappy.php")
1309+
}
1310+
12871311
func (s *WorktreeSuite) TestStatusAfterCheckout(c *C) {
12881312
fs := memfs.New()
12891313
w := &Worktree{

0 commit comments

Comments
 (0)