mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
104 lines
3.1 KiB
Go
104 lines
3.1 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package repo
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hanzoai/git/models/db"
|
|
user_model "github.com/hanzoai/git/models/user"
|
|
|
|
"github.com/hanzoai/builder"
|
|
)
|
|
|
|
// GetRepositoriesByForkID returns all repositories with given fork ID.
|
|
func GetRepositoriesByForkID(ctx context.Context, forkID int64) ([]*Repository, error) {
|
|
repos := make([]*Repository, 0, 10)
|
|
return repos, db.GetEngine(ctx).
|
|
Where("fork_id=?", forkID).
|
|
Find(&repos)
|
|
}
|
|
|
|
// GetForkedRepo checks if given user has already forked a repository with given ID.
|
|
func GetForkedRepo(ctx context.Context, ownerID, repoID int64) *Repository {
|
|
repo := new(Repository)
|
|
has, _ := db.GetEngine(ctx).
|
|
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(ctx context.Context, ownerID, repoID int64) bool {
|
|
has, _ := db.GetEngine(ctx).
|
|
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
|
|
func GetUserFork(ctx context.Context, repoID, userID int64) (*Repository, error) {
|
|
var forkedRepo Repository
|
|
has, err := db.GetEngine(ctx).Where("fork_id = ?", repoID).And("owner_id = ?", userID).Get(&forkedRepo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !has {
|
|
return nil, nil //nolint:nilnil // return nil to indicate that the object does not exist
|
|
}
|
|
return &forkedRepo, nil
|
|
}
|
|
|
|
// 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
|
|
}
|