mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2025-02-21 02:55:37 -08:00
90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package segments
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
poshGitEnv = "POSH_GIT_STATUS"
|
|
)
|
|
|
|
type poshGit struct {
|
|
StashCount int `json:"StashCount"`
|
|
AheadBy int `json:"AheadBy"`
|
|
Index *poshGitStatus `json:"Index"`
|
|
RepoName string `json:"RepoName"`
|
|
HasWorking bool `json:"HasWorking"`
|
|
Branch string `json:"Branch"`
|
|
HasIndex bool `json:"HasIndex"`
|
|
GitDir string `json:"GitDir"`
|
|
BehindBy int `json:"BehindBy"`
|
|
HasUntracked bool `json:"HasUntracked"`
|
|
Working *poshGitStatus `json:"Working"`
|
|
Upstream string `json:"Upstream"`
|
|
}
|
|
|
|
type poshGitStatus struct {
|
|
Added []string `json:"Added"`
|
|
Modified []string `json:"Modified"`
|
|
Deleted []string `json:"Deleted"`
|
|
Unmerged []string `json:"Unmerged"`
|
|
}
|
|
|
|
func (s *GitStatus) parsePoshGitStatus(p *poshGitStatus) {
|
|
if p == nil {
|
|
return
|
|
}
|
|
s.Added = len(p.Added)
|
|
s.Deleted = len(p.Deleted)
|
|
s.Modified = len(p.Modified)
|
|
s.Unmerged = len(p.Unmerged)
|
|
}
|
|
|
|
func (g *Git) hasPoshGitStatus() bool {
|
|
envStatus := g.env.Getenv(poshGitEnv)
|
|
if len(envStatus) == 0 {
|
|
return false
|
|
}
|
|
var posh poshGit
|
|
err := json.Unmarshal([]byte(envStatus), &posh)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
g.setDir(posh.GitDir)
|
|
g.Working = &GitStatus{}
|
|
g.Working.parsePoshGitStatus(posh.Working)
|
|
g.Staging = &GitStatus{}
|
|
g.Staging.parsePoshGitStatus(posh.Index)
|
|
g.HEAD = g.parsePoshGitHEAD(posh.Branch)
|
|
g.stashCount = posh.StashCount
|
|
g.Ahead = posh.AheadBy
|
|
g.Behind = posh.BehindBy
|
|
g.UpstreamGone = len(posh.Upstream) == 0
|
|
g.Upstream = posh.Upstream
|
|
g.setBranchStatus()
|
|
if len(g.Upstream) != 0 && g.props.GetBool(FetchUpstreamIcon, false) {
|
|
g.UpstreamIcon = g.getUpstreamIcon()
|
|
}
|
|
g.poshgit = true
|
|
return true
|
|
}
|
|
|
|
func (g *Git) parsePoshGitHEAD(head string) string {
|
|
// commit
|
|
if strings.HasSuffix(head, "...)") {
|
|
head = strings.TrimLeft(head, "(")
|
|
head = strings.TrimRight(head, ".)")
|
|
return fmt.Sprintf("%s%s", g.props.GetString(CommitIcon, "\uF417"), head)
|
|
}
|
|
// tag
|
|
if strings.HasPrefix(head, "(") {
|
|
head = strings.TrimLeft(head, "(")
|
|
head = strings.TrimRight(head, ")")
|
|
return fmt.Sprintf("%s%s", g.props.GetString(TagIcon, "\uF412"), head)
|
|
}
|
|
// regular branch
|
|
return fmt.Sprintf("%s%s", g.props.GetString(BranchIcon, "\uE0A0"), g.formatHEAD(head))
|
|
}
|