package pama
import (
"fmt"
"git.sr.ht/~rjarry/aerc/lib/pama/models"
)
// RebaseCommits fetches the commits between baseID and HEAD. The tags from the
// current project will be mapped onto the fetched commits based on either the
// commit hash or the commit subject.
func (m PatchManager) RebaseCommits(p models.Project, baseID string) ([]models.Commit, error) {
rc, err := m.rc(p.RevctrlID, p.Root)
if err != nil {
return nil, revErr(err)
}
if !rc.Exists(baseID) {
return nil, fmt.Errorf("cannot rebase on %s. "+
"commit does not exist", baseID)
}
commitIDs, err := rc.History(baseID)
if err != nil {
return nil, err
}
commits := make([]models.Commit, len(commitIDs))
for i := 0; i < len(commitIDs); i++ {
commits[i] = models.NewCommit(
rc,
commitIDs[i],
models.Untracked,
)
}
// map tags from the commits from the project p
for i, r := range commits {
for _, c := range p.Commits {
if c.ID == r.ID || c.Subject == r.Subject {
commits[i].MessageId = c.MessageId
commits[i].Tag = c.Tag
break
}
}
}
return commits, nil
}
// SaveRebased checks if the commits actually exist in the repo, repopulate the
// info fields and saves the baseID for project p.
func (m PatchManager) SaveRebased(p models.Project, baseID string, commits []models.Commit) error {
rc, err := m.rc(p.RevctrlID, p.Root)
if err != nil {
return revErr(err)
}
exist := make([]models.Commit, 0, len(commits))
for _, c := range commits {
if !rc.Exists(c.ID) {
continue
}
exist = append(exist, c)
}
for i, c := range exist {
exist[i].Subject = rc.Subject(c.ID)
exist[i].Author = rc.Author(c.ID)
exist[i].Date = rc.Date(c.ID)
}
p.Commits = exist
if rc.Exists(baseID) {
p.Base = models.NewCommit(rc, baseID, "")
}
err = m.store().StoreProject(p, true)
return storeErr(err)
}