Browse Source
Move push commits from models to modules/repository (#9370)
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>mj
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 482 additions and 436 deletions
-
126models/action.go
-
100models/action_test.go
-
98models/update.go
-
86models/update_test.go
-
3modules/notification/action/action.go
-
5modules/notification/base/notifier.go
-
5modules/notification/base/null.go
-
3modules/notification/indexer/indexer.go
-
5modules/notification/notification.go
-
5modules/notification/webhook/webhook.go
-
9modules/repofiles/action.go
-
23modules/repofiles/action_test.go
-
11modules/repofiles/update.go
-
168modules/repository/commits.go
-
190modules/repository/commits_test.go
-
16modules/repository/main_test.go
-
55modules/repository/repo.go
-
5modules/templates/helper.go
-
2services/mirror/mirror.go
-
3services/release/release.go
@ -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("..", "..")) |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue