gitea源码

fork.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. // IncrementRepoForkNum increment repository fork number
  49. func IncrementRepoForkNum(ctx context.Context, repoID int64) error {
  50. _, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?", repoID)
  51. return err
  52. }
  53. // DecrementRepoForkNum decrement repository fork number
  54. func DecrementRepoForkNum(ctx context.Context, repoID int64) error {
  55. _, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?", repoID)
  56. return err
  57. }
  58. // FindUserOrgForks returns the forked repositories for one user from a repository
  59. func FindUserOrgForks(ctx context.Context, repoID, userID int64) ([]*Repository, error) {
  60. cond := builder.And(
  61. builder.Eq{"fork_id": repoID},
  62. builder.In("owner_id",
  63. builder.Select("org_id").
  64. From("org_user").
  65. Where(builder.Eq{"uid": userID}),
  66. ),
  67. )
  68. var repos []*Repository
  69. return repos, db.GetEngine(ctx).Table("repository").Where(cond).Find(&repos)
  70. }
  71. // GetForksByUserAndOrgs return forked repos of the user and owned orgs
  72. func GetForksByUserAndOrgs(ctx context.Context, user *user_model.User, repo *Repository) ([]*Repository, error) {
  73. var repoList []*Repository
  74. if user == nil {
  75. return repoList, nil
  76. }
  77. forkedRepo, err := GetUserFork(ctx, repo.ID, user.ID)
  78. if err != nil {
  79. return repoList, err
  80. }
  81. if forkedRepo != nil {
  82. repoList = append(repoList, forkedRepo)
  83. }
  84. orgForks, err := FindUserOrgForks(ctx, repo.ID, user.ID)
  85. if err != nil {
  86. return nil, err
  87. }
  88. repoList = append(repoList, orgForks...)
  89. return repoList, nil
  90. }