summaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
authorqwerty287 <80460567+qwerty287@users.noreply.github.com>2021-12-22 07:17:33 +0100
committerGitHub <noreply@github.com>2021-12-22 06:17:33 +0000
commita9ed1c5c7c6c85ae280e6a13ca0d4e665945efb4 (patch)
tree71334ceee5297ae364184df9f5c671264b558214 /routers
parentd155ffc610403819b772b3eac2a88d26d364d048 (diff)
downloadgitea-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.go79
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))