2021-12-12 18:48:20 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-12-12 18:48:20 +03:00
package repo
import (
"context"
"code.gitea.io/gitea/models/db"
2022-06-06 11:01:49 +03:00
user_model "code.gitea.io/gitea/models/user"
2022-06-09 14:15:08 +03:00
2022-06-06 11:01:49 +03:00
"xorm.io/builder"
2021-12-12 18:48:20 +03:00
)
2022-05-20 17:08:52 +03:00
// GetRepositoriesByForkID returns all repositories with given fork ID.
func GetRepositoriesByForkID ( ctx context . Context , forkID int64 ) ( [ ] * Repository , error ) {
2021-12-12 18:48:20 +03:00
repos := make ( [ ] * Repository , 0 , 10 )
2022-05-20 17:08:52 +03:00
return repos , db . GetEngine ( ctx ) .
2021-12-12 18:48:20 +03:00
Where ( "fork_id=?" , forkID ) .
Find ( & repos )
}
// GetForkedRepo checks if given user has already forked a repository with given ID.
func GetForkedRepo ( ownerID , repoID int64 ) * Repository {
repo := new ( Repository )
has , _ := db . GetEngine ( db . DefaultContext ) .
Where ( "owner_id=? AND fork_id=?" , ownerID , repoID ) .
Get ( repo )
if has {
return repo
}
return nil
}
// HasForkedRepo checks if given user has already forked a repository with given ID.
func HasForkedRepo ( ownerID , repoID int64 ) bool {
has , _ := db . GetEngine ( db . DefaultContext ) .
Table ( "repository" ) .
Where ( "owner_id=? AND fork_id=?" , ownerID , repoID ) .
Exist ( )
return has
}
// GetUserFork return user forked repository from this repository, if not forked return nil
2022-03-29 22:13:41 +03:00
func GetUserFork ( ctx context . Context , repoID , userID int64 ) ( * Repository , error ) {
2021-12-12 18:48:20 +03:00
var forkedRepo Repository
2022-03-29 22:13:41 +03:00
has , err := db . GetEngine ( ctx ) . Where ( "fork_id = ?" , repoID ) . And ( "owner_id = ?" , userID ) . Get ( & forkedRepo )
2021-12-12 18:48:20 +03:00
if err != nil {
return nil , err
}
if ! has {
return nil , nil
}
return & forkedRepo , nil
}
// GetForks returns all the forks of the repository
func GetForks ( repo * Repository , listOptions db . ListOptions ) ( [ ] * Repository , error ) {
if listOptions . Page == 0 {
forks := make ( [ ] * Repository , 0 , repo . NumForks )
return forks , db . GetEngine ( db . DefaultContext ) . Find ( & forks , & Repository { ForkID : repo . ID } )
}
sess := db . GetPaginatedSession ( & listOptions )
forks := make ( [ ] * Repository , 0 , listOptions . PageSize )
return forks , sess . Find ( & forks , & Repository { ForkID : repo . ID } )
}
2022-06-06 11:01:49 +03:00
// IncrementRepoForkNum increment repository fork number
func IncrementRepoForkNum ( ctx context . Context , repoID int64 ) error {
_ , err := db . GetEngine ( ctx ) . Exec ( "UPDATE `repository` SET num_forks=num_forks+1 WHERE id=?" , repoID )
return err
}
// DecrementRepoForkNum decrement repository fork number
func DecrementRepoForkNum ( ctx context . Context , repoID int64 ) error {
_ , err := db . GetEngine ( ctx ) . Exec ( "UPDATE `repository` SET num_forks=num_forks-1 WHERE id=?" , repoID )
return err
}
// FindUserOrgForks returns the forked repositories for one user from a repository
func FindUserOrgForks ( ctx context . Context , repoID , userID int64 ) ( [ ] * Repository , error ) {
cond := builder . And (
builder . Eq { "fork_id" : repoID } ,
builder . In ( "owner_id" ,
builder . Select ( "org_id" ) .
From ( "org_user" ) .
Where ( builder . Eq { "uid" : userID } ) ,
) ,
)
var repos [ ] * Repository
return repos , db . GetEngine ( ctx ) . Table ( "repository" ) . Where ( cond ) . Find ( & repos )
}
// GetForksByUserAndOrgs return forked repos of the user and owned orgs
func GetForksByUserAndOrgs ( ctx context . Context , user * user_model . User , repo * Repository ) ( [ ] * Repository , error ) {
var repoList [ ] * Repository
if user == nil {
return repoList , nil
}
forkedRepo , err := GetUserFork ( ctx , repo . ID , user . ID )
if err != nil {
return repoList , err
}
if forkedRepo != nil {
repoList = append ( repoList , forkedRepo )
}
orgForks , err := FindUserOrgForks ( ctx , repo . ID , user . ID )
if err != nil {
return nil , err
}
repoList = append ( repoList , orgForks ... )
return repoList , nil
}