新增:创建版本逻辑

This commit is contained in:
yystopf 2023-01-11 16:38:59 +08:00
parent dc6b0413da
commit b578e5b990
4 changed files with 121 additions and 24 deletions

View File

@ -37,7 +37,22 @@ func (p *PullRequest) LoadLatestPullRequestVersion(ctx context.Context) (err err
return nil
}
p.LatestPullRequestVersion, err = pull.GetPullRequestLastVersionByPullRequest(ctx, &p.PullRequest)
p.LatestPullRequestVersion, err = GetPullRequestLastVersionByPullRequest(ctx, p)
return err
}
func GetPullRequestLastVersionByPullRequest(ctx context.Context, pr *PullRequest) (*pull.PullRequestVersion, error) {
prv := &pull.PullRequestVersion{
RepoID: pr.PullRequest.BaseRepoID,
PullID: pr.PullRequest.ID,
}
has, err := db.GetEngine(ctx).Desc("created_unix").Get(prv)
if err != nil {
return nil, err
} else if !has {
return nil, gitea_issues_models.ErrPullRequestNotExist{}
}
return prv, nil
}

View File

@ -61,21 +61,6 @@ func PullRequestVersions(ctx context.Context, prID int64, opts *db.ListOptions)
return prvs, maxResults, findSession.Find(&prvs)
}
func GetPullRequestLastVersionByPullRequest(ctx context.Context, pr *gitea_issues_model.PullRequest) (*PullRequestVersion, error) {
prv := &PullRequestVersion{
RepoID: pr.BaseRepoID,
PullID: pr.ID,
}
has, err := db.GetEngine(ctx).Desc("created_unix").Get(prv)
if err != nil {
return nil, err
} else if !has {
return nil, gitea_issues_model.ErrPullRequestNotExist{}
}
return prv, nil
}
func GetPullRequestVersionByID(ctx context.Context, prID, id int64) (*PullRequestVersion, error) {
if id < 1 {
return nil, gitea_issues_model.ErrPullRequestNotExist{}

View File

@ -24,7 +24,7 @@ import (
func CreatePrVersion(ctx *context.APIContext) {
form := web.GetForm(ctx).(*gitea_api.PullRequestPayload)
hat_pull_service.AddToTaskQueue(&issues_model.PullRequest{ID: form.PullRequest.ID})
hat_pull_service.AddToTaskQueue(&issues_model.PullRequest{ID: form.PullRequest.ID}, string(form.Action))
ctx.Status(http.StatusNoContent)
}

View File

@ -5,25 +5,34 @@ import (
"fmt"
"strconv"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues"
webhook_model "code.gitea.io/gitea/models/webhook"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/queue"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/services/gitdiff"
hat_issues_model "code.gitlink.org.cn/Gitlink/gitea_hat.git/models/issues"
hat_pull_model "code.gitlink.org.cn/Gitlink/gitea_hat.git/models/pull"
hat_webhook_model "code.gitlink.org.cn/Gitlink/gitea_hat.git/models/webhook"
)
var hatPrPatchCheckerQueue queue.UniqueQueue
func AddToTaskQueue(pr *issues_model.PullRequest) {
err := hatPrPatchCheckerQueue.PushFunc(strconv.FormatInt(pr.ID, 10), func() error {
return nil
})
if err != nil && err != queue.ErrAlreadyInQueue {
log.Error("Error adding prID %d to the test pull requests queue: %v", pr.ID, err)
func AddToTaskQueue(pr *issues_model.PullRequest, action string) {
if action == "opened" || action == "synchronized" {
err := hatPrPatchCheckerQueue.PushFunc(strconv.FormatInt(pr.ID, 10), func() error {
return nil
})
if err != nil && err != queue.ErrAlreadyInQueue {
log.Error("Error adding prID %d to the test pull requests queue: %v", pr.ID, err)
}
} else {
log.Error("action type is not found rule.")
}
}
// InitializePullRequests checks and tests untested patches of pull requests.
@ -66,6 +75,7 @@ func InitializeCheckHook(ctx context.Context) {
ChooseEvents: true,
HookEvents: webhook_model.HookEvents{
PullRequestSync: true,
PullRequest: true,
},
BranchFilter: "*",
}
@ -90,7 +100,94 @@ func InitializeCheckHook(ctx context.Context) {
func handle(data ...queue.Data) []queue.Data {
for _, datum := range data {
id, _ := strconv.ParseInt(datum.(string), 10, 64)
fmt.Println(id)
pr, err := issues_model.GetPullRequestByID(db.DefaultContext, id)
if err != nil {
log.Error("GetPullRequestByID[%s]: %v", datum, err)
continue
} else if pr.HasMerged {
continue
}
err = pr.LoadIssue()
if err != nil {
log.Error("pullrequest load issue error: %v", err)
continue
}
err = pr.LoadBaseRepo()
if err != nil {
log.Error("pullrequest load base repo error: %v", err)
continue
}
err = pr.LoadHeadRepo()
if err != nil {
log.Error("pullrequest load head repo error: %v", err)
continue
}
baseGitRepo, err := git.OpenRepository(db.DefaultContext, pr.BaseRepo.RepoPath())
if err != nil {
log.Error("git.OpenRepository err:%v", err)
continue
}
defer baseGitRepo.Close()
commit, err := baseGitRepo.GetCommit(pr.GetGitRefName())
if err != nil {
log.Error("GetCommit err:%v", err)
continue
}
hpr := &hat_issues_model.PullRequest{PullRequest: *pr}
err = hpr.LoadLatestPullRequestVersion(db.DefaultContext)
if err != nil && !issues_model.IsErrPullRequestNotExist(err) {
log.Error("pullrequest load version error: %v", err)
continue
}
if hpr.LatestPullRequestVersion == nil {
betweenCommitsCount, err := baseGitRepo.CommitsCountBetween(pr.MergeBase, commit.ID.String())
if err != nil {
log.Error("CommitsBeforeUntil err: %v", err)
continue
}
diffs, err := gitdiff.GetDiff(baseGitRepo, &gitdiff.DiffOptions{
BeforeCommitID: pr.MergeBase,
AfterCommitID: commit.ID.String(),
})
if err != nil {
log.Error("GetDiff err: %v", err)
continue
}
err = hat_pull_model.NewPullRequestVersion(db.DefaultContext, pr.HeadRepo, pr, diffs.TotalAddition, int(betweenCommitsCount), diffs.TotalDeletion, diffs.NumFiles, commit.ID.String(), pr.MergeBase, pr.MergeBase)
if err != nil {
log.Error("models.NewPullRequestVersion err: %v", err)
continue
}
} else {
if commit.ID.String() == hpr.LatestPullRequestVersion.HeadCommitID {
log.Error("This pull version is saved.")
continue
}
betweenCommitsCount, err := baseGitRepo.CommitsCountBetween(hpr.LatestPullRequestVersion.HeadCommitID, commit.ID.String())
if err != nil {
log.Error("CommitsBeforeUntil err: %v", err)
continue
}
diffs, err := gitdiff.GetDiff(baseGitRepo, &gitdiff.DiffOptions{
BeforeCommitID: hpr.LatestPullRequestVersion.HeadCommitID,
AfterCommitID: commit.ID.String(),
})
if err != nil {
log.Error("GetDiff err: %v", err)
continue
}
err = hat_pull_model.NewPullRequestVersion(db.DefaultContext, pr.HeadRepo, pr, diffs.TotalAddition, int(betweenCommitsCount), diffs.TotalDeletion, diffs.NumFiles, commit.ID.String(), pr.MergeBase, hpr.LatestPullRequestVersion.HeadCommitID)
if err != nil {
log.Error("models.NewPullRequestVersion err: %v", err)
continue
}
}
}
return nil
}