Skip to content

Commit 7775193

Browse files
committed
fix(git-worktree): ignore existing locked service worktree when re-adding
* Use git worktree add with double `--force` argument. From git docs: > To add a missing but locked working tree path, specify --force twice. * Added test for locked worktree case. Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
1 parent 91a829b commit 7775193

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

pkg/true_git/git_cmd_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ var _ = Describe("Git command", func() {
2525
"init",
2626
)
2727

28+
utils.RunSucceedCommand(
29+
gitRepoPath,
30+
"git",
31+
"checkout", "-b", "main",
32+
)
33+
2834
utils.RunSucceedCommand(
2935
gitRepoPath,
3036
"git",

pkg/true_git/service_branch_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ var _ = Describe("SyncSourceWorktreeWithServiceBranch", func() {
3131
"-c", "init.defaultBranch=main",
3232
"init",
3333
)
34+
35+
utils.RunSucceedCommand(
36+
sourceWorkTreeDir,
37+
"git",
38+
"checkout", "-b", "main",
39+
)
40+
3441
gitDir = filepath.Join(sourceWorkTreeDir, ".git")
3542

3643
utils.RunSucceedCommand(

pkg/true_git/work_tree.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func switchWorkTree(ctx context.Context, repoDir, workTreeDir, commit string, wi
212212
_, err := os.Stat(workTreeDir)
213213
switch {
214214
case os.IsNotExist(err):
215-
wtAddCmd := NewGitCmd(ctx, &GitCmdOptions{RepoDir: repoDir}, "worktree", "add", "--force", "--detach", workTreeDir, commit)
215+
wtAddCmd := NewGitCmd(ctx, &GitCmdOptions{RepoDir: repoDir}, "worktree", "add", "--force", "--force", "--detach", workTreeDir, commit)
216216
if err = wtAddCmd.Run(ctx); err != nil {
217217
return fmt.Errorf("git worktree add command failed: %w", err)
218218
}

pkg/true_git/work_tree_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,59 @@ var _ = Describe("Work tree helpers", func() {
3939
})
4040
})
4141

42+
When("side worktree was previously added and locked", func() {
43+
When("no submodules are used", func() {
44+
var mainWtDir, sideWtDir string
45+
46+
BeforeEach(func() {
47+
mainWtDir = filepath.Join(SuiteData.TestDirPath, "main-wt")
48+
sideWtDir = filepath.Join(SuiteData.TestDirPath, "side-wt")
49+
50+
Expect(os.MkdirAll(mainWtDir, os.ModePerm)).To(Succeed())
51+
52+
utils.RunSucceedCommand(
53+
mainWtDir,
54+
"git",
55+
"-c", "init.defaultBranch=main",
56+
"init",
57+
)
58+
59+
utils.RunSucceedCommand(
60+
mainWtDir,
61+
"git",
62+
"checkout", "-b", "main",
63+
)
64+
65+
utils.RunSucceedCommand(
66+
mainWtDir,
67+
"git",
68+
"commit", "--allow-empty", "-m", "Initial commit",
69+
)
70+
71+
utils.RunSucceedCommand(
72+
mainWtDir,
73+
"git", "worktree", "add", sideWtDir,
74+
)
75+
76+
utils.RunSucceedCommand(
77+
mainWtDir,
78+
"git", "worktree", "lock", sideWtDir,
79+
)
80+
81+
err := os.RemoveAll(sideWtDir)
82+
Expect(err).To(Succeed())
83+
})
84+
85+
It("should replace worktree without errors", func() {
86+
ctx := context.Background()
87+
88+
commit := getHeadCommit(ctx, mainWtDir)
89+
90+
Expect(switchWorkTree(ctx, mainWtDir, sideWtDir, commit, false)).To(Succeed())
91+
})
92+
})
93+
})
94+
4295
Describe("verifyWorkTreeConsistency", func() {
4396
var mainWtDir, sideWtDir string
4497
BeforeEach(func() {
@@ -54,6 +107,12 @@ var _ = Describe("Work tree helpers", func() {
54107
"init",
55108
)
56109

110+
utils.RunSucceedCommand(
111+
mainWtDir,
112+
"git",
113+
"checkout", "-b", "main",
114+
)
115+
57116
utils.RunSucceedCommand(
58117
mainWtDir,
59118
"git",
@@ -84,3 +143,17 @@ var _ = Describe("Work tree helpers", func() {
84143
})
85144
})
86145
})
146+
147+
func getHeadCommit(ctx context.Context, repoDir string) string {
148+
refs, err := ShowRef(ctx, repoDir)
149+
Expect(err).To(Succeed())
150+
151+
for _, ref := range refs.Refs {
152+
if ref.IsHEAD {
153+
return ref.Commit
154+
}
155+
}
156+
157+
Expect(fmt.Errorf("head commit not found")).NotTo(HaveOccurred())
158+
return ""
159+
}

0 commit comments

Comments
 (0)