diff --git a/pkg/commands/git_commands/submodule.go b/pkg/commands/git_commands/submodule.go index 0fa5de9df..79d3e2318 100644 --- a/pkg/commands/git_commands/submodule.go +++ b/pkg/commands/git_commands/submodule.go @@ -269,9 +269,8 @@ func (self *SubmoduleCommands) Delete(submodule *models.SubmoduleConfig) error { self.Log.Error(err) } - // We may in fact want to use the repo's git dir path but git docs say not to - // mix submodules and worktrees anyway. - return os.RemoveAll(submodule.GitDirPath(self.repoPaths.repoGitDirPath)) + // Git keeps the git dirs of submodules separately for each worktree + return os.RemoveAll(submodule.GitDirPath(self.repoPaths.WorktreeGitDirPath())) } func (self *SubmoduleCommands) Add(name string, path string, url string) error { diff --git a/pkg/commands/models/submodule_config.go b/pkg/commands/models/submodule_config.go index 7df0d131a..48d838ff4 100644 --- a/pkg/commands/models/submodule_config.go +++ b/pkg/commands/models/submodule_config.go @@ -38,10 +38,10 @@ func (r *SubmoduleConfig) Description() string { return r.RefName() } -func (r *SubmoduleConfig) GitDirPath(repoGitDirPath string) string { - parentPath := repoGitDirPath +func (r *SubmoduleConfig) GitDirPath(worktreeGitDirPath string) string { + parentPath := worktreeGitDirPath if r.ParentModule != nil { - parentPath = r.ParentModule.GitDirPath(repoGitDirPath) + parentPath = r.ParentModule.GitDirPath(worktreeGitDirPath) } return filepath.Join(parentPath, "modules", r.Name) diff --git a/pkg/integration/tests/submodule/remove_in_linked_worktree.go b/pkg/integration/tests/submodule/remove_in_linked_worktree.go new file mode 100644 index 000000000..f081faa46 --- /dev/null +++ b/pkg/integration/tests/submodule/remove_in_linked_worktree.go @@ -0,0 +1,48 @@ +package submodule + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var RemoveInLinkedWorktree = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Remove a submodule in a linked worktree", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("first commit") + shell.CloneIntoSubmodule("my_submodule_name", "my_submodule_path") + shell.GitAddAll() + shell.Commit("add submodule") + + shell.AddWorktree("HEAD", "../linked-worktree", "mybranch") + shell.Chdir("../linked-worktree") + shell.RunCommand([]string{"git", "submodule", "update", "--init"}) + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + // Git keeps the git dirs of submodules separately for each worktree + mainGitDirSubmodulePath := "../repo/.git/modules/my_submodule_name" + linkedGitDirSubmodulePath := "../repo/.git/worktrees/linked-worktree/modules/my_submodule_name" + t.FileSystem(). + PathPresent(mainGitDirSubmodulePath). + PathPresent(linkedGitDirSubmodulePath) + + t.Views().Submodules().Focus(). + Lines( + Contains("my_submodule_name").IsSelected(), + ). + Press(keys.Universal.Remove). + Tap(func() { + t.ExpectPopup().Confirmation(). + Title(Equals("Remove submodule")). + Content(Equals("Are you sure you want to remove submodule 'my_submodule_name' and its corresponding directory? This is irreversible.")). + Confirm() + }). + IsEmpty() + + t.FileSystem(). + PathPresent(mainGitDirSubmodulePath). + PathNotPresent(linkedGitDirSubmodulePath) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 36b71ea00..282c2436c 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -579,6 +579,7 @@ var tests = []*components.IntegrationTest{ submodule.EnterFromDotfileBareRepo, submodule.EnterNested, submodule.Remove, + submodule.RemoveInLinkedWorktree, submodule.RemoveNested, submodule.Reset, submodule.ResetFolder,