mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-31 03:14:17 +09:00
With `[repository] ALLOW_FORK_INTO_SAME_OWNER = true` a user can fork their own repository, but an organization still cannot fork a repository it owns. The fork button check and the owner list on the fork page compared the organization with the repository owner directly instead of asking `CanUserForkBetweenOwners`, and the walk over parent repositories dropped the owning organization whenever the setting was on. Organizations now follow the setting the same way users already do, and nothing changes when it is off. Fixes https://github.com/go-gitea/gitea/issues/40021 Assisted-by: Claude Code:claude-opus-5-5
44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package repository
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gitea.dev/models/organization"
|
|
repo_model "gitea.dev/models/repo"
|
|
user_model "gitea.dev/models/user"
|
|
"gitea.dev/modules/setting"
|
|
)
|
|
|
|
// CanUserForkBetweenOwners returns true if user can fork between owners.
|
|
// By default, a user can fork a repository from another owner, but not from themselves.
|
|
// Many users really like to fork their own repositories, so add an experimental setting to allow this.
|
|
func CanUserForkBetweenOwners(id1, id2 int64) bool {
|
|
if id1 != id2 {
|
|
return true
|
|
}
|
|
return setting.Repository.AllowForkIntoSameOwner
|
|
}
|
|
|
|
// CanUserForkRepo returns true if specified user can fork repository.
|
|
func CanUserForkRepo(ctx context.Context, user *user_model.User, repo *repo_model.Repository) (bool, error) {
|
|
if user == nil {
|
|
return false, nil
|
|
}
|
|
if CanUserForkBetweenOwners(repo.OwnerID, user.ID) && !repo_model.HasForkedRepo(ctx, user.ID, repo.ID) {
|
|
return true, nil
|
|
}
|
|
ownedOrgs, err := organization.GetOrgsCanCreateRepoByUserID(ctx, user.ID)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
for _, org := range ownedOrgs {
|
|
if CanUserForkBetweenOwners(repo.OwnerID, org.ID) && !repo_model.HasForkedRepo(ctx, org.ID, repo.ID) {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|