1package git
2
3import (
4 "context"
5 "os"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10)
11
12func TestRepository_WorktreeAdd(t *testing.T) {
13 ctx := context.Background()
14 r, cleanup, err := setupTempRepo()
15 require.NoError(t, err)
16 defer cleanup()
17
18 t.Run("detached HEAD", func(t *testing.T) {
19 path := tempPath()
20 defer func() { _ = os.RemoveAll(path) }()
21
22 sha, err := r.RevParse(ctx, "master")
23 require.NoError(t, err)
24
25 err = r.WorktreeAdd(ctx, path, sha)
26 assert.NoError(t, err)
27 })
28
29 t.Run("new branch", func(t *testing.T) {
30 path := tempPath()
31 defer func() { _ = os.RemoveAll(path) }()
32
33 err := r.WorktreeAdd(ctx, path, "master", WorktreeAddOptions{
34 Branch: "test-worktree-branch",
35 })
36 assert.NoError(t, err)
37 })
38}
39
40func TestRepository_WorktreeRemove(t *testing.T) {
41 ctx := context.Background()
42 r, cleanup, err := setupTempRepo()
43 require.NoError(t, err)
44 defer cleanup()
45
46 t.Run("remove worktree", func(t *testing.T) {
47 path := tempPath()
48
49 err := r.WorktreeAdd(ctx, path, "master", WorktreeAddOptions{
50 Branch: "test-remove-branch",
51 })
52 require.NoError(t, err)
53
54 err = r.WorktreeRemove(ctx, path)
55 assert.NoError(t, err)
56 })
57
58 t.Run("force remove", func(t *testing.T) {
59 path := tempPath()
60
61 err := r.WorktreeAdd(ctx, path, "master", WorktreeAddOptions{
62 Branch: "test-force-remove",
63 })
64 require.NoError(t, err)
65
66 // Write an untracked file to make the worktree dirty.
67 err = os.WriteFile(path+"/dirty-file", []byte("dirty"), 0600)
68 require.NoError(t, err)
69
70 err = r.WorktreeRemove(ctx, path, WorktreeRemoveOptions{Force: true})
71 assert.NoError(t, err)
72 })
73}