Move push commits from models to modules/repository (#9370)
* Move push commits from models to modules/repository * fix test * fix test * fix test * fix test * fix test Co-authored-by: zeripath <art27@cantab.net>tokarchuk/v1.17
parent
384c2b342e
commit
99d869fa63
@ -1,86 +0,0 @@ |
|||||||
// Copyright 2016 The Gitea Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a MIT-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package models |
|
||||||
|
|
||||||
import ( |
|
||||||
"container/list" |
|
||||||
"testing" |
|
||||||
"time" |
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/git" |
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert" |
|
||||||
) |
|
||||||
|
|
||||||
func TestCommitToPushCommit(t *testing.T) { |
|
||||||
now := time.Now() |
|
||||||
sig := &git.Signature{ |
|
||||||
Email: "example@example.com", |
|
||||||
Name: "John Doe", |
|
||||||
When: now, |
|
||||||
} |
|
||||||
const hexString = "0123456789abcdef0123456789abcdef01234567" |
|
||||||
sha1, err := git.NewIDFromString(hexString) |
|
||||||
assert.NoError(t, err) |
|
||||||
pushCommit := CommitToPushCommit(&git.Commit{ |
|
||||||
ID: sha1, |
|
||||||
Author: sig, |
|
||||||
Committer: sig, |
|
||||||
CommitMessage: "Commit Message", |
|
||||||
}) |
|
||||||
assert.Equal(t, hexString, pushCommit.Sha1) |
|
||||||
assert.Equal(t, "Commit Message", pushCommit.Message) |
|
||||||
assert.Equal(t, "example@example.com", pushCommit.AuthorEmail) |
|
||||||
assert.Equal(t, "John Doe", pushCommit.AuthorName) |
|
||||||
assert.Equal(t, "example@example.com", pushCommit.CommitterEmail) |
|
||||||
assert.Equal(t, "John Doe", pushCommit.CommitterName) |
|
||||||
assert.Equal(t, now, pushCommit.Timestamp) |
|
||||||
} |
|
||||||
|
|
||||||
func TestListToPushCommits(t *testing.T) { |
|
||||||
now := time.Now() |
|
||||||
sig := &git.Signature{ |
|
||||||
Email: "example@example.com", |
|
||||||
Name: "John Doe", |
|
||||||
When: now, |
|
||||||
} |
|
||||||
|
|
||||||
const hexString1 = "0123456789abcdef0123456789abcdef01234567" |
|
||||||
hash1, err := git.NewIDFromString(hexString1) |
|
||||||
assert.NoError(t, err) |
|
||||||
const hexString2 = "fedcba9876543210fedcba9876543210fedcba98" |
|
||||||
hash2, err := git.NewIDFromString(hexString2) |
|
||||||
assert.NoError(t, err) |
|
||||||
|
|
||||||
l := list.New() |
|
||||||
l.PushBack(&git.Commit{ |
|
||||||
ID: hash1, |
|
||||||
Author: sig, |
|
||||||
Committer: sig, |
|
||||||
CommitMessage: "Message1", |
|
||||||
}) |
|
||||||
l.PushBack(&git.Commit{ |
|
||||||
ID: hash2, |
|
||||||
Author: sig, |
|
||||||
Committer: sig, |
|
||||||
CommitMessage: "Message2", |
|
||||||
}) |
|
||||||
|
|
||||||
pushCommits := ListToPushCommits(l) |
|
||||||
assert.Equal(t, 2, pushCommits.Len) |
|
||||||
if assert.Len(t, pushCommits.Commits, 2) { |
|
||||||
assert.Equal(t, "Message1", pushCommits.Commits[0].Message) |
|
||||||
assert.Equal(t, hexString1, pushCommits.Commits[0].Sha1) |
|
||||||
assert.Equal(t, "example@example.com", pushCommits.Commits[0].AuthorEmail) |
|
||||||
assert.Equal(t, now, pushCommits.Commits[0].Timestamp) |
|
||||||
|
|
||||||
assert.Equal(t, "Message2", pushCommits.Commits[1].Message) |
|
||||||
assert.Equal(t, hexString2, pushCommits.Commits[1].Sha1) |
|
||||||
assert.Equal(t, "example@example.com", pushCommits.Commits[1].AuthorEmail) |
|
||||||
assert.Equal(t, now, pushCommits.Commits[1].Timestamp) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// TODO TestPushUpdate
|
|
@ -0,0 +1,168 @@ |
|||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package repository |
||||||
|
|
||||||
|
import ( |
||||||
|
"container/list" |
||||||
|
"fmt" |
||||||
|
"time" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
"code.gitea.io/gitea/modules/base" |
||||||
|
"code.gitea.io/gitea/modules/git" |
||||||
|
"code.gitea.io/gitea/modules/log" |
||||||
|
api "code.gitea.io/gitea/modules/structs" |
||||||
|
) |
||||||
|
|
||||||
|
// PushCommit represents a commit in a push operation.
|
||||||
|
type PushCommit struct { |
||||||
|
Sha1 string |
||||||
|
Message string |
||||||
|
AuthorEmail string |
||||||
|
AuthorName string |
||||||
|
CommitterEmail string |
||||||
|
CommitterName string |
||||||
|
Timestamp time.Time |
||||||
|
} |
||||||
|
|
||||||
|
// PushCommits represents list of commits in a push operation.
|
||||||
|
type PushCommits struct { |
||||||
|
Len int |
||||||
|
Commits []*PushCommit |
||||||
|
CompareURL string |
||||||
|
|
||||||
|
avatars map[string]string |
||||||
|
emailUsers map[string]*models.User |
||||||
|
} |
||||||
|
|
||||||
|
// NewPushCommits creates a new PushCommits object.
|
||||||
|
func NewPushCommits() *PushCommits { |
||||||
|
return &PushCommits{ |
||||||
|
avatars: make(map[string]string), |
||||||
|
emailUsers: make(map[string]*models.User), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 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) |
||||||
|
} |
||||||
|
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.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.Name |
||||||
|
} |
||||||
|
|
||||||
|
fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1) |
||||||
|
if err != nil { |
||||||
|
return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, 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, |
||||||
|
} |
||||||
|
} |
||||||
|
return commits, nil |
||||||
|
} |
||||||
|
|
||||||
|
// AvatarLink tries to match user in database with e-mail
|
||||||
|
// in order to show custom avatar, and falls back to general avatar link.
|
||||||
|
func (pc *PushCommits) AvatarLink(email string) string { |
||||||
|
if pc.avatars == nil { |
||||||
|
pc.avatars = make(map[string]string) |
||||||
|
} |
||||||
|
avatar, ok := pc.avatars[email] |
||||||
|
if ok { |
||||||
|
return avatar |
||||||
|
} |
||||||
|
|
||||||
|
u, ok := pc.emailUsers[email] |
||||||
|
if !ok { |
||||||
|
var err error |
||||||
|
u, err = models.GetUserByEmail(email) |
||||||
|
if err != nil { |
||||||
|
pc.avatars[email] = base.AvatarLink(email) |
||||||
|
if !models.IsErrUserNotExist(err) { |
||||||
|
log.Error("GetUserByEmail: %v", err) |
||||||
|
return "" |
||||||
|
} |
||||||
|
} else { |
||||||
|
pc.emailUsers[email] = u |
||||||
|
} |
||||||
|
} |
||||||
|
if u != nil { |
||||||
|
pc.avatars[email] = u.RelAvatarLink() |
||||||
|
} |
||||||
|
|
||||||
|
return pc.avatars[email] |
||||||
|
} |
||||||
|
|
||||||
|
// CommitToPushCommit transforms a git.Commit to PushCommit type.
|
||||||
|
func CommitToPushCommit(commit *git.Commit) *PushCommit { |
||||||
|
return &PushCommit{ |
||||||
|
Sha1: commit.ID.String(), |
||||||
|
Message: commit.Message(), |
||||||
|
AuthorEmail: commit.Author.Email, |
||||||
|
AuthorName: commit.Author.Name, |
||||||
|
CommitterEmail: commit.Committer.Email, |
||||||
|
CommitterName: commit.Committer.Name, |
||||||
|
Timestamp: commit.Author.When, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 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)) |
||||||
|
} |
||||||
|
return &PushCommits{l.Len(), commits, "", make(map[string]string), make(map[string]*models.User)} |
||||||
|
} |
@ -0,0 +1,190 @@ |
|||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package repository |
||||||
|
|
||||||
|
import ( |
||||||
|
"container/list" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
"code.gitea.io/gitea/modules/git" |
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
) |
||||||
|
|
||||||
|
func TestPushCommits_ToAPIPayloadCommits(t *testing.T) { |
||||||
|
assert.NoError(t, models.PrepareTestDatabase()) |
||||||
|
|
||||||
|
pushCommits := NewPushCommits() |
||||||
|
pushCommits.Commits = []*PushCommit{ |
||||||
|
{ |
||||||
|
Sha1: "69554a6", |
||||||
|
CommitterEmail: "user2@example.com", |
||||||
|
CommitterName: "User2", |
||||||
|
AuthorEmail: "user2@example.com", |
||||||
|
AuthorName: "User2", |
||||||
|
Message: "not signed commit", |
||||||
|
}, |
||||||
|
{ |
||||||
|
Sha1: "27566bd", |
||||||
|
CommitterEmail: "user2@example.com", |
||||||
|
CommitterName: "User2", |
||||||
|
AuthorEmail: "user2@example.com", |
||||||
|
AuthorName: "User2", |
||||||
|
Message: "good signed commit (with not yet validated email)", |
||||||
|
}, |
||||||
|
{ |
||||||
|
Sha1: "5099b81", |
||||||
|
CommitterEmail: "user2@example.com", |
||||||
|
CommitterName: "User2", |
||||||
|
AuthorEmail: "user2@example.com", |
||||||
|
AuthorName: "User2", |
||||||
|
Message: "good signed commit", |
||||||
|
}, |
||||||
|
} |
||||||
|
pushCommits.Len = len(pushCommits.Commits) |
||||||
|
|
||||||
|
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) |
||||||
|
payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16") |
||||||
|
assert.NoError(t, err) |
||||||
|
assert.EqualValues(t, 3, len(payloadCommits)) |
||||||
|
|
||||||
|
assert.Equal(t, "69554a6", payloadCommits[0].ID) |
||||||
|
assert.Equal(t, "not signed commit", payloadCommits[0].Message) |
||||||
|
assert.Equal(t, "/user2/repo16/commit/69554a6", payloadCommits[0].URL) |
||||||
|
assert.Equal(t, "User2", payloadCommits[0].Committer.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[0].Committer.UserName) |
||||||
|
assert.Equal(t, "User2", payloadCommits[0].Author.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[0].Author.UserName) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[0].Added) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[0].Removed) |
||||||
|
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[0].Modified) |
||||||
|
|
||||||
|
assert.Equal(t, "27566bd", payloadCommits[1].ID) |
||||||
|
assert.Equal(t, "good signed commit (with not yet validated email)", payloadCommits[1].Message) |
||||||
|
assert.Equal(t, "/user2/repo16/commit/27566bd", payloadCommits[1].URL) |
||||||
|
assert.Equal(t, "User2", payloadCommits[1].Committer.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[1].Committer.UserName) |
||||||
|
assert.Equal(t, "User2", payloadCommits[1].Author.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[1].Author.UserName) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[1].Added) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[1].Removed) |
||||||
|
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[1].Modified) |
||||||
|
|
||||||
|
assert.Equal(t, "5099b81", payloadCommits[2].ID) |
||||||
|
assert.Equal(t, "good signed commit", payloadCommits[2].Message) |
||||||
|
assert.Equal(t, "/user2/repo16/commit/5099b81", payloadCommits[2].URL) |
||||||
|
assert.Equal(t, "User2", payloadCommits[2].Committer.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[2].Committer.UserName) |
||||||
|
assert.Equal(t, "User2", payloadCommits[2].Author.Name) |
||||||
|
assert.Equal(t, "user2", payloadCommits[2].Author.UserName) |
||||||
|
assert.EqualValues(t, []string{"readme.md"}, payloadCommits[2].Added) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[2].Removed) |
||||||
|
assert.EqualValues(t, []string{}, payloadCommits[2].Modified) |
||||||
|
} |
||||||
|
|
||||||
|
func TestPushCommits_AvatarLink(t *testing.T) { |
||||||
|
assert.NoError(t, models.PrepareTestDatabase()) |
||||||
|
|
||||||
|
pushCommits := NewPushCommits() |
||||||
|
pushCommits.Commits = []*PushCommit{ |
||||||
|
{ |
||||||
|
Sha1: "abcdef1", |
||||||
|
CommitterEmail: "user2@example.com", |
||||||
|
CommitterName: "User Two", |
||||||
|
AuthorEmail: "user4@example.com", |
||||||
|
AuthorName: "User Four", |
||||||
|
Message: "message1", |
||||||
|
}, |
||||||
|
{ |
||||||
|
Sha1: "abcdef2", |
||||||
|
CommitterEmail: "user2@example.com", |
||||||
|
CommitterName: "User Two", |
||||||
|
AuthorEmail: "user2@example.com", |
||||||
|
AuthorName: "User Two", |
||||||
|
Message: "message2", |
||||||
|
}, |
||||||
|
} |
||||||
|
pushCommits.Len = len(pushCommits.Commits) |
||||||
|
|
||||||
|
assert.Equal(t, |
||||||
|
"/user/avatar/user2/-1", |
||||||
|
pushCommits.AvatarLink("user2@example.com")) |
||||||
|
|
||||||
|
assert.Equal(t, |
||||||
|
"https://secure.gravatar.com/avatar/19ade630b94e1e0535b3df7387434154?d=identicon", |
||||||
|
pushCommits.AvatarLink("nonexistent@example.com")) |
||||||
|
} |
||||||
|
|
||||||
|
func TestCommitToPushCommit(t *testing.T) { |
||||||
|
now := time.Now() |
||||||
|
sig := &git.Signature{ |
||||||
|
Email: "example@example.com", |
||||||
|
Name: "John Doe", |
||||||
|
When: now, |
||||||
|
} |
||||||
|
const hexString = "0123456789abcdef0123456789abcdef01234567" |
||||||
|
sha1, err := git.NewIDFromString(hexString) |
||||||
|
assert.NoError(t, err) |
||||||
|
pushCommit := CommitToPushCommit(&git.Commit{ |
||||||
|
ID: sha1, |
||||||
|
Author: sig, |
||||||
|
Committer: sig, |
||||||
|
CommitMessage: "Commit Message", |
||||||
|
}) |
||||||
|
assert.Equal(t, hexString, pushCommit.Sha1) |
||||||
|
assert.Equal(t, "Commit Message", pushCommit.Message) |
||||||
|
assert.Equal(t, "example@example.com", pushCommit.AuthorEmail) |
||||||
|
assert.Equal(t, "John Doe", pushCommit.AuthorName) |
||||||
|
assert.Equal(t, "example@example.com", pushCommit.CommitterEmail) |
||||||
|
assert.Equal(t, "John Doe", pushCommit.CommitterName) |
||||||
|
assert.Equal(t, now, pushCommit.Timestamp) |
||||||
|
} |
||||||
|
|
||||||
|
func TestListToPushCommits(t *testing.T) { |
||||||
|
now := time.Now() |
||||||
|
sig := &git.Signature{ |
||||||
|
Email: "example@example.com", |
||||||
|
Name: "John Doe", |
||||||
|
When: now, |
||||||
|
} |
||||||
|
|
||||||
|
const hexString1 = "0123456789abcdef0123456789abcdef01234567" |
||||||
|
hash1, err := git.NewIDFromString(hexString1) |
||||||
|
assert.NoError(t, err) |
||||||
|
const hexString2 = "fedcba9876543210fedcba9876543210fedcba98" |
||||||
|
hash2, err := git.NewIDFromString(hexString2) |
||||||
|
assert.NoError(t, err) |
||||||
|
|
||||||
|
l := list.New() |
||||||
|
l.PushBack(&git.Commit{ |
||||||
|
ID: hash1, |
||||||
|
Author: sig, |
||||||
|
Committer: sig, |
||||||
|
CommitMessage: "Message1", |
||||||
|
}) |
||||||
|
l.PushBack(&git.Commit{ |
||||||
|
ID: hash2, |
||||||
|
Author: sig, |
||||||
|
Committer: sig, |
||||||
|
CommitMessage: "Message2", |
||||||
|
}) |
||||||
|
|
||||||
|
pushCommits := ListToPushCommits(l) |
||||||
|
assert.Equal(t, 2, pushCommits.Len) |
||||||
|
if assert.Len(t, pushCommits.Commits, 2) { |
||||||
|
assert.Equal(t, "Message1", pushCommits.Commits[0].Message) |
||||||
|
assert.Equal(t, hexString1, pushCommits.Commits[0].Sha1) |
||||||
|
assert.Equal(t, "example@example.com", pushCommits.Commits[0].AuthorEmail) |
||||||
|
assert.Equal(t, now, pushCommits.Commits[0].Timestamp) |
||||||
|
|
||||||
|
assert.Equal(t, "Message2", pushCommits.Commits[1].Message) |
||||||
|
assert.Equal(t, hexString2, pushCommits.Commits[1].Sha1) |
||||||
|
assert.Equal(t, "example@example.com", pushCommits.Commits[1].AuthorEmail) |
||||||
|
assert.Equal(t, now, pushCommits.Commits[1].Timestamp) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// TODO TestPushUpdate
|
@ -0,0 +1,16 @@ |
|||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package repository |
||||||
|
|
||||||
|
import ( |
||||||
|
"path/filepath" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
) |
||||||
|
|
||||||
|
func TestMain(m *testing.M) { |
||||||
|
models.MainTest(m, filepath.Join("..", "..")) |
||||||
|
} |
Loading…
Reference in new issue