diff options
Diffstat (limited to 'internal/route/api/v1/repo')
-rw-r--r-- | internal/route/api/v1/repo/tree.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/internal/route/api/v1/repo/tree.go b/internal/route/api/v1/repo/tree.go new file mode 100644 index 00000000..c39f3acd --- /dev/null +++ b/internal/route/api/v1/repo/tree.go @@ -0,0 +1,77 @@ +package repo + +import ( + "fmt" + + "github.com/gogs/git-module" + + "gogs.io/gogs/internal/context" +) + +type repoGitTree struct { + Sha string `json:"sha"` + URL string `json:"url"` + Tree []*repoGitTreeEntry `json:"tree"` +} + +type repoGitTreeEntry struct { + Path string `json:"path"` + Mode string `json:"mode"` + Type string `json:"type"` + Size int64 `json:"size"` + Sha string `json:"sha"` + URL string `json:"url"` +} + +func GetRepoGitTree(c *context.APIContext) { + gitTree, err := c.Repo.GitRepo.GetTree(c.Params(":sha")) + if err != nil { + c.NotFoundOrServerError("GetRepoGitTree", git.IsErrNotExist, err) + return + } + entries, err := gitTree.ListEntries() + if err != nil { + c.ServerError("GetRepoGitTree", err) + return + } + + templateURL := fmt.Sprintf("%s/repos/%s/%s/git/trees", c.BaseURL, c.Params(":username"), c.Params(":reponame")) + + if len(entries) == 0 { + c.JSONSuccess(&repoGitTree{ + Sha: c.Params(":sha"), + URL: fmt.Sprintf(templateURL+"/%s", c.Params(":sha")), + }) + return + } + + children := make([]*repoGitTreeEntry, 0, len(entries)) + for _, entry := range entries { + var mode string + switch entry.Type { + case git.ObjectCommit: + mode = "160000" + case git.ObjectTree: + mode = "040000" + case git.ObjectBlob: + mode = "120000" + case git.ObjectTag: + mode = "100644" + default: + mode = "" + } + children = append(children, &repoGitTreeEntry{ + Path: entry.Name(), + Mode: mode, + Type: string(entry.Type), + Size: entry.Size(), + Sha: entry.ID.String(), + URL: fmt.Sprintf(templateURL+"/%s", entry.ID.String()), + }) + } + c.JSONSuccess(&repoGitTree{ + Sha: c.Params(":sha"), + URL: fmt.Sprintf(templateURL+"/%s", c.Params(":sha")), + Tree: children, + }) +} |