code.gitea.io/gitea@v1.22.3/modules/repository/fork.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package repository
     5  
     6  import (
     7  	"context"
     8  
     9  	"code.gitea.io/gitea/models/organization"
    10  	repo_model "code.gitea.io/gitea/models/repo"
    11  	user_model "code.gitea.io/gitea/models/user"
    12  )
    13  
    14  // CanUserForkRepo returns true if specified user can fork repository.
    15  func CanUserForkRepo(ctx context.Context, user *user_model.User, repo *repo_model.Repository) (bool, error) {
    16  	if user == nil {
    17  		return false, nil
    18  	}
    19  	if repo.OwnerID != user.ID && !repo_model.HasForkedRepo(ctx, user.ID, repo.ID) {
    20  		return true, nil
    21  	}
    22  	ownedOrgs, err := organization.GetOrgsCanCreateRepoByUserID(ctx, user.ID)
    23  	if err != nil {
    24  		return false, err
    25  	}
    26  	for _, org := range ownedOrgs {
    27  		if repo.OwnerID != org.ID && !repo_model.HasForkedRepo(ctx, org.ID, repo.ID) {
    28  			return true, nil
    29  		}
    30  	}
    31  	return false, nil
    32  }