API endpoints for forks (#509)

This commit is contained in:
Ethan Koenig 2016-12-30 20:15:45 -05:00 committed by Lunny Xiao
parent 527c2dd665
commit b75450ad36
4 changed files with 104 additions and 3 deletions

View file

@ -276,6 +276,8 @@ func RegisterRoutes(m *macaron.Macaron) {
}) })
m.Get("/raw/*", context.RepoRef(), repo.GetRawFile) m.Get("/raw/*", context.RepoRef(), repo.GetRawFile)
m.Get("/archive/*", repo.GetArchive) m.Get("/archive/*", repo.GetArchive)
m.Combo("/forks").Get(repo.ListForks).
Post(bind(api.CreateForkOption{}), repo.CreateFork)
m.Group("/branches", func() { m.Group("/branches", func() {
m.Get("", repo.ListBranches) m.Get("", repo.ListBranches)
m.Get("/:branchname", repo.GetBranch) m.Get("/:branchname", repo.GetBranch)

View file

@ -0,0 +1,61 @@
// Copyright 2016 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
api "code.gitea.io/sdk/gitea"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
)
// ListForks list a repository's forks
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, fork := range forks {
access, err := models.AccessLevel(ctx.User, fork)
if err != nil {
ctx.Error(500, "AccessLevel", err)
return
}
apiForks[i] = fork.APIFormat(access)
}
ctx.JSON(200, apiForks)
}
// CreateFork create a fork of a repo
func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
repo := ctx.Repo.Repository
var forker *models.User // user/org that will own the fork
if form.Organization == nil {
forker = ctx.User
} else {
org, err := models.GetOrgByName(*form.Organization)
if err != nil {
if err == models.ErrOrgNotExist {
ctx.Error(422, "", err)
} else {
ctx.Error(500, "GetOrgByName", err)
}
return
}
if !org.IsOrgMember(ctx.User.ID) {
ctx.Status(403)
return
}
forker = org
}
fork, err := models.ForkRepository(forker, repo, repo.Name, repo.Description)
if err != nil {
ctx.Error(500, "ForkRepository", err)
return
}
ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
}

38
vendor/code.gitea.io/sdk/gitea/fork.go generated vendored Normal file
View file

@ -0,0 +1,38 @@
// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package gitea
import (
"bytes"
"encoding/json"
"fmt"
)
// ListForks list a repository's forks
func (c *Client) ListForks(user, repo string) ([]*Repository, error) {
forks := make([]*Repository, 10)
err := c.getParsedResponse("GET",
fmt.Sprintf("/repos/%s/%s/forks", user, repo),
nil, nil, &forks)
return forks, err
}
// CreateForkOption options for creating a fork
type CreateForkOption struct {
Organization *string `json:"organization"`
}
// CreateFork create a fork of a repository
func (c *Client) CreateFork(user, repo string, form CreateForkOption) (*Repository, error) {
body, err := json.Marshal(form)
if err != nil {
return nil, err
}
fork := new(Repository)
err = c.getParsedResponse("POST",
fmt.Sprintf("/repos/%s/%s/forks", user, repo),
jsonHeader, bytes.NewReader(body), &fork)
return fork, err
}

6
vendor/vendor.json vendored
View file

@ -9,10 +9,10 @@
"revisionTime": "2016-12-28T14:57:51Z" "revisionTime": "2016-12-28T14:57:51Z"
}, },
{ {
"checksumSHA1": "dnGaLR7sd9D5YpQZP4QUGZiEq+c=", "checksumSHA1": "5J8ejjEp2moLyK1pD++Jzof8DFs=",
"path": "code.gitea.io/sdk/gitea", "path": "code.gitea.io/sdk/gitea",
"revision": "d628d07f7377c2c10df5e0292370b21d9ac689eb", "revision": "c0e081342a4b99d90371081b888765b91f05546f",
"revisionTime": "2016-12-24T02:50:46Z" "revisionTime": "2016-12-29T09:40:42Z"
}, },
{ {
"checksumSHA1": "IyfS7Rbl6OgR83QR7TOfKdDCq+M=", "checksumSHA1": "IyfS7Rbl6OgR83QR7TOfKdDCq+M=",