aboutsummaryrefslogtreecommitdiff
path: root/internal/route/api/v1/repo/blob.go
blob: 7c3b261590b6bcc7fa29c9de72b9f931c11a1bf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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(),
	})
}