aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/action.go46
-rw-r--r--models/pull.go55
-rw-r--r--models/release.go21
-rw-r--r--models/repo.go6
-rw-r--r--models/update.go41
-rw-r--r--models/user.go7
-rw-r--r--models/webhook_slack.go3
7 files changed, 109 insertions, 70 deletions
diff --git a/models/action.go b/models/action.go
index bb5860a666..2c8eed85f2 100644
--- a/models/action.go
+++ b/models/action.go
@@ -17,10 +17,10 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
+ "github.com/gogits/git-shell"
api "github.com/gogits/go-gogs-client"
"github.com/gogits/gogs/modules/base"
- "github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
@@ -229,6 +229,28 @@ func NewPushCommits() *PushCommits {
}
}
+func (pc *PushCommits) ToApiPayloadCommits(repoLink string) []*api.PayloadCommit {
+ commits := make([]*api.PayloadCommit, len(pc.Commits))
+ for i, cmt := range pc.Commits {
+ author_username := ""
+ author, err := GetUserByEmail(cmt.AuthorEmail)
+ if err == nil {
+ author_username = author.Name
+ }
+ commits[i] = &api.PayloadCommit{
+ ID: cmt.Sha1,
+ Message: cmt.Message,
+ URL: fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1),
+ Author: &api.PayloadAuthor{
+ Name: cmt.AuthorName,
+ Email: cmt.AuthorEmail,
+ UserName: author_username,
+ },
+ }
+ }
+ return commits
+}
+
// AvatarLink tries to match user in database with e-mail
// in order to show custom avatar, and falls back to general avatar link.
func (push *PushCommits) AvatarLink(email string) string {
@@ -413,7 +435,7 @@ func CommitRepoAction(
} else {
// if not the first commit, set the compareUrl
if !strings.HasPrefix(oldCommitID, "0000000") {
- commit.CompareUrl = fmt.Sprintf("%s/%s/compare/%s...%s", repoUserName, repoName, oldCommitID, newCommitID)
+ commit.CompareUrl = repo.ComposeCompareURL(oldCommitID, newCommitID)
} else {
isNewBranch = true
}
@@ -469,30 +491,12 @@ func CommitRepoAction(
switch opType {
case COMMIT_REPO: // Push
- commits := make([]*api.PayloadCommit, len(commit.Commits))
- for i, cmt := range commit.Commits {
- author_username := ""
- author, err := GetUserByEmail(cmt.AuthorEmail)
- if err == nil {
- author_username = author.Name
- }
- commits[i] = &api.PayloadCommit{
- ID: cmt.Sha1,
- Message: cmt.Message,
- URL: fmt.Sprintf("%s/commit/%s", repo.FullRepoLink(), cmt.Sha1),
- Author: &api.PayloadAuthor{
- Name: cmt.AuthorName,
- Email: cmt.AuthorEmail,
- UserName: author_username,
- },
- }
- }
p := &api.PushPayload{
Ref: refFullName,
Before: oldCommitID,
After: newCommitID,
CompareUrl: setting.AppUrl + commit.CompareUrl,
- Commits: commits,
+ Commits: commit.ToApiPayloadCommits(repo.FullRepoLink()),
Repo: payloadRepo,
Pusher: &api.PayloadAuthor{
Name: pusher_name,
diff --git a/models/pull.go b/models/pull.go
index 8020a1e1e7..f7785dfc54 100644
--- a/models/pull.go
+++ b/models/pull.go
@@ -14,7 +14,9 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
- "github.com/gogits/gogs/modules/git"
+ "github.com/gogits/git-shell"
+ api "github.com/gogits/go-gogs-client"
+
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/process"
"github.com/gogits/gogs/modules/setting"
@@ -124,6 +126,12 @@ func (pr *PullRequest) CanAutoMerge() bool {
// Merge merges pull request to base repository.
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) {
+ if err = pr.GetHeadRepo(); err != nil {
+ return fmt.Errorf("GetHeadRepo: %v", err)
+ } else if err = pr.GetBaseRepo(); err != nil {
+ return fmt.Errorf("GetBaseRepo: %v", err)
+ }
+
sess := x.NewSession()
defer sessionRelease(sess)
if err = sess.Begin(); err != nil {
@@ -134,18 +142,14 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
return fmt.Errorf("Issue.changeStatus: %v", err)
}
- if err = pr.getHeadRepo(sess); err != nil {
- return fmt.Errorf("getHeadRepo: %v", err)
- }
-
headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name)
headGitRepo, err := git.OpenRepository(headRepoPath)
if err != nil {
return fmt.Errorf("OpenRepository: %v", err)
}
- pr.MergedCommitID, err = headGitRepo.GetCommitIdOfBranch(pr.HeadBranch)
+ pr.MergedCommitID, err = headGitRepo.GetBranchCommitID(pr.HeadBranch)
if err != nil {
- return fmt.Errorf("GetCommitIdOfBranch: %v", err)
+ return fmt.Errorf("GetBranchCommitID: %v", err)
}
if err = mergePullRequestAction(sess, doer, pr.Issue.Repo, pr.Issue); err != nil {
@@ -213,7 +217,38 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error
return fmt.Errorf("git push: %s", stderr)
}
- return sess.Commit()
+ if err = sess.Commit(); err != nil {
+ return fmt.Errorf("Commit: %v", err)
+ }
+
+ // Compose commit repository action
+ l, err := headGitRepo.CommitsBetweenIDs(pr.MergedCommitID, pr.MergeBase)
+ if err != nil {
+ return fmt.Errorf("CommitsBetween: %v", err)
+ }
+ p := &api.PushPayload{
+ Ref: "refs/heads/" + pr.BaseBranch,
+ Before: pr.MergeBase,
+ After: pr.MergedCommitID,
+ CompareUrl: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID),
+ Commits: ListToPushCommits(l).ToApiPayloadCommits(pr.BaseRepo.FullRepoLink()),
+ Repo: pr.BaseRepo.ComposePayload(),
+ Pusher: &api.PayloadAuthor{
+ Name: pr.HeadRepo.MustOwner().DisplayName(),
+ Email: pr.HeadRepo.MustOwner().Email,
+ UserName: pr.HeadRepo.MustOwner().Name,
+ },
+ Sender: &api.PayloadUser{
+ UserName: doer.Name,
+ ID: doer.Id,
+ AvatarUrl: setting.AppUrl + doer.RelAvatarLink(),
+ },
+ }
+ if err = PrepareWebhooks(pr.BaseRepo, HOOK_EVENT_PUSH, p); err != nil {
+ return fmt.Errorf("PrepareWebhooks: %v", err)
+ }
+ go HookQueue.Add(pr.BaseRepo.ID)
+ return nil
}
// patchConflicts is a list of conflit description from Git.
@@ -411,8 +446,6 @@ func (pr *PullRequest) UpdatePatch() (err error) {
if err = pr.GetBaseRepo(); err != nil {
return fmt.Errorf("GetBaseRepo: %v", err)
- } else if err = pr.BaseRepo.GetOwner(); err != nil {
- return fmt.Errorf("GetOwner: %v", err)
}
headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
@@ -422,7 +455,7 @@ func (pr *PullRequest) UpdatePatch() (err error) {
// Add a temporary remote.
tmpRemote := com.ToStr(time.Now().UnixNano())
- if err = headGitRepo.AddRemote(tmpRemote, RepoPath(pr.BaseRepo.Owner.Name, pr.BaseRepo.Name)); err != nil {
+ if err = headGitRepo.AddRemote(tmpRemote, RepoPath(pr.BaseRepo.MustOwner().Name, pr.BaseRepo.Name), true); err != nil {
return fmt.Errorf("AddRemote: %v", err)
}
defer func() {
diff --git a/models/release.go b/models/release.go
index 08e006095a..28cbfaab74 100644
--- a/models/release.go
+++ b/models/release.go
@@ -12,7 +12,8 @@ import (
"github.com/go-xorm/xorm"
- "github.com/gogits/gogs/modules/git"
+ "github.com/gogits/git-shell"
+
"github.com/gogits/gogs/modules/process"
)
@@ -27,8 +28,8 @@ type Release struct {
Target string
Title string
Sha1 string `xorm:"VARCHAR(40)"`
- NumCommits int
- NumCommitsBehind int `xorm:"-"`
+ NumCommits int64
+ NumCommitsBehind int64 `xorm:"-"`
Note string `xorm:"TEXT"`
IsDraft bool `xorm:"NOT NULL DEFAULT false"`
IsPrerelease bool
@@ -51,31 +52,27 @@ func IsReleaseExist(repoID int64, tagName string) (bool, error) {
return x.Get(&Release{RepoID: repoID, LowerTagName: strings.ToLower(tagName)})
}
-func init() {
- git.GetVersion()
-}
-
func createTag(gitRepo *git.Repository, rel *Release) error {
// Only actual create when publish.
if !rel.IsDraft {
if !gitRepo.IsTagExist(rel.TagName) {
- commit, err := gitRepo.GetCommitOfBranch(rel.Target)
+ commit, err := gitRepo.GetBranchCommit(rel.Target)
if err != nil {
- return err
+ return fmt.Errorf("GetBranchCommit: %v", err)
}
if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil {
return err
}
} else {
- commit, err := gitRepo.GetCommitOfTag(rel.TagName)
+ commit, err := gitRepo.GetTagCommit(rel.TagName)
if err != nil {
- return err
+ return fmt.Errorf("GetTagCommit: %v", err)
}
rel.NumCommits, err = commit.CommitsCount()
if err != nil {
- return err
+ return fmt.Errorf("CommitsCount: %v", err)
}
}
}
diff --git a/models/repo.go b/models/repo.go
index f51396c5ca..307f86cb25 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -98,7 +98,7 @@ func NewRepoContext() {
}
// Check Git version.
- gitVer, err := git.Version()
+ gitVer, err := git.BinVersion()
if err != nil {
log.Fatal(4, "Fail to get Git version: %v", err)
}
@@ -309,6 +309,10 @@ func (repo *Repository) RepoLink() string {
return setting.AppSubUrl + "/" + repo.MustOwner().Name + "/" + repo.Name
}
+func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string {
+ return fmt.Sprintf("%s/%s/compare/%s...%s", repo.MustOwner().Name, repo.Name, oldCommitID, newCommitID)
+}
+
func (repo *Repository) FullRepoLink() string {
return setting.AppUrl + repo.MustOwner().Name + "/" + repo.Name
}
diff --git a/models/update.go b/models/update.go
index 14e56ce813..9878f04a07 100644
--- a/models/update.go
+++ b/models/update.go
@@ -10,7 +10,8 @@ import (
"os/exec"
"strings"
- "github.com/gogits/gogs/modules/git"
+ "github.com/gogits/git-shell"
+
"github.com/gogits/gogs/modules/log"
)
@@ -46,6 +47,24 @@ func DeleteUpdateTaskByUUID(uuid string) error {
return err
}
+func ListToPushCommits(l *list.List) *PushCommits {
+ commits := make([]*PushCommit, 0)
+ 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,
+ &PushCommit{commit.ID.String(),
+ commit.Message(),
+ commit.Author.Email,
+ commit.Author.Name,
+ })
+ }
+ return &PushCommits{l.Len(), commits, "", nil}
+}
+
func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName string, userID int64) error {
isNew := strings.HasPrefix(oldCommitID, "0000000")
if isNew &&
@@ -131,24 +150,8 @@ func Update(refName, oldCommitID, newCommitID, userName, repoUserName, repoName
return fmt.Errorf("runUpdate.Commit repoId: %v", err)
}
- // Push commits.
- commits := make([]*PushCommit, 0)
- 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,
- &PushCommit{commit.ID.String(),
- commit.Message(),
- commit.Author.Email,
- commit.Author.Name,
- })
- }
-
- if err = CommitRepoAction(userID, user.Id, userName, actEmail,
- repo.ID, repoUserName, repoName, refName, &PushCommits{l.Len(), commits, "", nil}, oldCommitID, newCommitID); err != nil {
+ if err = CommitRepoAction(userID, user.Id, userName, user.Email,
+ repo.ID, repoUserName, repoName, refName, ListToPushCommits(l), oldCommitID, newCommitID); err != nil {
return fmt.Errorf("runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err)
}
return nil
diff --git a/models/user.go b/models/user.go
index 885111addb..f19e33039b 100644
--- a/models/user.go
+++ b/models/user.go
@@ -29,7 +29,6 @@ import (
"github.com/gogits/gogs/modules/avatar"
"github.com/gogits/gogs/modules/base"
- oldgit "github.com/gogits/gogs/modules/git"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
@@ -940,11 +939,11 @@ func MakeEmailPrimary(email *EmailAddress) error {
// UserCommit represents a commit with validation of user.
type UserCommit struct {
User *User
- *oldgit.Commit
+ *git.Commit
}
// ValidateCommitWithEmail chceck if author's e-mail of commit is corresponsind to a user.
-func ValidateCommitWithEmail(c *oldgit.Commit) *User {
+func ValidateCommitWithEmail(c *git.Commit) *User {
u, err := GetUserByEmail(c.Author.Email)
if err != nil {
return nil
@@ -961,7 +960,7 @@ func ValidateCommitsWithEmails(oldCommits *list.List) *list.List {
e = oldCommits.Front()
)
for e != nil {
- c := e.Value.(*oldgit.Commit)
+ c := e.Value.(*git.Commit)
if v, ok := emails[c.Author.Email]; !ok {
u, _ = GetUserByEmail(c.Author.Email)
diff --git a/models/webhook_slack.go b/models/webhook_slack.go
index 8fcf649551..519ac7a22c 100644
--- a/models/webhook_slack.go
+++ b/models/webhook_slack.go
@@ -10,9 +10,8 @@ import (
"fmt"
"strings"
+ "github.com/gogits/git-shell"
api "github.com/gogits/go-gogs-client"
-
- "github.com/gogits/gogs/modules/git"
)
type SlackMeta struct {