您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2020 The Gitea Authors.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package repo
  6. import (
  7. "fmt"
  8. "net/http"
  9. "code.gitea.io/gitea/models"
  10. "code.gitea.io/gitea/modules/context"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "code.gitea.io/gitea/routers/api/v1/utils"
  13. repo_service "code.gitea.io/gitea/services/repository"
  14. )
  15. // ListForks list a repository's forks
  16. func ListForks(ctx *context.APIContext) {
  17. // swagger:operation GET /repos/{owner}/{repo}/forks repository listForks
  18. // ---
  19. // summary: List a repository's forks
  20. // produces:
  21. // - application/json
  22. // parameters:
  23. // - name: owner
  24. // in: path
  25. // description: owner of the repo
  26. // type: string
  27. // required: true
  28. // - name: repo
  29. // in: path
  30. // description: name of the repo
  31. // type: string
  32. // required: true
  33. // - name: page
  34. // in: query
  35. // description: page number of results to return (1-based)
  36. // type: integer
  37. // - name: limit
  38. // in: query
  39. // description: page size of results, maximum page size is 50
  40. // type: integer
  41. // responses:
  42. // "200":
  43. // "$ref": "#/responses/RepositoryList"
  44. forks, err := ctx.Repo.Repository.GetForks(utils.GetListOptions(ctx))
  45. if err != nil {
  46. ctx.Error(http.StatusInternalServerError, "GetForks", err)
  47. return
  48. }
  49. apiForks := make([]*api.Repository, len(forks))
  50. for i, fork := range forks {
  51. access, err := models.AccessLevel(ctx.User, fork)
  52. if err != nil {
  53. ctx.Error(http.StatusInternalServerError, "AccessLevel", err)
  54. return
  55. }
  56. apiForks[i] = fork.APIFormat(access)
  57. }
  58. ctx.JSON(http.StatusOK, apiForks)
  59. }
  60. // CreateFork create a fork of a repo
  61. func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
  62. // swagger:operation POST /repos/{owner}/{repo}/forks repository createFork
  63. // ---
  64. // summary: Fork a repository
  65. // produces:
  66. // - application/json
  67. // parameters:
  68. // - name: owner
  69. // in: path
  70. // description: owner of the repo to fork
  71. // type: string
  72. // required: true
  73. // - name: repo
  74. // in: path
  75. // description: name of the repo to fork
  76. // type: string
  77. // required: true
  78. // - name: body
  79. // in: body
  80. // schema:
  81. // "$ref": "#/definitions/CreateForkOption"
  82. // responses:
  83. // "202":
  84. // "$ref": "#/responses/Repository"
  85. // "403":
  86. // "$ref": "#/responses/forbidden"
  87. // "422":
  88. // "$ref": "#/responses/validationError"
  89. repo := ctx.Repo.Repository
  90. var forker *models.User // user/org that will own the fork
  91. if form.Organization == nil {
  92. forker = ctx.User
  93. } else {
  94. org, err := models.GetOrgByName(*form.Organization)
  95. if err != nil {
  96. if models.IsErrOrgNotExist(err) {
  97. ctx.Error(http.StatusUnprocessableEntity, "", err)
  98. } else {
  99. ctx.Error(http.StatusInternalServerError, "GetOrgByName", err)
  100. }
  101. return
  102. }
  103. isMember, err := org.IsOrgMember(ctx.User.ID)
  104. if err != nil {
  105. ctx.ServerError("IsOrgMember", err)
  106. return
  107. } else if !isMember {
  108. ctx.Error(http.StatusForbidden, "isMemberNot", fmt.Sprintf("User is no Member of Organisation '%s'", org.Name))
  109. return
  110. }
  111. forker = org
  112. }
  113. fork, err := repo_service.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
  114. if err != nil {
  115. ctx.Error(http.StatusInternalServerError, "ForkRepository", err)
  116. return
  117. }
  118. //TODO change back to 201
  119. ctx.JSON(http.StatusAccepted, fork.APIFormat(models.AccessModeOwner))
  120. }