From c98aa0e8950393ac43dc66e8de85973d9cd029ef Mon Sep 17 00:00:00 2001 From: Dennis Chen Date: Sat, 28 Jan 2017 14:59:21 -0800 Subject: [PATCH] api: display repository forks (#3252) Lists the forks of a repository at the /:user/:repo/forks endpoint. Signed-off-by: Dennis Chen --- routers/api/v1/api.go | 1 + routers/api/v1/repo/repo.go | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 78fc3f45a..b03f949f7 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -247,6 +247,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Put("/collaborators/:collaborator", bind(api.AddCollaboratorOption{}), repo.AddCollaborator) m.Get("/raw/*", context.RepoRef(), repo.GetRawFile) m.Get("/archive/*", repo.GetArchive) + m.Get("/forks", repo.ListForks) m.Group("/branches", func() { m.Get("", repo.ListBranches) m.Get("/:branchname", repo.GetBranch) diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index e36f18b00..76d63543f 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -297,3 +297,26 @@ func Delete(ctx *context.APIContext) { log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name) ctx.Status(204) } + +func ListForks(ctx *context.APIContext) { + forks, err := ctx.Repo.Repository.GetForks() + if err != nil { + ctx.Error(500, "GetForks", err) + return + } + + apiForks := make([]*api.Repository, len(forks)) + for i := range forks { + if err := forks[i].GetOwner(); err != nil { + ctx.Error(500, "GetOwner", err) + return + } + apiForks[i] = forks[i].APIFormat(&api.Permission{ + Admin: ctx.User.IsAdminOfRepo(forks[i]), + Push: ctx.User.IsWriterOfRepo(forks[i]), + Pull: true, + }) + } + + ctx.JSON(200, &apiForks) +}