更改: 合并compare接口

This commit is contained in:
yystopf 2024-11-18 17:09:30 +08:00
parent 0bfffa0ad8
commit 6dc20c68a1
2 changed files with 165 additions and 45 deletions

View File

@ -163,14 +163,14 @@ func Routers() *web.Route {
}) })
m.Get("/commits_slice", repo.GetAllCommitsSliceByTime) m.Get("/commits_slice", repo.GetAllCommitsSliceByTime)
m.Get("/recent_commits", context.ReferencesGitRepo(), repo.GetRecentCommits) m.Get("/recent_commits", context.ReferencesGitRepo(), repo.GetRecentCommits)
// m.Get("/compare/*", reqRepoReader(unit_model.TypeCode), repo.CompareDiff) m.Get("/compare/*", reqRepoReader(unit_model.TypeCode), repo.CompareDiff)
m.Group("/compare/{shaFrom}...{shaTo}", func() { // m.Group("/compare/{shaFrom}...{shaTo}", func() {
m.Get("", repo.CompareDiff) // m.Get("", repo.CompareDiff)
m.Group("/files", func() { // m.Group("/files", func() {
m.Get("", repo.CompareFiles) // m.Get("", repo.CompareFiles)
m.Get("/*", repo.CompareFilesByPath) // m.Get("/*", repo.CompareFilesByPath)
}) // })
}, reqRepoReader(unit_model.TypeCode)) // }, reqRepoReader(unit_model.TypeCode))
m.Group("/pulls", func() { m.Group("/pulls", func() {
m.Group("/{index}", func() { m.Group("/{index}", func() {
m.Combo("").Get(repo.GetPullRequest). m.Combo("").Get(repo.GetPullRequest).

View File

@ -19,6 +19,7 @@ import (
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
repo_module "code.gitea.io/gitea/modules/repository" repo_module "code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/gitdiff" "code.gitea.io/gitea/services/gitdiff"
hat_convert "code.gitlink.org.cn/Gitlink/gitea_hat.git/modules/convert" hat_convert "code.gitlink.org.cn/Gitlink/gitea_hat.git/modules/convert"
@ -98,44 +99,155 @@ type CompareCommit struct {
} }
func CompareDiff(ctx *context.APIContext) { func CompareDiff(ctx *context.APIContext) {
// headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch := ParseCompareInfo(ctx) isFiles := ctx.FormString("isFiles")
_, _, headGitRepo, compareInfo, _, _ := ParseCompareInfo(ctx) if isFiles == "" {
// headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch := ParseCompareInfo(ctx)
_, _, headGitRepo, compareInfo, _, _ := ParseCompareInfo(ctx)
if ctx.Written() { if ctx.Written() {
return return
}
defer headGitRepo.Close()
// _ = PrepareComapreDiff(ctx, headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch)
result := make([]CompareCommit, 0)
for _, commit := range compareInfo.Commits {
compareCommit := CompareCommit{
Commit: commit,
Sha: commit.ID.String(),
} }
for _, p := range commit.Parents { defer headGitRepo.Close()
compareCommit.ParentShas = append(compareCommit.ParentShas, p.String())
// _ = PrepareComapreDiff(ctx, headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch)
result := make([]CompareCommit, 0)
for _, commit := range compareInfo.Commits {
compareCommit := CompareCommit{
Commit: commit,
Sha: commit.ID.String(),
}
for _, p := range commit.Parents {
compareCommit.ParentShas = append(compareCommit.ParentShas, p.String())
}
result = append(result, compareCommit)
} }
result = append(result, compareCommit)
different := struct {
Commits []CompareCommit
Diff interface{}
CommitsCount int
Latestsha string
FilesCount int
}{
Commits: result,
// Diff: ctx.Data["Diff"],
}
different.CommitsCount = len(compareInfo.Commits)
different.Latestsha = compareInfo.HeadCommitID
different.FilesCount = compareInfo.NumFiles
ctx.JSON(http.StatusOK, different)
} else {
if ctx.FormString("filepath") == "" {
headUser, headRepo, headGitRepo, compareInfo, _, headBranch := ParseCompareInfo(ctx)
if ctx.Written() {
return
}
defer headGitRepo.Close()
headCommitID := headBranch
repoPath := repo_model.RepoPath(headUser.Name, headRepo.Name)
gitRepo, _ := gitea_git.OpenRepository(ctx, repoPath)
defer gitRepo.Close()
diff, err := gitdiff.GetDiff(gitRepo, &gitdiff.DiffOptions{
BeforeCommitID: compareInfo.MergeBase,
AfterCommitID: headCommitID,
SkipTo: ctx.FormString("skip-to"),
MaxLines: setting.Git.MaxGitDiffLines,
MaxLineCharacters: setting.Git.MaxGitDiffLineCharacters,
MaxFiles: -1,
WhitespaceBehavior: gitdiff.GetWhitespaceFlag(ctx.FormString("whitespace")),
})
if err != nil {
ctx.Error(http.StatusInternalServerError, "GetDiff", err)
return
}
listOptions := utils.GetListOptions(ctx)
totalNumberOfFiles := diff.NumFiles
totalNumberOfPages := int(math.Ceil(float64(totalNumberOfFiles) / float64(listOptions.PageSize)))
start, end := listOptions.GetStartEnd()
if end > totalNumberOfFiles {
end = totalNumberOfFiles
}
lenFiles := end - start
if lenFiles < 0 {
lenFiles = 0
}
apiFiles := make([]*hat_api.ChangedFile, 0, lenFiles)
for i := start; i < end; i++ {
apiFiles = append(apiFiles, hat_convert.ToChangedFile(diff.Files[i], ctx.Repo.Repository, headCommitID))
}
ctx.SetLinkHeader(totalNumberOfFiles, listOptions.PageSize)
ctx.SetTotalCountHeader(int64(totalNumberOfFiles))
ctx.RespHeader().Set("X-Page", strconv.Itoa(listOptions.Page))
ctx.RespHeader().Set("X-PerPage", strconv.Itoa(listOptions.PageSize))
ctx.RespHeader().Set("X-PageCount", strconv.Itoa(totalNumberOfPages))
ctx.RespHeader().Set("X-HasMore", strconv.FormatBool(listOptions.Page < totalNumberOfPages))
ctx.AppendAccessControlExposeHeaders("X-Page", "X-PerPage", "X-PageCount", "X-HasMore")
ctx.JSON(http.StatusOK, struct {
Files []*hat_api.ChangedFile `json:"files"`
TotalAddition int `json:"total_addition"`
TotalDeletion int `json:"total_deletion"`
}{
Files: apiFiles,
TotalAddition: diff.TotalAddition,
TotalDeletion: diff.TotalDeletion,
})
} else {
path := util.PathEscapeSegments(ctx.FormString("filepath"))
headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch := ParseCompareInfo(ctx)
if ctx.Written() {
return
}
defer headGitRepo.Close()
_ = PrepareComapreDiff(ctx, headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch, path)
result := make([]CompareCommit, 0)
for _, commit := range compareInfo.Commits {
compareCommit := CompareCommit{
Commit: commit,
Sha: commit.ID.String(),
}
for _, p := range commit.Parents {
compareCommit.ParentShas = append(compareCommit.ParentShas, p.String())
}
result = append(result, compareCommit)
}
different := struct {
Commits []CompareCommit
Diff interface{}
CommitsCount int
Latestsha string
}{
Commits: result,
Diff: ctx.Data["Diff"],
}
different.CommitsCount = len(compareInfo.Commits)
different.Latestsha = compareInfo.HeadCommitID
ctx.JSON(http.StatusOK, different)
}
} }
different := struct {
Commits []CompareCommit
Diff interface{}
CommitsCount int
Latestsha string
FilesCount int
}{
Commits: result,
// Diff: ctx.Data["Diff"],
}
different.CommitsCount = len(compareInfo.Commits)
different.Latestsha = compareInfo.HeadCommitID
different.FilesCount = compareInfo.NumFiles
ctx.JSON(http.StatusOK, different)
} }
func CompareFiles(ctx *context.APIContext) { func CompareFiles(ctx *context.APIContext) {
@ -255,17 +367,25 @@ func ParseCompareInfo(ctx *context.APIContext) (*user_model.User, *repo_model.Re
headRepo *repo_model.Repository headRepo *repo_model.Repository
headBranch string headBranch string
isSameRepo bool isSameRepo bool
infoPath string
err error err error
directComparison bool directComparison bool
) )
shaFrom := ctx.Params("shaFrom") infoPath = ctx.Params("*")
shaTo := ctx.Params("shaTo")
var infos []string var infos []string
if shaFrom == "" || shaTo == "" { if infoPath == "" {
infos = []string{baseRepo.DefaultBranch, baseRepo.DefaultBranch} infos = []string{baseRepo.DefaultBranch, baseRepo.DefaultBranch}
} else { } else {
infos = []string{shaFrom, shaTo} infos = strings.SplitN(infoPath, "...", 2)
if len(infos) != 2 {
if infos = strings.SplitN(infoPath, "..", 2); len(infos) == 2 {
directComparison = true
ctx.Data["PageIsComparePull"] = false
} else {
infos = []string{baseRepo.DefaultBranch, infoPath}
}
}
} }
ctx.Data["BaseName"] = baseRepo.OwnerName ctx.Data["BaseName"] = baseRepo.OwnerName