API endpoints for forks (#509)
This commit is contained in:
		
							parent
							
								
									527c2dd665
								
							
						
					
					
						commit
						b75450ad36
					
				
					 4 changed files with 104 additions and 3 deletions
				
			
		|  | @ -276,6 +276,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| 				}) | ||||
| 				m.Get("/raw/*", context.RepoRef(), repo.GetRawFile) | ||||
| 				m.Get("/archive/*", repo.GetArchive) | ||||
| 				m.Combo("/forks").Get(repo.ListForks). | ||||
| 					Post(bind(api.CreateForkOption{}), repo.CreateFork) | ||||
| 				m.Group("/branches", func() { | ||||
| 					m.Get("", repo.ListBranches) | ||||
| 					m.Get("/:branchname", repo.GetBranch) | ||||
|  |  | |||
							
								
								
									
										61
									
								
								routers/api/v1/repo/fork.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								routers/api/v1/repo/fork.go
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										38
									
								
								vendor/code.gitea.io/sdk/gitea/fork.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
									
								
							
							
						
						
									
										6
									
								
								vendor/vendor.json
									
									
									
									
										vendored
									
									
								
							|  | @ -9,10 +9,10 @@ | |||
| 			"revisionTime": "2016-12-28T14:57:51Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "dnGaLR7sd9D5YpQZP4QUGZiEq+c=", | ||||
| 			"checksumSHA1": "5J8ejjEp2moLyK1pD++Jzof8DFs=", | ||||
| 			"path": "code.gitea.io/sdk/gitea", | ||||
| 			"revision": "d628d07f7377c2c10df5e0292370b21d9ac689eb", | ||||
| 			"revisionTime": "2016-12-24T02:50:46Z" | ||||
| 			"revision": "c0e081342a4b99d90371081b888765b91f05546f", | ||||
| 			"revisionTime": "2016-12-29T09:40:42Z" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"checksumSHA1": "IyfS7Rbl6OgR83QR7TOfKdDCq+M=", | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue