From c995e7ef2e73f5caaa3d8e8f46fadbf69e4c7139 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 25 Mar 2024 14:45:28 +0100 Subject: [PATCH 1/4] Cleanup: remove pointless condition and error message The file .git/info/exclude can't possibly show up in the files panel. --- pkg/gui/controllers/files_controller.go | 4 ---- pkg/i18n/english.go | 2 -- pkg/i18n/polish.go | 1 - pkg/i18n/russian.go | 1 - pkg/i18n/traditional_chinese.go | 1 - 5 files changed, 9 deletions(-) diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index 313c23b42..0c45e7af8 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -617,10 +617,6 @@ func (self *FilesController) ignore(node *filetree.FileNode) error { } func (self *FilesController) exclude(node *filetree.FileNode) error { - if node.GetPath() == ".git/info/exclude" { - return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeFileErr) - } - if node.GetPath() == ".gitignore" { return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeGitIgnoreErr) } diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index a31c8ceee..77e2432ad 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -873,7 +873,6 @@ type Actions struct { IgnoreExcludeFile string IgnoreFileErr string ExcludeFile string - ExcludeFileErr string ExcludeGitIgnoreErr string Commit string EditFile string @@ -1796,7 +1795,6 @@ func EnglishTranslationSet() TranslationSet { IgnoreExcludeFile: "Ignore or exclude file", IgnoreFileErr: "Cannot ignore .gitignore", ExcludeFile: "Exclude file", - ExcludeFileErr: "Cannot exclude .git/info/exclude", ExcludeGitIgnoreErr: "Cannot exclude .gitignore", Commit: "Commit", EditFile: "Edit file", diff --git a/pkg/i18n/polish.go b/pkg/i18n/polish.go index 3d3f26e06..a24d44ca2 100644 --- a/pkg/i18n/polish.go +++ b/pkg/i18n/polish.go @@ -807,7 +807,6 @@ func polishTranslationSet() TranslationSet { IgnoreExcludeFile: "Ignoruj lub wyklucz plik", IgnoreFileErr: "Nie można zignorować .gitignore", ExcludeFile: "Wyklucz plik", - ExcludeFileErr: "Nie można wykluczyć .git/info/exclude", ExcludeGitIgnoreErr: "Nie można wykluczyć .gitignore", Commit: "Commituj", EditFile: "Edytuj plik", diff --git a/pkg/i18n/russian.go b/pkg/i18n/russian.go index 0b4f2e618..5378d774e 100644 --- a/pkg/i18n/russian.go +++ b/pkg/i18n/russian.go @@ -599,7 +599,6 @@ func RussianTranslationSet() TranslationSet { IgnoreExcludeFile: "Игнорировать или исключить файл", IgnoreFileErr: "Невозможно игнорировать .gitignore", ExcludeFile: "Исключить файл", - ExcludeFileErr: "Невозможно исключить .git/info/exclude", ExcludeGitIgnoreErr: "Невозможно исключить .gitignore", Commit: "Коммит", EditFile: "Редактировать файл", diff --git a/pkg/i18n/traditional_chinese.go b/pkg/i18n/traditional_chinese.go index 54d283f00..56d2c99a0 100644 --- a/pkg/i18n/traditional_chinese.go +++ b/pkg/i18n/traditional_chinese.go @@ -667,7 +667,6 @@ func traditionalChineseTranslationSet() TranslationSet { IgnoreExcludeFile: "忽略或排除檔案", IgnoreFileErr: "無法忽略 .gitignore 檔案", ExcludeFile: "排除檔案", - ExcludeFileErr: "無法排除 .git/info/exclude 檔案", ExcludeGitIgnoreErr: "無法排除 .gitignore 檔案", Commit: "提交", EditFile: "編輯檔案", From 42ebf1947a1912b210fd3b5c01b5cc0d782e8e89 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 25 Mar 2024 15:21:50 +0100 Subject: [PATCH 2/4] Cleanup: simplify return statements --- pkg/gui/controllers/files_controller.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index 0c45e7af8..25d41cd6f 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -608,12 +608,7 @@ func (self *FilesController) ignore(node *filetree.FileNode) error { if node.GetPath() == ".gitignore" { return self.c.ErrorMsg(self.c.Tr.Actions.IgnoreFileErr) } - err := self.ignoreOrExcludeFile(node, self.c.Tr.IgnoreTracked, self.c.Tr.IgnoreTrackedPrompt, self.c.Tr.Actions.IgnoreExcludeFile, self.c.Git().WorkingTree.Ignore) - if err != nil { - return err - } - - return nil + return self.ignoreOrExcludeFile(node, self.c.Tr.IgnoreTracked, self.c.Tr.IgnoreTrackedPrompt, self.c.Tr.Actions.IgnoreExcludeFile, self.c.Git().WorkingTree.Ignore) } func (self *FilesController) exclude(node *filetree.FileNode) error { @@ -621,11 +616,7 @@ func (self *FilesController) exclude(node *filetree.FileNode) error { return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeGitIgnoreErr) } - err := self.ignoreOrExcludeFile(node, self.c.Tr.ExcludeTracked, self.c.Tr.ExcludeTrackedPrompt, self.c.Tr.Actions.ExcludeFile, self.c.Git().WorkingTree.Exclude) - if err != nil { - return err - } - return nil + return self.ignoreOrExcludeFile(node, self.c.Tr.ExcludeTracked, self.c.Tr.ExcludeTrackedPrompt, self.c.Tr.Actions.ExcludeFile, self.c.Git().WorkingTree.Exclude) } func (self *FilesController) ignoreOrExcludeMenu(node *filetree.FileNode) error { From de52a68b53a9c74c205d4f785ae6db0c5bb5d26d Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 25 Mar 2024 15:52:01 +0100 Subject: [PATCH 3/4] Add a test that demonstrates the problem Using the "Add to .git/info/exclude" in a worktree results in an error message, as the test shows. The same would happen in a submodule, but I'm not adding an extra test for that, as the circumstances are the same. --- pkg/integration/tests/test_list.go | 1 + .../worktree/exclude_file_in_worktree.go | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 pkg/integration/tests/worktree/exclude_file_in_worktree.go diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index c5a5b64d6..8f62ca7f5 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -308,6 +308,7 @@ var tests = []*components.IntegrationTest{ worktree.DetachWorktreeFromBranch, worktree.DotfileBareRepo, worktree.DoubleNestedLinkedSubmodule, + worktree.ExcludeFileInWorktree, worktree.FastForwardWorktreeBranch, worktree.ForceRemoveWorktree, worktree.RemoveWorktreeFromBranch, diff --git a/pkg/integration/tests/worktree/exclude_file_in_worktree.go b/pkg/integration/tests/worktree/exclude_file_in_worktree.go new file mode 100644 index 000000000..60d8d2b32 --- /dev/null +++ b/pkg/integration/tests/worktree/exclude_file_in_worktree.go @@ -0,0 +1,46 @@ +package worktree + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var ExcludeFileInWorktree = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Add a file to .git/info/exclude in a worktree", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("commit1") + shell.AddWorktree("HEAD", "../linked-worktree", "mybranch") + shell.CreateFile("../linked-worktree/toExclude", "") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Worktrees(). + Focus(). + Lines( + Contains("repo (main)").IsSelected(), + Contains("linked-worktree"), + ). + SelectNextItem(). + PressPrimaryAction() + + t.Views().Files(). + Focus(). + Lines( + Contains("toExclude"), + ). + Press(keys.Files.IgnoreFile). + Tap(func() { + t.ExpectPopup().Menu().Title(Equals("Ignore or exclude file")).Select(Contains("Add to .git/info/exclude")).Confirm() + }). + /* EXPECTED: + IsEmpty() + + t.FileSystem().FileContent("../repo/.git/info/exclude", Contains("toExclude")) + ACTUAL: */ + Tap(func() { + t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("open .git/info/exclude: not a directory")) + }) + }, +}) From 93251db67e013a7ab675af07ba437d7a71bd6c79 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 25 Mar 2024 14:41:51 +0100 Subject: [PATCH 4/4] Fix the "Add to .git/info/exclude" command in submodules or worktrees --- pkg/commands/git_commands/working_tree.go | 4 +++- pkg/integration/tests/worktree/exclude_file_in_worktree.go | 7 +------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/commands/git_commands/working_tree.go b/pkg/commands/git_commands/working_tree.go index 99665d7cc..c3338650a 100644 --- a/pkg/commands/git_commands/working_tree.go +++ b/pkg/commands/git_commands/working_tree.go @@ -3,6 +3,7 @@ package git_commands import ( "fmt" "os" + "path" "github.com/go-errors/errors" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -232,7 +233,8 @@ func (self *WorkingTreeCommands) Ignore(filename string) error { // Exclude adds a file to the .git/info/exclude for the repo func (self *WorkingTreeCommands) Exclude(filename string) error { - return self.os.AppendLineToFile(".git/info/exclude", filename) + excludeFile := path.Join(self.repoPaths.repoGitDirPath, "info", "exclude") + return self.os.AppendLineToFile(excludeFile, filename) } // WorktreeFileDiff returns the diff of a file diff --git a/pkg/integration/tests/worktree/exclude_file_in_worktree.go b/pkg/integration/tests/worktree/exclude_file_in_worktree.go index 60d8d2b32..ba3f9e5a5 100644 --- a/pkg/integration/tests/worktree/exclude_file_in_worktree.go +++ b/pkg/integration/tests/worktree/exclude_file_in_worktree.go @@ -34,13 +34,8 @@ var ExcludeFileInWorktree = NewIntegrationTest(NewIntegrationTestArgs{ Tap(func() { t.ExpectPopup().Menu().Title(Equals("Ignore or exclude file")).Select(Contains("Add to .git/info/exclude")).Confirm() }). - /* EXPECTED: IsEmpty() - t.FileSystem().FileContent("../repo/.git/info/exclude", Contains("toExclude")) - ACTUAL: */ - Tap(func() { - t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("open .git/info/exclude: not a directory")) - }) + t.FileSystem().FileContent("../repo/.git/info/exclude", Contains("toExclude")) }, })