1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-08-06 22:33:07 +02:00

feat: introduce a copy menu into the file view

This commit is contained in:
AzraelSec
2023-11-02 23:31:38 +01:00
committed by Stefan Haller
parent 2162e5ff64
commit c7012528fc
8 changed files with 351 additions and 0 deletions

View File

@ -0,0 +1,185 @@
package file
import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)
// note: this is required to simulate the clipboard during CI
func expectClipboard(t *TestDriver, matcher *TextMatcher) {
defer t.Shell().DeleteFile("clipboard")
t.FileSystem().FileContent("clipboard", matcher)
}
var CopyMenu = NewIntegrationTest(NewIntegrationTestArgs{
Description: "The copy menu allows to copy name and diff of selected/all files",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {
config.UserConfig.OS.CopyToClipboardCmd = "echo {{text}} > clipboard"
},
SetupRepo: func(shell *Shell) {},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
// Disabled item
t.Views().Files().
IsEmpty().
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("File name")).
Tooltip(Equals("Disabled: Nothing to copy")).
Confirm()
t.ExpectPopup().Alert().
Title(Equals("Error")).
Content(Equals("Nothing to copy")).
Confirm()
})
t.Shell().
CreateDir("dir").
CreateFile("dir/1-unstaged_file", "unstaged content")
// Empty content (new file)
t.Views().Files().
Press(keys.Universal.Refresh).
Lines(
Contains("dir").IsSelected(),
Contains("unstaged_file"),
).
SelectNextItem().
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of selected file")).
Tooltip(Contains("Disabled: Nothing to copy")).
Confirm()
t.ExpectPopup().Alert().
Title(Equals("Error")).
Content(Equals("Nothing to copy")).
Confirm()
}).
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of all files")).
Tooltip(Contains("Disabled: Nothing to copy")).
Confirm()
t.ExpectPopup().Alert().
Title(Equals("Error")).
Content(Equals("Nothing to copy")).
Confirm()
})
t.Shell().
GitAdd("dir/1-unstaged_file").
Commit("commit-unstaged").
UpdateFile("dir/1-unstaged_file", "unstaged content (new)").
CreateFileAndAdd("dir/2-staged_file", "staged content").
Commit("commit-staged").
UpdateFile("dir/2-staged_file", "staged content (new)").
GitAdd("dir/2-staged_file")
// Copy file name
t.Views().Files().
Press(keys.Universal.Refresh).
Lines(
Contains("dir"),
Contains("unstaged_file").IsSelected(),
Contains("staged_file"),
).
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("File name")).
Confirm()
expectClipboard(t, Contains("unstaged_file"))
})
// Copy file path
t.Views().Files().
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Path")).
Confirm()
expectClipboard(t, Contains("dir/1-unstaged_file"))
})
// Selected path diff on a single (unstaged) file
t.Views().Files().
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of selected file")).
Tooltip(Equals("If there are staged items, this command considers only them. Otherwise, it considers all the unstaged ones.")).
Confirm()
expectClipboard(t, Contains("+unstaged content (new)"))
})
// Selected path diff with staged and unstaged files
t.Views().Files().
SelectPreviousItem().
Lines(
Contains("dir").IsSelected(),
Contains("unstaged_file"),
Contains("staged_file"),
).
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of selected file")).
Tooltip(Equals("If there are staged items, this command considers only them. Otherwise, it considers all the unstaged ones.")).
Confirm()
expectClipboard(t, Contains("+staged content (new)"))
})
// All files diff with staged files
t.Views().Files().
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of all files")).
Tooltip(Equals("If there are staged items, this command considers only them. Otherwise, it considers all the unstaged ones.")).
Confirm()
expectClipboard(t, Contains("+staged content (new)"))
})
// All files diff with no staged files
t.Views().Files().
SelectNextItem().
SelectNextItem().
Lines(
Contains("dir"),
Contains("unstaged_file"),
Contains("staged_file").IsSelected(),
).
Press(keys.Universal.Select).
Press(keys.Files.CopyFileInfoToClipboard).
Tap(func() {
t.ExpectPopup().Menu().
Title(Equals("Copy to clipboard")).
Select(Contains("Diff of all files")).
Tooltip(Equals("If there are staged items, this command considers only them. Otherwise, it considers all the unstaged ones.")).
Confirm()
expectClipboard(t, Contains("+staged content (new)").Contains("+unstaged content (new)"))
})
},
})

View File

@ -117,6 +117,7 @@ var tests = []*components.IntegrationTest{
diff.DiffAndApplyPatch,
diff.DiffCommits,
diff.IgnoreWhitespace,
file.CopyMenu,
file.DirWithUntrackedFile,
file.DiscardAllDirChanges,
file.DiscardChanges,