diff options
Diffstat (limited to 'modules/repository/commits.go')
-rw-r--r-- | modules/repository/commits.go | 131 |
1 files changed, 74 insertions, 57 deletions
diff --git a/modules/repository/commits.go b/modules/repository/commits.go index 6b67c2c262..eaaf3b8b19 100644 --- a/modules/repository/commits.go +++ b/modules/repository/commits.go @@ -28,8 +28,8 @@ type PushCommit struct { // PushCommits represents list of commits in a push operation. type PushCommits struct { - Len int Commits []*PushCommit + HeadCommit *PushCommit CompareURL string avatars map[string]string @@ -44,67 +44,88 @@ func NewPushCommits() *PushCommits { } } -// ToAPIPayloadCommits converts a PushCommits object to -// api.PayloadCommit format. -func (pc *PushCommits) ToAPIPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, error) { - commits := make([]*api.PayloadCommit, len(pc.Commits)) - - if pc.emailUsers == nil { - pc.emailUsers = make(map[string]*models.User) - } +// toAPIPayloadCommit converts a single PushCommit to an api.PayloadCommit object. +func (pc *PushCommits) toAPIPayloadCommit(repoPath, repoLink string, commit *PushCommit) (*api.PayloadCommit, error) { var err error - for i, commit := range pc.Commits { - authorUsername := "" - author, ok := pc.emailUsers[commit.AuthorEmail] - if !ok { - author, err = models.GetUserByEmail(commit.AuthorEmail) - if err == nil { - authorUsername = author.Name - pc.emailUsers[commit.AuthorEmail] = author - } - } else { + authorUsername := "" + author, ok := pc.emailUsers[commit.AuthorEmail] + if !ok { + author, err = models.GetUserByEmail(commit.AuthorEmail) + if err == nil { authorUsername = author.Name + pc.emailUsers[commit.AuthorEmail] = author } + } else { + authorUsername = author.Name + } - committerUsername := "" - committer, ok := pc.emailUsers[commit.CommitterEmail] - if !ok { - committer, err = models.GetUserByEmail(commit.CommitterEmail) - if err == nil { - // TODO: check errors other than email not found. - committerUsername = committer.Name - pc.emailUsers[commit.CommitterEmail] = committer - } - } else { + committerUsername := "" + committer, ok := pc.emailUsers[commit.CommitterEmail] + if !ok { + committer, err = models.GetUserByEmail(commit.CommitterEmail) + if err == nil { + // TODO: check errors other than email not found. committerUsername = committer.Name + pc.emailUsers[commit.CommitterEmail] = committer } + } else { + committerUsername = committer.Name + } - fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1) + fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1) + if err != nil { + return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err) + } + + return &api.PayloadCommit{ + ID: commit.Sha1, + Message: commit.Message, + URL: fmt.Sprintf("%s/commit/%s", repoLink, commit.Sha1), + Author: &api.PayloadUser{ + Name: commit.AuthorName, + Email: commit.AuthorEmail, + UserName: authorUsername, + }, + Committer: &api.PayloadUser{ + Name: commit.CommitterName, + Email: commit.CommitterEmail, + UserName: committerUsername, + }, + Added: fileStatus.Added, + Removed: fileStatus.Removed, + Modified: fileStatus.Modified, + Timestamp: commit.Timestamp, + }, nil +} + +// ToAPIPayloadCommits converts a PushCommits object to api.PayloadCommit format. +// It returns all converted commits and, if provided, the head commit or an error otherwise. +func (pc *PushCommits) ToAPIPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, *api.PayloadCommit, error) { + commits := make([]*api.PayloadCommit, len(pc.Commits)) + var headCommit *api.PayloadCommit + + if pc.emailUsers == nil { + pc.emailUsers = make(map[string]*models.User) + } + for i, commit := range pc.Commits { + apiCommit, err := pc.toAPIPayloadCommit(repoPath, repoLink, commit) if err != nil { - return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err) + return nil, nil, err } - commits[i] = &api.PayloadCommit{ - ID: commit.Sha1, - Message: commit.Message, - URL: fmt.Sprintf("%s/commit/%s", repoLink, commit.Sha1), - Author: &api.PayloadUser{ - Name: commit.AuthorName, - Email: commit.AuthorEmail, - UserName: authorUsername, - }, - Committer: &api.PayloadUser{ - Name: commit.CommitterName, - Email: commit.CommitterEmail, - UserName: committerUsername, - }, - Added: fileStatus.Added, - Removed: fileStatus.Removed, - Modified: fileStatus.Modified, - Timestamp: commit.Timestamp, + commits[i] = apiCommit + if pc.HeadCommit != nil && pc.HeadCommit.Sha1 == commits[i].ID { + headCommit = apiCommit } } - return commits, nil + if pc.HeadCommit != nil && headCommit == nil { + var err error + headCommit, err = pc.toAPIPayloadCommit(repoPath, repoLink, pc.HeadCommit) + if err != nil { + return nil, nil, err + } + } + return commits, headCommit, nil } // AvatarLink tries to match user in database with e-mail @@ -157,13 +178,9 @@ func CommitToPushCommit(commit *git.Commit) *PushCommit { // ListToPushCommits transforms a list.List to PushCommits type. func ListToPushCommits(l *list.List) *PushCommits { var commits []*PushCommit - var actEmail string for e := l.Front(); e != nil; e = e.Next() { - commit := e.Value.(*git.Commit) - if actEmail == "" { - actEmail = commit.Committer.Email - } - commits = append(commits, CommitToPushCommit(commit)) + commit := CommitToPushCommit(e.Value.(*git.Commit)) + commits = append(commits, commit) } - return &PushCommits{l.Len(), commits, "", make(map[string]string), make(map[string]*models.User)} + return &PushCommits{commits, nil, "", make(map[string]string), make(map[string]*models.User)} } |