新增:创建版本逻辑

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 return nil
} }
p.LatestPullRequestVersion, err = pull.GetPullRequestLastVersionByPullRequest(ctx, &p.PullRequest) p.LatestPullRequestVersion, err = GetPullRequestLastVersionByPullRequest(ctx, p)
return err 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) 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) { func GetPullRequestVersionByID(ctx context.Context, prID, id int64) (*PullRequestVersion, error) {
if id < 1 { if id < 1 {
return nil, gitea_issues_model.ErrPullRequestNotExist{} return nil, gitea_issues_model.ErrPullRequestNotExist{}

View File

@ -24,7 +24,7 @@ import (
func CreatePrVersion(ctx *context.APIContext) { func CreatePrVersion(ctx *context.APIContext) {
form := web.GetForm(ctx).(*gitea_api.PullRequestPayload) 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) ctx.Status(http.StatusNoContent)
} }

View File

@ -5,25 +5,34 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"code.gitea.io/gitea/models/db"
issues_model "code.gitea.io/gitea/models/issues" issues_model "code.gitea.io/gitea/models/issues"
webhook_model "code.gitea.io/gitea/models/webhook" 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/graceful"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/queue" "code.gitea.io/gitea/modules/queue"
"code.gitea.io/gitea/modules/setting" "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_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" hat_webhook_model "code.gitlink.org.cn/Gitlink/gitea_hat.git/models/webhook"
) )
var hatPrPatchCheckerQueue queue.UniqueQueue var hatPrPatchCheckerQueue queue.UniqueQueue
func AddToTaskQueue(pr *issues_model.PullRequest) { func AddToTaskQueue(pr *issues_model.PullRequest, action string) {
err := hatPrPatchCheckerQueue.PushFunc(strconv.FormatInt(pr.ID, 10), func() error { if action == "opened" || action == "synchronized" {
return nil 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) 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. // InitializePullRequests checks and tests untested patches of pull requests.
@ -66,6 +75,7 @@ func InitializeCheckHook(ctx context.Context) {
ChooseEvents: true, ChooseEvents: true,
HookEvents: webhook_model.HookEvents{ HookEvents: webhook_model.HookEvents{
PullRequestSync: true, PullRequestSync: true,
PullRequest: true,
}, },
BranchFilter: "*", BranchFilter: "*",
} }
@ -90,7 +100,94 @@ func InitializeCheckHook(ctx context.Context) {
func handle(data ...queue.Data) []queue.Data { func handle(data ...queue.Data) []queue.Data {
for _, datum := range data { for _, datum := range data {
id, _ := strconv.ParseInt(datum.(string), 10, 64) 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 return nil
} }