From a5d3e1900ef7a967619bdb9cf13162ffdadcfec1 Mon Sep 17 00:00:00 2001 From: Yehonatan Ezron <37303618+jonatan5524@users.noreply.github.com> Date: Sun, 17 Jul 2022 10:16:52 +0300 Subject: [PATCH] api: support getting blob content (#7080) Co-authored-by: Joe Chen --- internal/route/api/v1/api.go | 9 ++++-- internal/route/api/v1/repo/blob.go | 49 ++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 internal/route/api/v1/repo/blob.go diff --git a/internal/route/api/v1/api.go b/internal/route/api/v1/api.go index a517c6df8..f1684691b 100644 --- a/internal/route/api/v1/api.go +++ b/internal/route/api/v1/api.go @@ -276,8 +276,13 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/*", repo.GetContents) }) m.Get("/archive/*", repo.GetArchive) - m.Group("/git/trees", func() { - m.Get("/:sha", repo.GetRepoGitTree) + m.Group("/git", func() { + m.Group("/trees", func() { + m.Get("/:sha", repo.GetRepoGitTree) + }) + m.Group("/blobs", func() { + m.Get("/:sha", repo.RepoGitBlob) + }) }) m.Get("/forks", repo.ListForks) m.Get("/tags", repo.ListTags) diff --git a/internal/route/api/v1/repo/blob.go b/internal/route/api/v1/repo/blob.go new file mode 100644 index 000000000..7c3b26159 --- /dev/null +++ b/internal/route/api/v1/repo/blob.go @@ -0,0 +1,49 @@ +package repo + +import ( + "encoding/base64" + "fmt" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" + "gogs.io/gogs/internal/gitutil" + "gogs.io/gogs/internal/repoutil" +) + +func RepoGitBlob(c *context.APIContext) { + gitRepo, err := git.Open(repoutil.RepositoryPath(c.Params(":username"), c.Params(":reponame"))) + if err != nil { + c.Error(err, "open repository") + return + } + + sha := c.Params(":sha") + blob, err := gitRepo.CatFileBlob(sha) + if err != nil { + c.NotFoundOrError(gitutil.NewError(err), "get blob") + return + } + + type repoGitBlob struct { + Content string `json:"content"` + Encoding string `json:"encoding"` + URL string `json:"url"` + SHA string `json:"sha"` + Size int64 `json:"size"` + } + + content, err := blob.Blob().Bytes() + if err != nil { + c.NotFoundOrError(gitutil.NewError(err), "get blob content") + return + } + + c.JSONSuccess(&repoGitBlob{ + Content: base64.StdEncoding.EncodeToString(content), + Encoding: "base64", + URL: fmt.Sprintf("%s/repos/%s/%s/git/blobs/%s", c.BaseURL, c.Params(":username"), c.Params(":reponame"), sha), + SHA: sha, + Size: blob.Size(), + }) +}