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 3.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. "fmt"
  7. "net/http"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. api "code.gitea.io/gitea/modules/structs"
  11. repo_service "code.gitea.io/gitea/services/repository"
  12. )
  13. // ListForks list a repository's forks
  14. func ListForks(ctx *context.APIContext) {
  15. // swagger:operation GET /repos/{owner}/{repo}/forks repository listForks
  16. // ---
  17. // summary: List a repository's forks
  18. // produces:
  19. // - application/json
  20. // parameters:
  21. // - name: owner
  22. // in: path
  23. // description: owner of the repo
  24. // type: string
  25. // required: true
  26. // - name: repo
  27. // in: path
  28. // description: name of the repo
  29. // type: string
  30. // required: true
  31. // responses:
  32. // "200":
  33. // "$ref": "#/responses/RepositoryList"
  34. forks, err := ctx.Repo.Repository.GetForks()
  35. if err != nil {
  36. ctx.Error(http.StatusInternalServerError, "GetForks", err)
  37. return
  38. }
  39. apiForks := make([]*api.Repository, len(forks))
  40. for i, fork := range forks {
  41. access, err := models.AccessLevel(ctx.User, fork)
  42. if err != nil {
  43. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  44. return
  45. }
  46. apiForks[i] = fork.APIFormat(access)
  47. }
  48. ctx.JSON(http.StatusOK, apiForks)
  49. }
  50. // CreateFork create a fork of a repo
  51. func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
  52. // swagger:operation POST /repos/{owner}/{repo}/forks repository createFork
  53. // ---
  54. // summary: Fork a repository
  55. // produces:
  56. // - application/json
  57. // parameters:
  58. // - name: owner
  59. // in: path
  60. // description: owner of the repo to fork
  61. // type: string
  62. // required: true
  63. // - name: repo
  64. // in: path
  65. // description: name of the repo to fork
  66. // type: string
  67. // required: true
  68. // - name: body
  69. // in: body
  70. // schema:
  71. // "$ref": "#/definitions/CreateForkOption"
  72. // responses:
  73. // "202":
  74. // "$ref": "#/responses/Repository"
  75. // "403":
  76. // "$ref": "#/responses/forbidden"
  77. // "422":
  78. // "$ref": "#/responses/validationError"
  79. repo := ctx.Repo.Repository
  80. var forker *models.User // user/org that will own the fork
  81. if form.Organization == nil {
  82. forker = ctx.User
  83. } else {
  84. org, err := models.GetOrgByName(*form.Organization)
  85. if err != nil {
  86. if models.IsErrOrgNotExist(err) {
  87. ctx.Error(http.StatusUnprocessableEntity, "", err)
  88. } else {
  89. ctx.Error(http.StatusInternalServerError, "GetOrgByName", err)
  90. }
  91. return
  92. }
  93. isMember, err := org.IsOrgMember(ctx.User.ID)
  94. if err != nil {
  95. ctx.ServerError("IsOrgMember", err)
  96. return
  97. } else if !isMember {
  98. ctx.Error(http.StatusForbidden, "isMemberNot", fmt.Sprintf("User is no Member of Organisation '%s'", org.Name))
  99. return
  100. }
  101. forker = org
  102. }
  103. fork, err := repo_service.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
  104. if err != nil {
  105. ctx.Error(http.StatusInternalServerError, "ForkRepository", err)
  106. return
  107. }
  108. //TODO change back to 201
  109. ctx.JSON(http.StatusAccepted, fork.APIFormat(models.AccessModeOwner))
  110. }