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.

package_cleanup_rule.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package packages
  5. import (
  6. "context"
  7. "errors"
  8. "fmt"
  9. "regexp"
  10. "code.gitea.io/gitea/models/db"
  11. "code.gitea.io/gitea/modules/timeutil"
  12. "xorm.io/builder"
  13. )
  14. var ErrPackageCleanupRuleNotExist = errors.New("Package blob does not exist")
  15. func init() {
  16. db.RegisterModel(new(PackageCleanupRule))
  17. }
  18. // PackageCleanupRule represents a rule which describes when to clean up package versions
  19. type PackageCleanupRule struct {
  20. ID int64 `xorm:"pk autoincr"`
  21. Enabled bool `xorm:"INDEX NOT NULL DEFAULT false"`
  22. OwnerID int64 `xorm:"UNIQUE(s) INDEX NOT NULL DEFAULT 0"`
  23. Type Type `xorm:"UNIQUE(s) INDEX NOT NULL"`
  24. KeepCount int `xorm:"NOT NULL DEFAULT 0"`
  25. KeepPattern string `xorm:"NOT NULL DEFAULT ''"`
  26. KeepPatternMatcher *regexp.Regexp `xorm:"-"`
  27. RemoveDays int `xorm:"NOT NULL DEFAULT 0"`
  28. RemovePattern string `xorm:"NOT NULL DEFAULT ''"`
  29. RemovePatternMatcher *regexp.Regexp `xorm:"-"`
  30. MatchFullName bool `xorm:"NOT NULL DEFAULT false"`
  31. CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"`
  32. UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL DEFAULT 0"`
  33. }
  34. func (pcr *PackageCleanupRule) CompiledPattern() error {
  35. if pcr.KeepPatternMatcher != nil || pcr.RemovePatternMatcher != nil {
  36. return nil
  37. }
  38. if pcr.KeepPattern != "" {
  39. var err error
  40. pcr.KeepPatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.KeepPattern))
  41. if err != nil {
  42. return err
  43. }
  44. }
  45. if pcr.RemovePattern != "" {
  46. var err error
  47. pcr.RemovePatternMatcher, err = regexp.Compile(fmt.Sprintf(`(?i)\A%s\z`, pcr.RemovePattern))
  48. if err != nil {
  49. return err
  50. }
  51. }
  52. return nil
  53. }
  54. func InsertCleanupRule(ctx context.Context, pcr *PackageCleanupRule) (*PackageCleanupRule, error) {
  55. return pcr, db.Insert(ctx, pcr)
  56. }
  57. func GetCleanupRuleByID(ctx context.Context, id int64) (*PackageCleanupRule, error) {
  58. pcr := &PackageCleanupRule{}
  59. has, err := db.GetEngine(ctx).ID(id).Get(pcr)
  60. if err != nil {
  61. return nil, err
  62. }
  63. if !has {
  64. return nil, ErrPackageCleanupRuleNotExist
  65. }
  66. return pcr, nil
  67. }
  68. func UpdateCleanupRule(ctx context.Context, pcr *PackageCleanupRule) error {
  69. _, err := db.GetEngine(ctx).ID(pcr.ID).AllCols().Update(pcr)
  70. return err
  71. }
  72. func GetCleanupRulesByOwner(ctx context.Context, ownerID int64) ([]*PackageCleanupRule, error) {
  73. pcrs := make([]*PackageCleanupRule, 0, 10)
  74. return pcrs, db.GetEngine(ctx).Where("owner_id = ?", ownerID).Find(&pcrs)
  75. }
  76. func DeleteCleanupRuleByID(ctx context.Context, ruleID int64) error {
  77. _, err := db.GetEngine(ctx).ID(ruleID).Delete(&PackageCleanupRule{})
  78. return err
  79. }
  80. func HasOwnerCleanupRuleForPackageType(ctx context.Context, ownerID int64, packageType Type) (bool, error) {
  81. return db.GetEngine(ctx).
  82. Where("owner_id = ? AND type = ?", ownerID, packageType).
  83. Exist(&PackageCleanupRule{})
  84. }
  85. func IterateEnabledCleanupRules(ctx context.Context, callback func(context.Context, *PackageCleanupRule) error) error {
  86. return db.Iterate(
  87. ctx,
  88. builder.Eq{"enabled": true},
  89. callback,
  90. )
  91. }