mirror of https://github.com/go-gitea/gitea
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>pull/9676/head^2
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