Fix copying a file's absolute path when running in a linked worktree (#5523)

When copying a file's absolute path in a worktree, the result would be
relative to the main repo rather than the worktree you're in.

Fixes #5522.
This commit is contained in:
Stefan Haller 2026-04-19 11:35:16 +02:00 committed by GitHub
commit ce7f8a829d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 28 additions and 7 deletions

View file

@ -248,7 +248,11 @@ func (self *CommitFilesController) openCopyMenu() error {
copyAbsolutePathItem := &types.MenuItem{
Label: self.c.Tr.CopyAbsoluteFilePath,
OnPress: func() error {
if err := self.c.OS().CopyToClipboard(filepath.Join(self.c.Git().RepoPaths.RepoPath(), node.GetPath())); err != nil {
absPath, err := filepath.Abs(node.GetPath())
if err != nil {
return err
}
if err := self.c.OS().CopyToClipboard(absPath); err != nil {
return err
}
self.c.Toast(self.c.Tr.FilePathCopiedToast)

View file

@ -1199,7 +1199,11 @@ func (self *FilesController) openCopyMenu() error {
copyAbsolutePathItem := &types.MenuItem{
Label: self.c.Tr.CopyAbsoluteFilePath,
OnPress: func() error {
if err := self.c.OS().CopyToClipboard(filepath.Join(self.c.Git().RepoPaths.RepoPath(), node.GetPath())); err != nil {
absPath, err := filepath.Abs(node.GetPath())
if err != nil {
return err
}
if err := self.c.OS().CopyToClipboard(absPath); err != nil {
return err
}
self.c.Toast(self.c.Tr.FilePathCopiedToast)

View file

@ -22,6 +22,12 @@ var CopyToClipboard = NewIntegrationTest(NewIntegrationTestArgs{
config.GetUserConfig().OS.CopyToClipboardCmd = "printf '%s' {{text}} > clipboard"
},
SetupRepo: func(shell *Shell) {
// Run the test in a linked worktree so that we catch bugs where we
// use the main repo's path instead of the current worktree's path.
shell.EmptyCommit("initial commit")
shell.AddWorktree("HEAD", "../linked-worktree", "mybranch")
shell.Chdir("../linked-worktree")
shell.CreateDir("dir")
shell.CreateFileAndAdd("dir/file1", "1st line\n")
shell.Commit("1")
@ -38,6 +44,7 @@ var CopyToClipboard = NewIntegrationTest(NewIntegrationTestArgs{
Contains("3").IsSelected(),
Contains("2"),
Contains("1"),
Contains("initial commit"),
).
SelectNextItem().
PressEnter()
@ -80,9 +87,9 @@ var CopyToClipboard = NewIntegrationTest(NewIntegrationTestArgs{
Confirm().
Tap(func() {
t.ExpectToast(Equals("File path copied to clipboard"))
repoDir, _ := os.Getwd()
worktreeDir, _ := os.Getwd()
// On windows the following path would have backslashes, but we don't run integration tests on windows yet.
expectClipboard(t, Equals(repoDir+"/dir/file1"))
expectClipboard(t, Equals(worktreeDir+"/dir/file1"))
})
}).
Press(keys.Files.CopyFileInfoToClipboard).

View file

@ -21,7 +21,13 @@ var CopyMenu = NewIntegrationTest(NewIntegrationTestArgs{
SetupConfig: func(config *config.AppConfig) {
config.GetUserConfig().OS.CopyToClipboardCmd = "printf '%s' {{text}} > clipboard"
},
SetupRepo: func(shell *Shell) {},
SetupRepo: func(shell *Shell) {
// Run the test in a linked worktree so that we catch bugs where we
// use the main repo's path instead of the current worktree's path.
shell.EmptyCommit("initial commit")
shell.AddWorktree("HEAD", "../linked-worktree", "mybranch")
shell.Chdir("../linked-worktree")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
// Disabled item
t.Views().Files().
@ -130,9 +136,9 @@ var CopyMenu = NewIntegrationTest(NewIntegrationTestArgs{
t.ExpectToast(Equals("File path copied to clipboard"))
repoDir, _ := os.Getwd()
worktreeDir, _ := os.Getwd()
// On windows the following path would have backslashes, but we don't run integration tests on windows yet.
expectClipboard(t, Equals(repoDir+"/dir/1-unstaged_file"))
expectClipboard(t, Equals(worktreeDir+"/dir/1-unstaged_file"))
})
// Selected path diff on a single (unstaged) file