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