mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
3.3 KiB
109 lines
3.3 KiB
// Copyright 2022 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package packages |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"regexp" |
|
|
|
"code.gitea.io/gitea/models/db" |
|
"code.gitea.io/gitea/modules/timeutil" |
|
"code.gitea.io/gitea/modules/util" |
|
|
|
"xorm.io/builder" |
|
) |
|
|
|
var ErrPackageCleanupRuleNotExist = util.NewNotExistErrorf("package blob does not exist") |
|
|
|
func init() { |
|
db.RegisterModel(new(PackageCleanupRule)) |
|
} |
|
|
|
// PackageCleanupRule represents a rule which describes when to clean up package versions |
|
type PackageCleanupRule struct { |
|
ID int64 `xorm:"pk autoincr"` |
|
Enabled bool `xorm:"INDEX NOT NULL DEFAULT false"` |
|
OwnerID int64 `xorm:"UNIQUE(s) INDEX NOT NULL DEFAULT 0"` |
|
Type Type `xorm:"UNIQUE(s) INDEX NOT NULL"` |
|
KeepCount int `xorm:"NOT NULL DEFAULT 0"` |
|
KeepPattern string `xorm:"NOT NULL DEFAULT ''"` |
|
KeepPatternMatcher *regexp.Regexp `xorm:"-"` |
|
RemoveDays int `xorm:"NOT NULL DEFAULT 0"` |
|
RemovePattern string `xorm:"NOT NULL DEFAULT ''"` |
|
RemovePatternMatcher *regexp.Regexp `xorm:"-"` |
|
MatchFullName bool `xorm:"NOT NULL DEFAULT false"` |
|
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"` |
|
UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL DEFAULT 0"` |
|
} |
|
|
|
func (pcr *PackageCleanupRule) CompiledPattern() error { |
|
if pcr.KeepPatternMatcher != nil || pcr.RemovePatternMatcher != nil { |
|
return nil |
|
} |
|
|
|
if pcr.KeepPattern != "" { |
|
var err error |
|
pcr.KeepPatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.KeepPattern)) |
|
if err != nil { |
|
return err |
|
} |
|
} |
|
|
|
if pcr.RemovePattern != "" { |
|
var err error |
|
pcr.RemovePatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.RemovePattern)) |
|
if err != nil { |
|
return err |
|
} |
|
} |
|
|
|
return nil |
|
} |
|
|
|
func InsertCleanupRule(ctx context.Context, pcr *PackageCleanupRule) (*PackageCleanupRule, error) { |
|
return pcr, db.Insert(ctx, pcr) |
|
} |
|
|
|
func GetCleanupRuleByID(ctx context.Context, id int64) (*PackageCleanupRule, error) { |
|
pcr := &PackageCleanupRule{} |
|
|
|
has, err := db.GetEngine(ctx).ID(id).Get(pcr) |
|
if err != nil { |
|
return nil, err |
|
} |
|
if !has { |
|
return nil, ErrPackageCleanupRuleNotExist |
|
} |
|
return pcr, nil |
|
} |
|
|
|
func UpdateCleanupRule(ctx context.Context, pcr *PackageCleanupRule) error { |
|
_, err := db.GetEngine(ctx).ID(pcr.ID).AllCols().Update(pcr) |
|
return err |
|
} |
|
|
|
func GetCleanupRulesByOwner(ctx context.Context, ownerID int64) ([]*PackageCleanupRule, error) { |
|
pcrs := make([]*PackageCleanupRule, 0, 10) |
|
return pcrs, db.GetEngine(ctx).Where("owner_id = ?", ownerID).Find(&pcrs) |
|
} |
|
|
|
func DeleteCleanupRuleByID(ctx context.Context, ruleID int64) error { |
|
_, err := db.GetEngine(ctx).ID(ruleID).Delete(&PackageCleanupRule{}) |
|
return err |
|
} |
|
|
|
func HasOwnerCleanupRuleForPackageType(ctx context.Context, ownerID int64, packageType Type) (bool, error) { |
|
return db.GetEngine(ctx). |
|
Where("owner_id = ? AND type = ?", ownerID, packageType). |
|
Exist(&PackageCleanupRule{}) |
|
} |
|
|
|
func IterateEnabledCleanupRules(ctx context.Context, callback func(context.Context, *PackageCleanupRule) error) error { |
|
return db.Iterate( |
|
ctx, |
|
builder.Eq{"enabled": true}, |
|
callback, |
|
) |
|
}
|
|
|