82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
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)
|
|
}
|