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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. )
  10. // ListForks list a repository's forks
  11. func ListForks(ctx *context.APIContext) {
  12. // swagger:route GET /repos/{owner}/{repo}/forks listForks
  13. //
  14. // Produces:
  15. // - application/json
  16. //
  17. // Responses:
  18. // 200: RepositoryList
  19. // 500: error
  20. forks, err := ctx.Repo.Repository.GetForks()
  21. if err != nil {
  22. ctx.Error(500, "GetForks", err)
  23. return
  24. }
  25. apiForks := make([]*api.Repository, len(forks))
  26. for i, fork := range forks {
  27. access, err := models.AccessLevel(ctx.User.ID, fork)
  28. if err != nil {
  29. ctx.Error(500, "AccessLevel", err)
  30. return
  31. }
  32. apiForks[i] = fork.APIFormat(access)
  33. }
  34. ctx.JSON(200, apiForks)
  35. }
  36. // CreateFork create a fork of a repo
  37. func CreateFork(ctx *context.APIContext, form api.CreateForkOption) {
  38. // swagger:route POST /repos/{owner}/{repo}/forks createFork
  39. //
  40. // Produces:
  41. // - application/json
  42. //
  43. // Responses:
  44. // 202: Repository
  45. // 403: forbidden
  46. // 422: validationError
  47. // 500: error
  48. repo := ctx.Repo.Repository
  49. var forker *models.User // user/org that will own the fork
  50. if form.Organization == nil {
  51. forker = ctx.User
  52. } else {
  53. org, err := models.GetOrgByName(*form.Organization)
  54. if err != nil {
  55. if err == models.ErrOrgNotExist {
  56. ctx.Error(422, "", err)
  57. } else {
  58. ctx.Error(500, "GetOrgByName", err)
  59. }
  60. return
  61. }
  62. if !org.IsOrgMember(ctx.User.ID) {
  63. ctx.Status(403)
  64. return
  65. }
  66. forker = org
  67. }
  68. fork, err := models.ForkRepository(forker, repo, repo.Name, repo.Description)
  69. if err != nil {
  70. ctx.Error(500, "ForkRepository", err)
  71. return
  72. }
  73. ctx.JSON(202, fork.APIFormat(models.AccessModeOwner))
  74. }