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  }