From 0c46c6261fd0f48a936fc2b1d0062e6e2e683208 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sat, 7 Nov 2026 21:47:45 +0100 Subject: [PATCH] Add a test showing that removing a submodule can delete a directory outside the repository Co-Authored-By: Claude Opus 5.5 --- .../tests/submodule/ignore_suspicious_name.go | 54 +++++++++++++++++++ pkg/integration/tests/test_list.go | 1 + 2 files changed, 55 insertions(+) create mode 100644 pkg/integration/tests/submodule/ignore_suspicious_name.go diff --git a/pkg/integration/tests/submodule/ignore_suspicious_name.go b/pkg/integration/tests/submodule/ignore_suspicious_name.go new file mode 100644 index 000000000..497b12134 --- /dev/null +++ b/pkg/integration/tests/submodule/ignore_suspicious_name.go @@ -0,0 +1,54 @@ +package submodule + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var IgnoreSuspiciousName = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Ignore a submodule whose name in .gitmodules would put its git dir outside the repository", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateFile("../victim/file", "content") + + shell.EmptyCommit("first commit") + shell.CloneIntoSubmodule("my_submodule_name", "my_submodule_path") + shell.GitAddAll() + shell.Commit("add submodule") + + // The git dir of a submodule is .git/modules/, so this name + // points at the victim directory next to the repository + shell.UpdateFileAndAdd(".gitmodules", `[submodule "../../../victim"] + path = my_submodule_path + url = ../my_submodule_name +`) + shell.Commit("rename submodule") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Submodules().Focus(). + /* EXPECTED: + IsEmpty() + ACTUAL: */ + Lines( + Contains("../../../victim").IsSelected(), + ). + Press(keys.Universal.Remove). + Tap(func() { + t.ExpectPopup().Confirmation(). + Title(Equals("Remove submodule")). + Content(Equals("Are you sure you want to remove submodule '../../../victim' and its corresponding directory? This is irreversible.")). + Confirm() + }). + Lines( + Contains("../../../victim").IsSelected(), + ) + + t.FileSystem(). + /* EXPECTED: + PathPresent("../victim/file") + ACTUAL: */ + PathNotPresent("../victim/file") + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 282c2436c..ae54d0f6e 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -578,6 +578,7 @@ var tests = []*components.IntegrationTest{ submodule.Enter, submodule.EnterFromDotfileBareRepo, submodule.EnterNested, + submodule.IgnoreSuspiciousName, submodule.Remove, submodule.RemoveInLinkedWorktree, submodule.RemoveNested,