From f91cb9321e06cf3570ca373e16ca84804ef7950a Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 16 Dec 2018 19:47:32 -0500 Subject: api: add GetReferenceSHA (#5546) --- routes/api/v1/api.go | 1 + routes/api/v1/repo/commits.go | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) (limited to 'routes/api') diff --git a/routes/api/v1/api.go b/routes/api/v1/api.go index ccecc6a7..d73f57f3 100644 --- a/routes/api/v1/api.go +++ b/routes/api/v1/api.go @@ -252,6 +252,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/commits", func() { m.Get("/:sha", repo.GetSingleCommit) + m.Get("/*", repo.GetReferenceSHA) }) m.Group("/keys", func() { diff --git a/routes/api/v1/repo/commits.go b/routes/api/v1/repo/commits.go index a856d37f..302ece1c 100644 --- a/routes/api/v1/repo/commits.go +++ b/routes/api/v1/repo/commits.go @@ -5,6 +5,8 @@ package repo import ( + "net/http" + "strings" "time" "github.com/gogs/git-module" @@ -17,6 +19,12 @@ import ( ) func GetSingleCommit(c *context.APIContext) { + if strings.Contains(c.Req.Header.Get("Accept"), api.MediaApplicationSHA) { + c.SetParams("*", c.Params(":sha")) + GetReferenceSHA(c) + return + } + gitRepo, err := git.OpenRepository(c.Repo.Repository.RepoPath()) if err != nil { c.ServerError("OpenRepository", err) @@ -89,3 +97,42 @@ func GetSingleCommit(c *context.APIContext) { Parents: apiParents, }) } + +func GetReferenceSHA(c *context.APIContext) { + gitRepo, err := git.OpenRepository(c.Repo.Repository.RepoPath()) + if err != nil { + c.ServerError("OpenRepository", err) + return + } + + ref := c.Params("*") + refType := 0 // 0-undetermined, 1-branch, 2-tag + if strings.HasPrefix(ref, git.BRANCH_PREFIX) { + ref = strings.TrimPrefix(ref, git.BRANCH_PREFIX) + refType = 1 + } else if strings.HasPrefix(ref, git.TAG_PREFIX) { + ref = strings.TrimPrefix(ref, git.TAG_PREFIX) + refType = 2 + } else { + if gitRepo.IsBranchExist(ref) { + refType = 1 + } else if gitRepo.IsTagExist(ref) { + refType = 2 + } else { + c.NotFound() + return + } + } + + var sha string + if refType == 1 { + sha, err = gitRepo.GetBranchCommitID(ref) + } else if refType == 2 { + sha, err = gitRepo.GetTagCommitID(ref) + } + if err != nil { + c.NotFoundOrServerError("get reference commit ID", git.IsErrNotExist, err) + return + } + c.PlainText(http.StatusOK, []byte(sha)) +} -- cgit v1.2.3