Separate leafs and HEAD

This commit is contained in:
Quentin 2021-04-22 11:20:52 +02:00
parent 9fd13f759a
commit 68795d1f38
Signed by: quentin
GPG Key ID: A98E9B769E4FF428
1 changed files with 23 additions and 27 deletions

View File

@ -16,8 +16,9 @@ type RepoCommits struct {
Config configCollect
CommitDesc map[string]string
CommitContent map[string]*CommitNode
Head *CommitNode
Root *CommitNode
Leafs map[*CommitNode]Empty
Head *CommitNode
}
type CommitNode struct {
@ -58,12 +59,15 @@ func cmdCommit(config configCollect) {
rc := NewRepoCommits(config)
rc.CollectDescs()
rc.PrintDescs()
log.Println("Repo contains", len(rc.CommitDesc), "commits")
rc.CollectContent()
rc.BuildGraph()
rc.FindHead()
rc.PrintHead()
rc.FindLeafs()
log.Println("Repo has", len(rc.Leafs), "leafs")
rc.ChooseHead()
log.Println("Proposing following HEAD:\n"+rc.Head.Content.String())
}
func NewRepoCommits (config configCollect) *RepoCommits {
@ -71,6 +75,7 @@ func NewRepoCommits (config configCollect) *RepoCommits {
rc.Config = config
rc.CommitDesc = make(map[string]string)
rc.CommitContent = make(map[string]*CommitNode)
rc.Leafs = make(map[*CommitNode]Empty)
return rc
}
@ -90,19 +95,6 @@ func (rc* RepoCommits) CollectDescs() {
}
}
func (rc* RepoCommits) PrintDescs() {
/*limit := 10
for id, path := range rc.CommitDesc {
log.Println(id, path)
limit = limit - 1
if limit < 0 {
log.Println("Too many commits, output has been truncated")
break
}
}*/
log.Println("Repo", rc.Config.RepoId, "contains", len(rc.CommitDesc), "commits")
}
func NewCommitNode(c Commit) *CommitNode {
cn := new(CommitNode)
cn.Content = c
@ -153,7 +145,7 @@ func (rc* RepoCommits) BuildGraph() *CommitNode {
return rc.Root
}
func (rc* RepoCommits) FindHead() *CommitNode {
func (rc* RepoCommits) FindLeafs() map[*CommitNode]Empty {
toProcess := make(map[*CommitNode]Empty)
toProcess[rc.Root] = empty
@ -164,21 +156,25 @@ func (rc* RepoCommits) FindHead() *CommitNode {
nextToProcess[ccn] = empty
}
if len(cn.Children) == 0 {
if rc.Head == nil {
rc.Head = cn
} else {
log.Fatal("More than one HEAD has been found")
}
rc.Leafs[cn] = empty
}
}
toProcess = nextToProcess
}
if len(rc.Leafs) == 0 { log.Fatal("No leafs have been found") }
return rc.Leafs
}
func (rc* RepoCommits) ChooseHead() *CommitNode {
for cn, _ := range rc.Leafs {
if rc.Head == nil {
rc.Head = cn
} else if rc.Head.Content.Ctime < cn.Content.Ctime {
rc.Head = cn
}
}
if rc.Head == nil { log.Fatal("No HEAD has been found") }
return rc.Head
}
func (rc* RepoCommits) PrintHead() {
log.Println(rc.Head.Content.String())
}