From 41f89d86f0d662b16639a3b31ec2ebc4f09f7d44 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Wed, 9 Apr 2025 13:21:26 +0200 Subject: [PATCH] Add test that shows problems with git-ignoring files with special characters For #, !, [, and ], the problem is that it doesn't ignore the file because the special characters need to be quoted. For *, the problem is that it ignores too much (it also hides the abc_def file because the * is treated as a glob). --- .../file/gitignore_special_characters.go | 87 +++++++++++++++++++ pkg/integration/tests/test_list.go | 1 + 2 files changed, 88 insertions(+) create mode 100644 pkg/integration/tests/file/gitignore_special_characters.go diff --git a/pkg/integration/tests/file/gitignore_special_characters.go b/pkg/integration/tests/file/gitignore_special_characters.go new file mode 100644 index 000000000..81849fc0c --- /dev/null +++ b/pkg/integration/tests/file/gitignore_special_characters.go @@ -0,0 +1,87 @@ +package file + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var GitignoreSpecialCharacters = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Ignore files with special characters in their names", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) { + }, + SetupRepo: func(shell *Shell) { + shell.CreateFile(".gitignore", "") + shell.CreateFile("#file", "") + shell.CreateFile("file#abc", "") + shell.CreateFile("!file", "") + shell.CreateFile("file!abc", "") + shell.CreateFile("abc*def", "") + shell.CreateFile("abc_def", "") + shell.CreateFile("file[x]", "") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + excludeFile := func(fileName string) { + t.Views().Files(). + NavigateToLine(Contains(fileName)). + Press(keys.Files.IgnoreFile) + + t.ExpectPopup().Menu(). + Title(Equals("Ignore or exclude file")). + Select(Contains("Add to .gitignore")). + Confirm() + } + + t.Views().Files(). + Focus(). + Lines( + Equals("▼ /"), + Equals(" ?? !file"), + Equals(" ?? #file"), + Equals(" ?? .gitignore"), + Equals(" ?? abc*def"), + Equals(" ?? abc_def"), + Equals(" ?? file!abc"), + Equals(" ?? file#abc"), + Equals(" ?? file[x]"), + ) + + excludeFile("#file") + excludeFile("file#abc") + excludeFile("!file") + excludeFile("file!abc") + excludeFile("abc*def") + excludeFile("file[x]") + + t.Views().Files(). + /* EXPECTED: + Lines( + Equals("▼ /"), + Equals(" ?? .gitignore"), + Equals(" ?? abc_def"), + ) + ACTUAL: + As you can see, it did ignore the 'file!abc' and 'file#abc' files + correctly. Those don't need to be quoted because # and ! are only + special at the beginning. + + Most of the other files are not ignored properly because their + special characters need to be escaped. For * it's the other way + round: while it does hide 'abc*def', it also hides 'abc_def', + which we don't want. + */ + Lines( + Equals("▼ /"), + Equals(" ?? !file"), + Equals(" ?? #file"), + Equals(" ?? .gitignore"), + Equals(" ?? file[x]"), + ) + + /* EXPECTED: + t.FileSystem().FileContent(".gitignore", Equals("\\#file\nfile#abc\n\\!file\nfile!abc\nabc\\*def\nfile\\[x\\]\n")) + ACTUAL: */ + t.FileSystem().FileContent(".gitignore", Equals("#file\nfile#abc\n!file\nfile!abc\nabc*def\nfile[x]\n")) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index c79dcd2f8..cbcf4ab5a 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -197,6 +197,7 @@ var tests = []*components.IntegrationTest{ file.DiscardVariousChanges, file.DiscardVariousChangesRangeSelect, file.Gitignore, + file.GitignoreSpecialCharacters, file.RememberCommitMessageAfterFail, file.RenameSimilarityThresholdChange, file.RenamedFiles,