mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-28 16:02:01 +03:00
Add more worktree tests
This commit is contained in:
@ -19,12 +19,16 @@ func NewBisectCommands(gitCommon *GitCommon) *BisectCommands {
|
||||
// This command is pretty cheap to run so we're not storing the result anywhere.
|
||||
// But if it becomes problematic we can chang that.
|
||||
func (self *BisectCommands) GetInfo() *BisectInfo {
|
||||
return self.GetInfoForGitDir(self.dotGitDir)
|
||||
}
|
||||
|
||||
func (self *BisectCommands) GetInfoForGitDir(gitDir string) *BisectInfo {
|
||||
var err error
|
||||
info := &BisectInfo{started: false, log: self.Log, newTerm: "bad", oldTerm: "good"}
|
||||
// we return nil if we're not in a git bisect session.
|
||||
// we know we're in a session by the presence of a .git/BISECT_START file
|
||||
|
||||
bisectStartPath := filepath.Join(self.dotGitDir, "BISECT_START")
|
||||
bisectStartPath := filepath.Join(gitDir, "BISECT_START")
|
||||
exists, err := self.os.FileExists(bisectStartPath)
|
||||
if err != nil {
|
||||
self.Log.Infof("error getting git bisect info: %s", err.Error())
|
||||
@ -44,7 +48,7 @@ func (self *BisectCommands) GetInfo() *BisectInfo {
|
||||
info.started = true
|
||||
info.start = strings.TrimSpace(string(startContent))
|
||||
|
||||
termsContent, err := os.ReadFile(filepath.Join(self.dotGitDir, "BISECT_TERMS"))
|
||||
termsContent, err := os.ReadFile(filepath.Join(gitDir, "BISECT_TERMS"))
|
||||
if err != nil {
|
||||
// old git versions won't have this file so we default to bad/good
|
||||
} else {
|
||||
@ -53,7 +57,7 @@ func (self *BisectCommands) GetInfo() *BisectInfo {
|
||||
info.oldTerm = splitContent[1]
|
||||
}
|
||||
|
||||
bisectRefsDir := filepath.Join(self.dotGitDir, "refs", "bisect")
|
||||
bisectRefsDir := filepath.Join(gitDir, "refs", "bisect")
|
||||
files, err := os.ReadDir(bisectRefsDir)
|
||||
if err != nil {
|
||||
self.Log.Infof("error getting git bisect info: %s", err.Error())
|
||||
@ -85,7 +89,7 @@ func (self *BisectCommands) GetInfo() *BisectInfo {
|
||||
info.statusMap[sha] = status
|
||||
}
|
||||
|
||||
currentContent, err := os.ReadFile(filepath.Join(self.dotGitDir, "BISECT_EXPECTED_REV"))
|
||||
currentContent, err := os.ReadFile(filepath.Join(gitDir, "BISECT_EXPECTED_REV"))
|
||||
if err != nil {
|
||||
self.Log.Infof("error getting git bisect info: %s", err.Error())
|
||||
return info
|
||||
|
@ -48,10 +48,23 @@ func (self *WorktreeLoader) GetWorktrees() ([]*models.Worktree, error) {
|
||||
}
|
||||
if strings.HasPrefix(splitLine, "worktree ") {
|
||||
path := strings.SplitN(splitLine, " ", 2)[1]
|
||||
isMain := path == currentRepoPath
|
||||
|
||||
var gitDir string
|
||||
if isMain {
|
||||
gitDir = filepath.Join(path, ".git")
|
||||
} else {
|
||||
var ok bool
|
||||
gitDir, ok = LinkedWorktreeGitPath(path)
|
||||
if !ok {
|
||||
self.Log.Warnf("Could not find git dir for worktree %s", path)
|
||||
}
|
||||
}
|
||||
|
||||
current = &models.Worktree{
|
||||
IsMain: path == currentRepoPath,
|
||||
Path: path,
|
||||
GitDir: gitDir,
|
||||
}
|
||||
} else if strings.HasPrefix(splitLine, "branch ") {
|
||||
branch := strings.SplitN(splitLine, " ", 2)[1]
|
||||
@ -91,9 +104,21 @@ func (self *WorktreeLoader) GetWorktrees() ([]*models.Worktree, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
// If we couldn't find the git directory, we can't find the branch name
|
||||
if worktree.GitDir == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
rebaseBranch, ok := rebaseBranch(worktree)
|
||||
if ok {
|
||||
worktree.Branch = rebaseBranch
|
||||
continue
|
||||
}
|
||||
|
||||
bisectBranch, ok := bisectBranch(worktree)
|
||||
if ok {
|
||||
worktree.Branch = bisectBranch
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,29 +126,25 @@ func (self *WorktreeLoader) GetWorktrees() ([]*models.Worktree, error) {
|
||||
}
|
||||
|
||||
func rebaseBranch(worktree *models.Worktree) (string, bool) {
|
||||
var gitPath string
|
||||
if worktree.Main() {
|
||||
gitPath = filepath.Join(worktree.Path, ".git")
|
||||
} else {
|
||||
// need to find the path of the linked worktree in the .git dir
|
||||
var ok bool
|
||||
gitPath, ok = LinkedWorktreeGitPath(worktree.Path)
|
||||
if !ok {
|
||||
return "", false
|
||||
for _, dir := range []string{"rebase-merge", "rebase-apply"} {
|
||||
if bytesContent, err := os.ReadFile(filepath.Join(worktree.GitDir, dir, "head-name")); err == nil {
|
||||
headName := strings.TrimSpace(string(bytesContent))
|
||||
shortHeadName := strings.TrimPrefix(headName, "refs/heads/")
|
||||
return shortHeadName, true
|
||||
}
|
||||
}
|
||||
|
||||
// now we look inside that git path for a file `rebase-merge/head-name`
|
||||
// if it exists, we update the worktree to say that it has that for a head
|
||||
headNameContents, err := os.ReadFile(filepath.Join(gitPath, "rebase-merge", "head-name"))
|
||||
return "", false
|
||||
}
|
||||
|
||||
func bisectBranch(worktree *models.Worktree) (string, bool) {
|
||||
bisectStartPath := filepath.Join(worktree.GitDir, "BISECT_START")
|
||||
startContent, err := os.ReadFile(bisectStartPath)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
|
||||
headName := strings.TrimSpace(string(headNameContents))
|
||||
shortHeadName := strings.TrimPrefix(headName, "refs/heads/")
|
||||
|
||||
return shortHeadName, true
|
||||
return strings.TrimSpace(string(startContent)), true
|
||||
}
|
||||
|
||||
func LinkedWorktreeGitPath(worktreePath string) (string, bool) {
|
||||
|
Reference in New Issue
Block a user