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