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

fork.go 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repo
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. user_model "code.gitea.io/gitea/models/user"
  8. "xorm.io/builder"
  9. )
  10. // GetRepositoriesByForkID returns all repositories with given fork ID.
  11. func GetRepositoriesByForkID(ctx context.Context, forkID int64) ([]*Repository, error) {
  12. repos := make([]*Repository, 0, 10)
  13. return repos, db.GetEngine(ctx).
  14. Where("fork_id=?", forkID).
  15. Find(&repos)
  16. }
  17. // GetForkedRepo checks if given user has already forked a repository with given ID.
  18. func GetForkedRepo(ctx context.Context, ownerID, repoID int64) *Repository {
  19. repo := new(Repository)
  20. has, _ := db.GetEngine(ctx).
  21. Where("owner_id=? AND fork_id=?", ownerID, repoID).
  22. Get(repo)
  23. if has {
  24. return repo
  25. }
  26. return nil
  27. }
  28. // HasForkedRepo checks if given user has already forked a repository with given ID.
  29. func HasForkedRepo(ctx context.Context, ownerID, repoID int64) bool {
  30. has, _ := db.GetEngine(ctx).
  31. Table("repository").
  32. Where("owner_id=? AND fork_id=?", ownerID, repoID).
  33. Exist()
  34. return has
  35. }
  36. // GetUserFork return user forked repository from this repository, if not forked return nil
  37. func GetUserFork(ctx context.Context, repoID, userID int64) (*Repository, error) {
  38. var forkedRepo Repository
  39. has, err := db.GetEngine(ctx).Where("fork_id = ?", repoID).And("owner_id = ?", userID).Get(&forkedRepo)
  40. if err != nil {
  41. return nil, err
  42. }
  43. if !has {
  44. return nil, nil
  45. }
  46. return &forkedRepo, nil
  47. }
  48. // GetForks returns all the forks of the repository
  49. func GetForks(ctx context.Context, repo *Repository, listOptions db.ListOptions) ([]*Repository, error) {
  50. if listOptions.Page == 0 {
  51. forks := make([]*Repository, 0, repo.NumForks)
  52. return forks, db.GetEngine(ctx).Find(&forks, &Repository{ForkID: repo.ID})
  53. }
  54. sess := db.GetPaginatedSession(&listOptions)
  55. forks := make([]*Repository, 0, listOptions.PageSize)
  56. return forks, sess.Find(&forks, &Repository{ForkID: repo.ID})
  57. }
  58. // IncrementRepoForkNum increment repository fork number
  59. func IncrementRepoForkNum(ctx context.Context, repoID int64) error {
  60. _, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", repoID)
  61. return err
  62. }
  63. // DecrementRepoForkNum decrement repository fork number
  64. func DecrementRepoForkNum(ctx context.Context, repoID int64) error {
  65. _, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repoID)
  66. return err
  67. }
  68. // FindUserOrgForks returns the forked repositories for one user from a repository
  69. func FindUserOrgForks(ctx context.Context, repoID, userID int64) ([]*Repository, error) {
  70. cond := builder.And(
  71. builder.Eq{"fork_id": repoID},
  72. builder.In("owner_id",
  73. builder.Select("org_id").
  74. From("org_user").
  75. Where(builder.Eq{"uid": userID}),
  76. ),
  77. )
  78. var repos []*Repository
  79. return repos, db.GetEngine(ctx).Table("repository").Where(cond).Find(&repos)
  80. }
  81. // GetForksByUserAndOrgs return forked repos of the user and owned orgs
  82. func GetForksByUserAndOrgs(ctx context.Context, user *user_model.User, repo *Repository) ([]*Repository, error) {
  83. var repoList []*Repository
  84. if user == nil {
  85. return repoList, nil
  86. }
  87. forkedRepo, err := GetUserFork(ctx, repo.ID, user.ID)
  88. if err != nil {
  89. return repoList, err
  90. }
  91. if forkedRepo != nil {
  92. repoList = append(repoList, forkedRepo)
  93. }
  94. orgForks, err := FindUserOrgForks(ctx, repo.ID, user.ID)
  95. if err != nil {
  96. return nil, err
  97. }
  98. repoList = append(repoList, orgForks...)
  99. return repoList, nil
  100. }