api: support getting blob content (#7080)

Co-authored-by: Joe Chen <jc@unknwon.io>
pull/7111/head
Yehonatan Ezron 2022-07-17 10:16:52 +03:00 committed by GitHub
parent ab7133b35a
commit a5d3e1900e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 2 deletions

View File

@ -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)

View File

@ -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(),
})
}