Skip to content

Commit a79aa6d

Browse files
author
Joel Baranick
committed
Improve display of missing and link worktrees
1 parent ba775dd commit a79aa6d

File tree

8 files changed

+72
-57
lines changed

8 files changed

+72
-57
lines changed

pkg/commands/loaders/worktrees.go

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import (
44
"github.com/jesseduffield/lazygit/pkg/commands/models"
55
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
66
"github.com/jesseduffield/lazygit/pkg/common"
7-
"os"
8-
"path/filepath"
97
"strings"
108
)
119

@@ -25,11 +23,6 @@ func NewWorktreeLoader(
2523
}
2624

2725
func (self *WorktreeLoader) GetWorktrees() ([]*models.Worktree, error) {
28-
currentDir, err := os.Getwd()
29-
if err != nil {
30-
return nil, err
31-
}
32-
3326
worktreesOutput, err := self.cmd.New(`git worktree list --porcelain -z`).DontLog().RunWithOutput()
3427
if err != nil {
3528
return nil, err
@@ -46,20 +39,10 @@ func (self *WorktreeLoader) GetWorktrees() ([]*models.Worktree, error) {
4639
continue
4740
}
4841
if strings.HasPrefix(splitLine, "worktree ") {
49-
main := false
50-
name := "main"
5142
path := strings.SplitN(splitLine, " ", 2)[1]
52-
if len(worktrees) == 0 {
53-
main = true
54-
} else {
55-
name = filepath.Base(path)
56-
}
57-
5843
currentWorktree = &models.Worktree{
59-
Name: name,
60-
Path: path,
61-
Main: main,
62-
Current: path == currentDir,
44+
Id: len(worktrees),
45+
Path: path,
6346
}
6447
}
6548
}

pkg/commands/models/worktree.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
package models
22

3+
import (
4+
"fmt"
5+
"github.com/go-errors/errors"
6+
"io/fs"
7+
"log"
8+
"os"
9+
"path/filepath"
10+
)
11+
312
// Worktree : A git worktree
413
type Worktree struct {
5-
Name string
6-
Main bool
7-
Current bool
8-
Path string
14+
Id int
15+
Path string
916
}
1017

1118
func (w *Worktree) RefName() string {
12-
return w.Name
19+
return w.Name()
1320
}
1421

1522
func (w *Worktree) ID() string {
@@ -19,3 +26,30 @@ func (w *Worktree) ID() string {
1926
func (w *Worktree) Description() string {
2027
return w.RefName()
2128
}
29+
30+
func (w *Worktree) Name() string {
31+
return filepath.Base(w.Path)
32+
}
33+
34+
func (w *Worktree) Main() bool {
35+
return w.Id == 0
36+
}
37+
38+
func (w *Worktree) Current() bool {
39+
pwd, err := os.Getwd()
40+
if err != nil {
41+
log.Fatalln(err.Error())
42+
}
43+
44+
return pwd == w.Path
45+
}
46+
47+
func (w *Worktree) Missing() bool {
48+
if _, err := os.Stat(w.Path); err != nil {
49+
if errors.Is(err, fs.ErrNotExist) {
50+
return true
51+
}
52+
log.Fatalln(fmt.Errorf("failed to check if worktree path `%s` exists\n%w", w.Path, err).Error())
53+
}
54+
return false
55+
}

pkg/gui/controllers/helpers/worktree_helper.go

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package helpers
33
import (
44
"github.com/jesseduffield/lazygit/pkg/commands"
55
"github.com/jesseduffield/lazygit/pkg/gui/types"
6-
"path/filepath"
76
)
87

98
type IWorktreeHelper interface {
@@ -28,23 +27,23 @@ func NewWorktreeHelper(c *types.HelperCommon, git *commands.GitCommand, model *t
2827

2928
func (self *WorktreeHelper) GetMainWorktreeName() string {
3029
for _, worktree := range self.model.Worktrees {
31-
if worktree.Main {
32-
return filepath.Base(worktree.Path)
30+
if worktree.Main() {
31+
return worktree.Name()
3332
}
3433
}
3534

3635
return ""
3736
}
3837

39-
func (self *WorktreeHelper) GetCurrentWorktreeName() string {
40-
for _, worktree := range self.model.Worktrees {
41-
if worktree.Current {
42-
if worktree.Main {
43-
return ""
44-
}
45-
return worktree.Name
46-
}
47-
}
48-
49-
return ""
50-
}
38+
//func (self *WorktreeHelper) GetCurrentWorktreeName() string {
39+
// for _, worktree := range self.model.Worktrees {
40+
// if worktree.Current() {
41+
// if worktree.Main() {
42+
// return ""
43+
// }
44+
// return worktree.Name()
45+
// }
46+
// }
47+
//
48+
// return ""
49+
//}

pkg/gui/controllers/worktrees_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ func (self *WorktreesController) GetKeybindings(opts types.KeybindingsOpts) []*t
6666
//}
6767

6868
func (self *WorktreesController) delete(worktree *models.Worktree) error {
69-
if worktree.Main {
69+
if worktree.Main() {
7070
return self.c.ErrorMsg(self.c.Tr.CantDeleteMainWorktree)
7171
}
7272

73-
if worktree.Current {
73+
if worktree.Current() {
7474
return self.c.ErrorMsg(self.c.Tr.CantDeleteCurrentWorktree)
7575
}
7676

@@ -88,7 +88,7 @@ func (self *WorktreesController) deleteWithForce(worktree *models.Worktree, forc
8888
message := utils.ResolvePlaceholderString(
8989
templateStr,
9090
map[string]string{
91-
"worktreeName": worktree.Name,
91+
"worktreeName": worktree.Name(),
9292
},
9393
)
9494

pkg/gui/presentation/icons/git_icons.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func IconForRemote(remote *models.Remote) string {
6363
}
6464

6565
func IconForWorktree(worktree *models.Worktree, missing bool) string {
66-
if worktree.Main {
66+
if worktree.Main() {
6767
return ""
6868
}
6969
if missing {

pkg/gui/presentation/worktrees.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package presentation
22

33
import (
4-
"github.com/go-errors/errors"
54
"github.com/jesseduffield/generics/slices"
65
"github.com/jesseduffield/lazygit/pkg/commands/models"
76
"github.com/jesseduffield/lazygit/pkg/gui/presentation/icons"
87
"github.com/jesseduffield/lazygit/pkg/gui/style"
98
"github.com/jesseduffield/lazygit/pkg/theme"
10-
"io/fs"
11-
"os"
129
)
1310

1411
func GetWorktreeListDisplayStrings(worktrees []*models.Worktree) [][]string {
@@ -23,13 +20,13 @@ func getWorktreeDisplayStrings(w *models.Worktree) []string {
2320

2421
current := ""
2522
currentColor := style.FgCyan
26-
if w.Current {
23+
if w.Current() {
2724
current = " *"
2825
currentColor = style.FgGreen
2926
}
3027

3128
icon := icons.IconForWorktree(w, false)
32-
if _, err := os.Stat(w.Path); errors.Is(err, fs.ErrNotExist) {
29+
if w.Missing() {
3330
textStyle = style.FgRed
3431
icon = icons.IconForWorktree(w, true)
3532
}
@@ -39,6 +36,6 @@ func getWorktreeDisplayStrings(w *models.Worktree) []string {
3936
if icons.IsIconEnabled() {
4037
res = append(res, textStyle.Sprint(icon))
4138
}
42-
res = append(res, textStyle.Sprint(w.Name))
39+
res = append(res, textStyle.Sprint(w.Name()))
4340
return res
4441
}

pkg/gui/refresh.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -571,14 +571,12 @@ func (gui *Gui) refreshStatus() {
571571

572572
name := presentation.GetBranchTextStyle(currentBranch.Name).Sprint(currentBranch.Name)
573573
var repoName string
574-
worktreeName := gui.helpers.Worktree.GetCurrentWorktreeName()
575-
if len(worktreeName) > 0 {
576-
worktreeName = fmt.Sprintf("[%s]", worktreeName)
577-
repoName = gui.helpers.Worktree.GetMainWorktreeName()
578-
} else {
579-
repoName = utils.GetCurrentRepoName()
574+
repoName = utils.GetCurrentRepoName()
575+
mainWorktreeName := gui.helpers.Worktree.GetMainWorktreeName()
576+
if repoName != mainWorktreeName {
577+
repoName = fmt.Sprintf("%s(%s)", mainWorktreeName, style.FgBlue.Sprint(repoName))
580578
}
581-
status += fmt.Sprintf("%s%s → %s ", repoName, worktreeName, name)
579+
status += fmt.Sprintf("%s → %s ", repoName, name)
582580

583581
gui.setViewContent(gui.Views.Status, status)
584582
}

pkg/gui/worktrees_panel.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ func (gui *Gui) worktreesRenderToMain() error {
1515
if worktree == nil {
1616
task = types.NewRenderStringTask("No worktrees")
1717
} else {
18-
task = types.NewRenderStringTask(fmt.Sprintf("%s\nPath: %s", style.FgGreen.Sprint(worktree.Name), worktree.Path))
18+
missing := ""
19+
if worktree.Missing() {
20+
missing = style.FgRed.Sprint(" (missing)")
21+
}
22+
task = types.NewRenderStringTask(fmt.Sprintf("%s\nPath: %s%s", style.FgGreen.Sprint(worktree.Name()), worktree.Path, missing))
1923
}
2024

2125
return gui.c.RenderToMainViews(types.RefreshMainOpts{

0 commit comments

Comments
 (0)