api: support getting repository Git tree (#5934) (#5937)

* add basic git repository tree api (#5934)

This PR adds the tree  api endpoint to gogs api:
`GET/repos/:owner/:repo/git/trees/:tree_sha`

This new api endpoint that is being added is in conformance to
the GitHub REST API v3 specification. Documentation can be found
here: developer.github.com/v3/git/trees/#get-a-tree

For a given user, repo and sha value, this api (currently) returns
a single tree using the SHA1 value for that tree.

- Recursive implementation is yet to be implemented.
- Creating a Tree using POST is yet to be implemented.

Example curl:

```

l curl -H "Authorization: token REDACTED" c59441ded1 -X GET  | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   940  100   940    0     0  12034      0 --:--:-- --:--:-- --:--:-- 12051

[
  {
    "sha": "c59441ded1549b149def0d4c54594d31a7f3718f",
    "tree": [
      {
        "mode": "120000",
        "path": "/home/bharatnc/gogs-repositories/root/testrepo.git",
        "sha": "472ac2361b65136b393d652de25341e2ea44f299",
        "size": 1077,
        "type": "blob",
        "url": "472ac2361b"
      },
      {
        "mode": "120000",
        "path": "/home/bharatnc/gogs-repositories/root/testrepo.git",
        "sha": "70fcb456d436f08462602f26df6fb7e167e7a916",
        "size": 12,
        "type": "blob",
        "url": "70fcb456d4"
      },
      {
        "mode": "120000",
        "path": "/home/bharatnc/gogs-repositories/root/testrepo.git",
        "sha": "092c58d4b63df5779a4d020b1fdbb762421bbb4f",
        "size": 380,
        "type": "blob",
        "url": "092c58d4b6"
      }
    ],
    "url": "c59441ded1"
  }
]

```

* remove vertical space

* make go.mod to be same as in master

* rename structs to sound better

* simplify expressions and fix error msg

* Update tree.go

* Update tree.go

* display file name instead of repo path

* Update tree.go

Co-authored-by: ᴜɴᴋɴᴡᴏɴ <u@gogs.io>
pull/5942/head
Bharat Nallan 2020-02-25 06:19:42 -08:00 committed by GitHub
parent 85f94676ba
commit cf3d55fa10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 0 deletions

View File

@ -272,6 +272,9 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/raw/*", context.RepoRef(), repo2.GetRawFile)
m.Get("/archive/*", repo2.GetArchive)
m.Group("/git/trees", func() {
m.Get("/:sha", context.RepoRef(), repo2.GetRepoGitTree)
})
m.Get("/forks", repo2.ListForks)
m.Group("/branches", func() {
m.Get("", repo2.ListBranches)

View File

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