diff options
author | qwerty287 <80460567+qwerty287@users.noreply.github.com> | 2021-12-22 07:17:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-22 06:17:33 +0000 |
commit | a9ed1c5c7c6c85ae280e6a13ca0d4e665945efb4 (patch) | |
tree | 71334ceee5297ae364184df9f5c671264b558214 /routers | |
parent | d155ffc610403819b772b3eac2a88d26d364d048 (diff) | |
download | gitea-a9ed1c5c7c6c85ae280e6a13ca0d4e665945efb4.tar.gz gitea-a9ed1c5c7c6c85ae280e6a13ca0d4e665945efb4.zip |
Add API to get file commit history (#17652)
Adds an API endpoint `api/v1/repos/{owner}/{repo}/git/history/{filepath}` to get the commits affecting the given file or directory.
Closes https://github.com/go-gitea/gitea/issues/16206 and closes https://github.com/go-gitea/gitea/issues/16703
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/repo/commits.go | 79 |
1 files changed, 55 insertions, 24 deletions
diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go index 6845ccb363..a2b4298602 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -108,13 +108,17 @@ func GetAllCommits(ctx *context.APIContext) { // in: query // description: SHA or branch to start listing commits from (usually 'master') // type: string + // - name: path + // in: query + // description: filepath of a file/dir + // type: string // - name: page // in: query // description: page number of results to return (1-based) // type: integer // - name: limit // in: query - // description: page size of results + // description: page size of results (ignored if used with 'path') // type: integer // responses: // "200": @@ -149,46 +153,73 @@ func GetAllCommits(ctx *context.APIContext) { } sha := ctx.FormString("sha") + path := ctx.FormString("path") + + var ( + commitsCountTotal int64 + commits []*git.Commit + ) + + if len(path) == 0 { + var baseCommit *git.Commit + if len(sha) == 0 { + // no sha supplied - use default branch + head, err := gitRepo.GetHEADBranch() + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetHEADBranch", err) + return + } + + baseCommit, err = gitRepo.GetBranchCommit(head.Name) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetCommit", err) + return + } + } else { + // get commit specified by sha + baseCommit, err = gitRepo.GetCommit(sha) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetCommit", err) + return + } + } - var baseCommit *git.Commit - if len(sha) == 0 { - // no sha supplied - use default branch - head, err := gitRepo.GetHEADBranch() + // Total commit count + commitsCountTotal, err = baseCommit.CommitsCount() if err != nil { - ctx.Error(http.StatusInternalServerError, "GetHEADBranch", err) + ctx.Error(http.StatusInternalServerError, "GetCommitsCount", err) return } - baseCommit, err = gitRepo.GetBranchCommit(head.Name) + // Query commits + commits, err = baseCommit.CommitsByRange(listOptions.Page, listOptions.PageSize) if err != nil { - ctx.Error(http.StatusInternalServerError, "GetCommit", err) + ctx.Error(http.StatusInternalServerError, "CommitsByRange", err) return } } else { - // get commit specified by sha - baseCommit, err = gitRepo.GetCommit(sha) + if len(sha) == 0 { + sha = ctx.Repo.Repository.DefaultBranch + } + + commitsCountTotal, err = gitRepo.FileCommitsCount(sha, path) if err != nil { - ctx.Error(http.StatusInternalServerError, "GetCommit", err) + ctx.Error(http.StatusInternalServerError, "FileCommitsCount", err) + return + } else if commitsCountTotal == 0 { + ctx.NotFound("FileCommitsCount", nil) return } - } - // Total commit count - commitsCountTotal, err := baseCommit.CommitsCount() - if err != nil { - ctx.Error(http.StatusInternalServerError, "GetCommitsCount", err) - return + commits, err = gitRepo.CommitsByFileAndRange(sha, path, listOptions.Page) + if err != nil { + ctx.Error(http.StatusInternalServerError, "CommitsByFileAndRange", err) + return + } } pageCount := int(math.Ceil(float64(commitsCountTotal) / float64(listOptions.PageSize))) - // Query commits - commits, err := baseCommit.CommitsByRange(listOptions.Page, listOptions.PageSize) - if err != nil { - ctx.Error(http.StatusInternalServerError, "CommitsByRange", err) - return - } - userCache := make(map[string]*user_model.User) apiCommits := make([]*api.Commit, len(commits)) |