Browse Source

api: support getting blob content (#7080)

Co-authored-by: Joe Chen <[email protected]>
Yehonatan Ezron 2 years ago
parent
commit
a5d3e1900e
2 changed files with 56 additions and 2 deletions
  1. 7 2
      internal/route/api/v1/api.go
  2. 49 0
      internal/route/api/v1/repo/blob.go

+ 7 - 2
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)

+ 49 - 0
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(),
+	})
+}