From 1f42c8a387529ff055307ac49bd6a5fb397f1c9c Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Tue, 6 Jun 2023 08:30:44 +0200 Subject: [PATCH] Allow discarding changes only from local commits We use CommitFilesController also for the files of commits that we show elsewhere, e.g. for branch commits, tags, or stashes. It doesn't make sense to discard changes from those (for stashes it might be possible to implement it somehow, but that would be a new feature), so we disallow it unless we are in the local commits panel. --- .../controllers/commits_files_controller.go | 5 +++ pkg/i18n/english.go | 2 + .../stash/prevent_discarding_file_changes.go | 41 +++++++++++++++++++ pkg/integration/tests/test_list.go | 1 + 4 files changed, 49 insertions(+) create mode 100644 pkg/integration/tests/stash/prevent_discarding_file_changes.go diff --git a/pkg/gui/controllers/commits_files_controller.go b/pkg/gui/controllers/commits_files_controller.go index f4acc0d31..745186df0 100644 --- a/pkg/gui/controllers/commits_files_controller.go +++ b/pkg/gui/controllers/commits_files_controller.go @@ -153,6 +153,11 @@ func (self *CommitFilesController) checkout(node *filetree.CommitFileNode) error } func (self *CommitFilesController) discard(node *filetree.CommitFileNode) error { + parentContext, ok := self.c.CurrentContext().GetParentContext() + if !ok || parentContext.GetKey() != context.LOCAL_COMMITS_CONTEXT_KEY { + return self.c.ErrorMsg(self.c.Tr.CanOnlyDiscardFromLocalCommits) + } + if node.File == nil { return self.c.ErrorMsg(self.c.Tr.DiscardNotSupportedForDirectory) } diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 34d33f1ab..b291a0058 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -265,6 +265,7 @@ type TranslationSet struct { ViewItemFiles string CommitFilesTitle string CheckoutCommitFile string + CanOnlyDiscardFromLocalCommits string DiscardOldFileChange string DiscardFileChangesTitle string DiscardFileChangesPrompt string @@ -955,6 +956,7 @@ func EnglishTranslationSet() TranslationSet { ViewItemFiles: "View selected item's files", CommitFilesTitle: "Commit files", CheckoutCommitFile: "Checkout file", + CanOnlyDiscardFromLocalCommits: "Changes can only be discarded from local commits", DiscardOldFileChange: "Discard this commit's changes to this file", DiscardFileChangesTitle: "Discard file changes", DiscardFileChangesPrompt: "Are you sure you want to discard this commit's changes to this file?", diff --git a/pkg/integration/tests/stash/prevent_discarding_file_changes.go b/pkg/integration/tests/stash/prevent_discarding_file_changes.go new file mode 100644 index 000000000..9ee16b75c --- /dev/null +++ b/pkg/integration/tests/stash/prevent_discarding_file_changes.go @@ -0,0 +1,41 @@ +package stash + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var PreventDiscardingFileChanges = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Check that it is not allowed to discard changes to a file of a stash", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("initial commit") + shell.CreateFile("file", "content") + shell.GitAddAll() + shell.Stash("stash one") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Files().IsEmpty() + + t.Views().Stash(). + Focus(). + Lines( + Contains("stash one").IsSelected(), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file").IsSelected(), + ). + Press(keys.Universal.Remove) + + t.ExpectPopup().Confirmation(). + Title(Equals("Error")). + Content(Contains("Changes can only be discarded from local commits")). + Confirm() + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 7a5ed71b4..5e45d7e55 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -155,6 +155,7 @@ var tests = []*components.IntegrationTest{ stash.CreateBranch, stash.Drop, stash.Pop, + stash.PreventDiscardingFileChanges, stash.Rename, stash.Stash, stash.StashAll,