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]>
122 lines
3.2 KiB
Go
122 lines
3.2 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package repo
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hanzoai/git/models/db"
|
|
"github.com/hanzoai/git/modules/timeutil"
|
|
)
|
|
|
|
func init() {
|
|
db.RegisterModel(new(RepoLicense))
|
|
}
|
|
|
|
type RepoLicense struct { //revive:disable-line:exported
|
|
ID int64 `xorm:"pk autoincr"`
|
|
RepoID int64 `xorm:"UNIQUE(s) NOT NULL"`
|
|
CommitID string
|
|
License string `xorm:"VARCHAR(255) UNIQUE(s) NOT NULL"`
|
|
CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"`
|
|
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX UPDATED"`
|
|
}
|
|
|
|
// RepoLicenseList defines a list of repo licenses
|
|
type RepoLicenseList []*RepoLicense //revive:disable-line:exported
|
|
|
|
func (rll RepoLicenseList) StringList() []string {
|
|
var licenses []string
|
|
for _, rl := range rll {
|
|
licenses = append(licenses, rl.License)
|
|
}
|
|
return licenses
|
|
}
|
|
|
|
// GetRepoLicenses returns the license statistics for a repository
|
|
func GetRepoLicenses(ctx context.Context, repo *Repository) (RepoLicenseList, error) {
|
|
licenses := make(RepoLicenseList, 0)
|
|
if err := db.GetEngine(ctx).Where("`repo_id` = ?", repo.ID).Asc("`license`").Find(&licenses); err != nil {
|
|
return nil, err
|
|
}
|
|
return licenses, nil
|
|
}
|
|
|
|
// UpdateRepoLicenses updates the license statistics for repository
|
|
func UpdateRepoLicenses(ctx context.Context, repo *Repository, commitID string, licenses []string) error {
|
|
oldLicenses, err := GetRepoLicenses(ctx, repo)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, license := range licenses {
|
|
upd := false
|
|
for _, o := range oldLicenses {
|
|
// Update already existing license
|
|
if o.License == license {
|
|
o.CommitID = commitID
|
|
if _, err := db.GetEngine(ctx).ID(o.ID).Cols("`commit_id`").Update(o); err != nil {
|
|
return err
|
|
}
|
|
upd = true
|
|
break
|
|
}
|
|
}
|
|
// Insert new license
|
|
if !upd {
|
|
if err := db.Insert(ctx, &RepoLicense{
|
|
RepoID: repo.ID,
|
|
CommitID: commitID,
|
|
License: license,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
// Delete old licenses
|
|
licenseToDelete := make([]int64, 0, len(oldLicenses))
|
|
for _, o := range oldLicenses {
|
|
if o.CommitID != commitID {
|
|
licenseToDelete = append(licenseToDelete, o.ID)
|
|
}
|
|
}
|
|
if len(licenseToDelete) > 0 {
|
|
if _, err := db.GetEngine(ctx).In("`id`", licenseToDelete).Delete(&RepoLicense{}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CopyLicense Copy originalRepo license information to destRepo (use for forked repo)
|
|
func CopyLicense(ctx context.Context, originalRepo, destRepo *Repository) error {
|
|
repoLicenses, err := GetRepoLicenses(ctx, originalRepo)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(repoLicenses) > 0 {
|
|
newRepoLicenses := make(RepoLicenseList, 0, len(repoLicenses))
|
|
|
|
for _, rl := range repoLicenses {
|
|
newRepoLicense := &RepoLicense{
|
|
RepoID: destRepo.ID,
|
|
CommitID: rl.CommitID,
|
|
License: rl.License,
|
|
}
|
|
newRepoLicenses = append(newRepoLicenses, newRepoLicense)
|
|
}
|
|
if err := db.Insert(ctx, &newRepoLicenses); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CleanRepoLicenses will remove all license record of the repo
|
|
func CleanRepoLicenses(ctx context.Context, repo *Repository) error {
|
|
return db.DeleteBeans(ctx, &RepoLicense{
|
|
RepoID: repo.ID,
|
|
})
|
|
}
|