diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/action.go | 46 | ||||
-rw-r--r-- | models/pull.go | 55 | ||||
-rw-r--r-- | models/release.go | 21 | ||||
-rw-r--r-- | models/repo.go | 6 | ||||
-rw-r--r-- | models/update.go | 41 | ||||
-rw-r--r-- | models/user.go | 7 | ||||
-rw-r--r-- | models/webhook_slack.go | 3 |
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 { |