You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

fork.go 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package repo
  5. import (
  6. api "code.gitea.io/sdk/gitea"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/routers/api/v1/utils"
  10. )
  11. // ListForks list a repository's forks
  12. func ListForks(ctx *context.APIContext) {
  13. // swagger:route GET /repos/{owner}/{repo}/forks listForks
  14. //
  15. // Produces:
  16. // - application/json
  17. //
  18. // Responses:
  19. // 200: RepositoryList
  20. // 500: error
  21. forks, err := ctx.Repo.Repository.GetForks()
  22. if err != nil {
  23. ctx.Error(500, "GetForks", err)
  24. return
  25. }
  26. apiForks := make([]*api.Repository, len(forks))
  27. for i, fork := range forks {
  28. access, err := models.AccessLevel(utils.UserID(ctx), fork)
  29. if err != nil {
  30. ctx.Error(500, "AccessLevel", err)
  31. return
  32. }
  33. apiForks[i] = fork.APIFormat(access)
  34. }
  35. ctx.JSON(200, apiForks)
  36. }
  37. // CreateFork create a fork of a repo
  38. func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
  39. // swagger:route POST /repos/{owner}/{repo}/forks createFork
  40. //
  41. // Produces:
  42. // - application/json
  43. //
  44. // Responses:
  45. // 202: Repository
  46. // 403: forbidden
  47. // 422: validationError
  48. // 500: error
  49. repo := ctx.Repo.Repository
  50. var forker *models.User // user/org that will own the fork
  51. if form.Organization == nil {
  52. forker = ctx.User
  53. } else {
  54. org, err := models.GetOrgByName(*form.Organization)
  55. if err != nil {
  56. if models.IsErrOrgNotExist(err) {
  57. ctx.Error(422, "", err)
  58. } else {
  59. ctx.Error(500, "GetOrgByName", err)
  60. }
  61. return
  62. }
  63. if !org.IsOrgMember(ctx.User.ID) {
  64. ctx.Status(403)
  65. return
  66. }
  67. forker = org
  68. }
  69. fork, err := models.ForkRepository(forker, repo, repo.Name, repo.Description)
  70. if err != nil {
  71. ctx.Error(500, "ForkRepository", err)
  72. return
  73. }
  74. ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
  75. }