2016-12-31 04:15:45 +03:00
// 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 (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
2017-07-12 04:23:41 +03:00
"code.gitea.io/gitea/routers/api/v1/utils"
2018-03-29 16:32:40 +03:00
api "code.gitea.io/sdk/gitea"
2016-12-31 04:15:45 +03:00
)
// ListForks list a repository's forks
func ListForks ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /repos/{owner}/{repo}/forks repository listForks
// ---
// summary: List a repository's forks
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/RepositoryList"
2016-12-31 04:15:45 +03:00
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 {
2017-07-12 04:23:41 +03:00
access , err := models . AccessLevel ( utils . UserID ( ctx ) , fork )
2016-12-31 04:15:45 +03:00
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 ) {
2017-11-13 10:02:25 +03:00
// swagger:operation POST /repos/{owner}/{repo}/forks repository createFork
// ---
// summary: Fork a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo to fork
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo to fork
// type: string
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateForkOption"
// responses:
// "202":
// "$ref": "#/responses/Repository"
2016-12-31 04:15:45 +03:00
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 {
2017-07-06 16:30:19 +03:00
if models . IsErrOrgNotExist ( err ) {
2016-12-31 04:15:45 +03:00
ctx . Error ( 422 , "" , err )
} else {
ctx . Error ( 500 , "GetOrgByName" , err )
}
return
}
2017-12-21 10:43:26 +03:00
isMember , err := org . IsOrgMember ( ctx . User . ID )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "IsOrgMember" , err )
2017-12-21 10:43:26 +03:00
return
} else if ! isMember {
2016-12-31 04:15:45 +03:00
ctx . Status ( 403 )
return
}
forker = org
}
2017-09-03 11:20:24 +03:00
fork , err := models . ForkRepository ( ctx . User , forker , repo , repo . Name , repo . Description )
2016-12-31 04:15:45 +03:00
if err != nil {
ctx . Error ( 500 , "ForkRepository" , err )
return
}
ctx . JSON ( 202 , fork . APIFormat ( models . AccessModeOwner ) )
}