code.gitea.io/gitea@v1.22.3/routers/api/v1/repo/compare.go (about) 1 // Copyright 2024 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package repo 5 6 import ( 7 "net/http" 8 "strings" 9 10 user_model "code.gitea.io/gitea/models/user" 11 "code.gitea.io/gitea/modules/gitrepo" 12 api "code.gitea.io/gitea/modules/structs" 13 "code.gitea.io/gitea/services/context" 14 "code.gitea.io/gitea/services/convert" 15 ) 16 17 // CompareDiff compare two branches or commits 18 func CompareDiff(ctx *context.APIContext) { 19 // swagger:operation GET /repos/{owner}/{repo}/compare/{basehead} repository repoCompareDiff 20 // --- 21 // summary: Get commit comparison information 22 // produces: 23 // - application/json 24 // parameters: 25 // - name: owner 26 // in: path 27 // description: owner of the repo 28 // type: string 29 // required: true 30 // - name: repo 31 // in: path 32 // description: name of the repo 33 // type: string 34 // required: true 35 // - name: basehead 36 // in: path 37 // description: compare two branches or commits 38 // type: string 39 // required: true 40 // responses: 41 // "200": 42 // "$ref": "#/responses/Compare" 43 // "404": 44 // "$ref": "#/responses/notFound" 45 46 if ctx.Repo.GitRepo == nil { 47 gitRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository) 48 if err != nil { 49 ctx.Error(http.StatusInternalServerError, "OpenRepository", err) 50 return 51 } 52 ctx.Repo.GitRepo = gitRepo 53 defer gitRepo.Close() 54 } 55 56 infoPath := ctx.Params("*") 57 infos := []string{ctx.Repo.Repository.DefaultBranch, ctx.Repo.Repository.DefaultBranch} 58 if infoPath != "" { 59 infos = strings.SplitN(infoPath, "...", 2) 60 if len(infos) != 2 { 61 if infos = strings.SplitN(infoPath, "..", 2); len(infos) != 2 { 62 infos = []string{ctx.Repo.Repository.DefaultBranch, infoPath} 63 } 64 } 65 } 66 67 _, _, headGitRepo, ci, _, _ := parseCompareInfo(ctx, api.CreatePullRequestOption{ 68 Base: infos[0], 69 Head: infos[1], 70 }) 71 if ctx.Written() { 72 return 73 } 74 defer headGitRepo.Close() 75 76 verification := ctx.FormString("verification") == "" || ctx.FormBool("verification") 77 files := ctx.FormString("files") == "" || ctx.FormBool("files") 78 79 apiCommits := make([]*api.Commit, 0, len(ci.Commits)) 80 userCache := make(map[string]*user_model.User) 81 for i := 0; i < len(ci.Commits); i++ { 82 apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache, 83 convert.ToCommitOptions{ 84 Stat: true, 85 Verification: verification, 86 Files: files, 87 }) 88 if err != nil { 89 ctx.ServerError("toCommit", err) 90 return 91 } 92 apiCommits = append(apiCommits, apiCommit) 93 } 94 95 ctx.JSON(http.StatusOK, &api.Compare{ 96 TotalCommits: len(ci.Commits), 97 Commits: apiCommits, 98 }) 99 }