2020-09-29 10:36:54 +02:00
|
|
|
package models
|
2018-09-17 13:02:30 +02:00
|
|
|
|
2022-01-19 09:32:27 +02:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2023-04-03 12:42:29 +02:00
|
|
|
"github.com/fsmiamoto/git-todo-parser/todo"
|
2022-01-19 09:32:27 +02:00
|
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
|
|
)
|
2020-08-16 14:01:14 +02:00
|
|
|
|
2022-03-26 15:03:32 +02:00
|
|
|
// Special commit hash for empty tree object
|
|
|
|
const EmptyTreeCommitHash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
|
|
|
|
|
2023-04-03 12:40:29 +02:00
|
|
|
type CommitStatus int
|
|
|
|
|
|
|
|
const (
|
|
|
|
StatusNone CommitStatus = iota
|
|
|
|
StatusUnpushed
|
|
|
|
StatusPushed
|
|
|
|
StatusMerged
|
|
|
|
StatusRebasing
|
|
|
|
StatusSelected
|
|
|
|
StatusReflog
|
|
|
|
)
|
|
|
|
|
2023-04-03 12:42:29 +02:00
|
|
|
const (
|
|
|
|
// Conveniently for us, the todo package starts the enum at 1, and given
|
|
|
|
// that it doesn't have a "none" value, we're setting ours to 0
|
|
|
|
ActionNone todo.TodoCommand = 0
|
2023-02-26 12:51:02 +02:00
|
|
|
// "Comment" is the last one of the todo package's enum entries
|
|
|
|
ActionConflict = todo.Comment + 1
|
2023-04-03 12:42:29 +02:00
|
|
|
)
|
|
|
|
|
2023-08-05 11:50:11 +02:00
|
|
|
type Divergence int
|
|
|
|
|
|
|
|
// For a divergence log (left/right comparison of two refs) this is set to
|
|
|
|
// either DivergenceLeft or DivergenceRight for each commit; for normal
|
|
|
|
// commit views it is always DivergenceNone.
|
|
|
|
const (
|
|
|
|
DivergenceNone Divergence = iota
|
|
|
|
DivergenceLeft
|
|
|
|
DivergenceRight
|
|
|
|
)
|
|
|
|
|
2018-09-17 13:02:30 +02:00
|
|
|
// Commit : A git commit
|
|
|
|
type Commit struct {
|
2020-03-27 10:12:15 +02:00
|
|
|
Sha string
|
|
|
|
Name string
|
2023-04-03 12:40:29 +02:00
|
|
|
Status CommitStatus
|
2023-04-03 12:42:29 +02:00
|
|
|
Action todo.TodoCommand
|
2020-03-27 10:12:15 +02:00
|
|
|
Tags []string
|
|
|
|
ExtraInfo string // something like 'HEAD -> master, tag: v0.15.2'
|
2022-05-08 06:23:29 +02:00
|
|
|
AuthorName string // something like 'Jesse Duffield'
|
|
|
|
AuthorEmail string // something like 'jessedduffield@gmail.com'
|
2020-03-27 10:12:15 +02:00
|
|
|
UnixTimestamp int64
|
2023-08-05 11:50:11 +02:00
|
|
|
Divergence Divergence // set to DivergenceNone unless we are showing the divergence view
|
2020-08-27 09:00:43 +02:00
|
|
|
|
2021-06-05 08:39:59 +02:00
|
|
|
// SHAs of parent commits (will be multiple if it's a merge commit)
|
|
|
|
Parents []string
|
2018-09-17 13:02:30 +02:00
|
|
|
}
|
2020-03-26 00:18:52 +02:00
|
|
|
|
|
|
|
func (c *Commit) ShortSha() string {
|
2022-01-19 09:32:27 +02:00
|
|
|
return utils.ShortSha(c.Sha)
|
2020-03-26 00:18:52 +02:00
|
|
|
}
|
2020-08-16 14:01:14 +02:00
|
|
|
|
2022-05-12 12:16:58 +02:00
|
|
|
func (c *Commit) FullRefName() string {
|
|
|
|
return c.Sha
|
|
|
|
}
|
|
|
|
|
2020-08-19 14:57:22 +02:00
|
|
|
func (c *Commit) RefName() string {
|
|
|
|
return c.Sha
|
|
|
|
}
|
2020-08-22 01:01:14 +02:00
|
|
|
|
2022-03-26 15:03:32 +02:00
|
|
|
func (c *Commit) ParentRefName() string {
|
|
|
|
if c.IsFirstCommit() {
|
|
|
|
return EmptyTreeCommitHash
|
|
|
|
}
|
|
|
|
return c.RefName() + "^"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Commit) IsFirstCommit() bool {
|
|
|
|
return len(c.Parents) == 0
|
|
|
|
}
|
|
|
|
|
2020-08-22 01:01:14 +02:00
|
|
|
func (c *Commit) ID() string {
|
|
|
|
return c.RefName()
|
|
|
|
}
|
2020-08-22 02:14:53 +02:00
|
|
|
|
|
|
|
func (c *Commit) Description() string {
|
|
|
|
return fmt.Sprintf("%s %s", c.Sha[:7], c.Name)
|
|
|
|
}
|
2021-06-05 08:39:59 +02:00
|
|
|
|
|
|
|
func (c *Commit) IsMerge() bool {
|
|
|
|
return len(c.Parents) > 1
|
|
|
|
}
|
2022-01-22 03:56:57 +02:00
|
|
|
|
|
|
|
// returns true if this commit is not actually in the git log but instead
|
|
|
|
// is from a TODO file for an interactive rebase.
|
|
|
|
func (c *Commit) IsTODO() bool {
|
2023-04-03 12:42:29 +02:00
|
|
|
return c.Action != ActionNone
|
2022-01-22 03:56:57 +02:00
|
|
|
}
|
2023-03-03 20:53:15 +02:00
|
|
|
|
|
|
|
func IsHeadCommit(commits []*Commit, index int) bool {
|
|
|
|
return !commits[index].IsTODO() && (index == 0 || commits[index-1].IsTODO())
|
|
|
|
}
|