// Copyright 2024 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package repo import ( "net/http" "strings" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/gitrepo" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" ) // CompareDiff compare two branches or commits func CompareDiff(ctx *context.APIContext) { // swagger:operation GET /repos/{owner}/{repo}/compare/{basehead} repository repoCompareDiff // --- // summary: Get commit comparison information // produces: // - application/json // parameters: // - name: owner // in: path // description: owner of the repo // type: string // required: true // - name: repo // in: path // description: name of the repo // type: string // required: true // - name: basehead // in: path // description: compare two branches or commits // type: string // required: true // responses: // "200": // "$ref": "#/responses/Compare" // "404": // "$ref": "#/responses/notFound" if ctx.Repo.GitRepo == nil { gitRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository) if err != nil { ctx.Error(http.StatusInternalServerError, "OpenRepository", err) return } ctx.Repo.GitRepo = gitRepo defer gitRepo.Close() } infoPath := ctx.Params("*") infos := []string{ctx.Repo.Repository.DefaultBranch, ctx.Repo.Repository.DefaultBranch} if infoPath != "" { infos = strings.SplitN(infoPath, "...", 2) if len(infos) != 2 { if infos = strings.SplitN(infoPath, "..", 2); len(infos) != 2 { infos = []string{ctx.Repo.Repository.DefaultBranch, infoPath} } } } _, _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ Base: infos[0], Head: infos[1], }) if ctx.Written() { return } defer headGitRepo.Close() verification := ctx.FormString("verification") == "" || ctx.FormBool("verification") files := ctx.FormString("files") == "" || ctx.FormBool("files") apiCommits := make([]*api.Commit, 0, len(ci.Commits)) userCache := make(map[string]*user_model.User) for i := 0; i < len(ci.Commits); i++ { apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache, convert.ToCommitOptions{ Stat: true, Verification: verification, Files: files, }) if err != nil { ctx.ServerError("toCommit", err) return } apiCommits = append(apiCommits, apiCommit) } ctx.JSON(http.StatusOK, &api.Compare{ TotalCommits: len(ci.Commits), Commits: apiCommits, }) }