1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-03-03 15:02:52 +02:00

102 lines
2.7 KiB
Go
Raw Normal View History

package models
import "fmt"
2018-08-13 20:26:02 +10:00
// Branch : A git branch
// duplicating this for now
type Branch struct {
2020-03-26 20:29:35 +11:00
Name string
// the displayname is something like '(HEAD detached at 123asdf)', whereas in that case the name would be '123asdf'
2022-11-07 16:35:36 +11:00
DisplayName string
// indicator of when the branch was last checked out e.g. '2d', '3m'
Recency string
// how many commits ahead we are from the remote branch (how many commits we can push)
Pushables string
// how many commits behind we are from the remote branch (how many commits we can pull)
Pullables string
// whether the remote branch is 'gone' i.e. we're tracking a remote branch that has been deleted
2022-03-24 17:49:25 +11:00
UpstreamGone bool
2022-11-07 16:35:36 +11:00
// whether this is the current branch. Exactly one branch should have this be true
2022-03-24 17:49:25 +11:00
Head bool
DetachedHead bool
// if we have a named remote locally this will be the name of that remote e.g.
// 'origin' or 'tiwood'. If we don't have the remote locally it'll look like
// 'git@github.com:tiwood/lazygit.git'
UpstreamRemote string
UpstreamBranch string
2022-11-07 16:35:36 +11:00
// subject line in commit message
Subject string
// commit hash
CommitHash string
}
2020-08-19 22:57:22 +10:00
2022-05-12 19:16:58 +09:00
func (b *Branch) FullRefName() string {
if b.DetachedHead {
return b.Name
}
2022-05-12 19:16:58 +09:00
return "refs/heads/" + b.Name
}
2020-08-19 22:57:22 +10:00
func (b *Branch) RefName() string {
return b.Name
}
2022-03-26 22:18:08 +09:00
func (b *Branch) ParentRefName() string {
return b.RefName() + "^"
}
func (b *Branch) FullUpstreamRefName() string {
if b.UpstreamRemote == "" || b.UpstreamBranch == "" {
return ""
}
return fmt.Sprintf("refs/remotes/%s/%s", b.UpstreamRemote, b.UpstreamBranch)
}
func (b *Branch) ShortUpstreamRefName() string {
if b.UpstreamRemote == "" || b.UpstreamBranch == "" {
return ""
}
return fmt.Sprintf("%s/%s", b.UpstreamRemote, b.UpstreamBranch)
}
func (b *Branch) ID() string {
return b.RefName()
}
func (b *Branch) Description() string {
return b.RefName()
}
2021-06-05 15:56:50 +10:00
func (b *Branch) IsTrackingRemote() bool {
return b.UpstreamRemote != ""
}
// we know that the remote branch is not stored locally based on our pushable/pullable
// count being question marks.
func (b *Branch) RemoteBranchStoredLocally() bool {
return b.IsTrackingRemote() && b.Pushables != "?" && b.Pullables != "?"
2021-06-05 15:56:50 +10:00
}
2022-04-18 10:44:45 +10:00
func (b *Branch) RemoteBranchNotStoredLocally() bool {
return b.IsTrackingRemote() && b.Pushables == "?" && b.Pullables == "?"
}
2021-06-05 15:56:50 +10:00
func (b *Branch) MatchesUpstream() bool {
return b.RemoteBranchStoredLocally() && b.Pushables == "0" && b.Pullables == "0"
2021-06-05 15:56:50 +10:00
}
func (b *Branch) HasCommitsToPush() bool {
return b.RemoteBranchStoredLocally() && b.Pushables != "0"
2021-06-05 15:56:50 +10:00
}
func (b *Branch) HasCommitsToPull() bool {
return b.RemoteBranchStoredLocally() && b.Pullables != "0"
2021-06-05 15:56:50 +10:00
}
// for when we're in a detached head state
func (b *Branch) IsRealBranch() bool {
return b.Pushables != "" && b.Pullables != ""
}