diff options
author | Lauris BH <lauris@nix.lv> | 2020-03-27 00:26:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-27 00:26:34 +0200 |
commit | bbd910ed1b4f52ee66a5cdd8d11f856598161bef (patch) | |
tree | 8392e0f8208b5b7d8e6df8335677518aa07f194f /models | |
parent | 52cfd2743c0e85b36081cf80a850e6a5901f1865 (diff) | |
download | gitea-bbd910ed1b4f52ee66a5cdd8d11f856598161bef.tar.gz gitea-bbd910ed1b4f52ee66a5cdd8d11f856598161bef.zip |
Allow to set protected file patterns that can not be changed under no conditions (#10806)
Co-Authored-By: zeripath <art27@cantab.net>
Diffstat (limited to 'models')
-rw-r--r-- | models/branches.go | 19 | ||||
-rw-r--r-- | models/error.go | 19 | ||||
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v132.go | 22 |
4 files changed, 62 insertions, 0 deletions
diff --git a/models/branches.go b/models/branches.go index 75f5c0a3a7..d488fc9fcc 100644 --- a/models/branches.go +++ b/models/branches.go @@ -7,6 +7,7 @@ package models import ( "context" "fmt" + "strings" "time" "code.gitea.io/gitea/modules/base" @@ -15,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" + "github.com/gobwas/glob" "github.com/unknwon/com" ) @@ -47,6 +49,7 @@ type ProtectedBranch struct { BlockOnRejectedReviews bool `xorm:"NOT NULL DEFAULT false"` DismissStaleApprovals bool `xorm:"NOT NULL DEFAULT false"` RequireSignedCommits bool `xorm:"NOT NULL DEFAULT false"` + ProtectedFilePatterns string `xorm:"TEXT"` CreatedUnix timeutil.TimeStamp `xorm:"created"` UpdatedUnix timeutil.TimeStamp `xorm:"updated"` @@ -190,6 +193,22 @@ func (protectBranch *ProtectedBranch) MergeBlockedByRejectedReview(pr *PullReque return rejectExist } +// GetProtectedFilePatterns parses a semicolon separated list of protected file patterns and returns a glob.Glob slice +func (protectBranch *ProtectedBranch) GetProtectedFilePatterns() []glob.Glob { + extarr := make([]glob.Glob, 0, 10) + for _, expr := range strings.Split(strings.ToLower(protectBranch.ProtectedFilePatterns), ";") { + expr = strings.TrimSpace(expr) + if expr != "" { + if g, err := glob.Compile(expr, '.', '/'); err != nil { + log.Info("Invalid glob expresion '%s' (skipped): %v", expr, err) + } else { + extarr = append(extarr, g) + } + } + } + return extarr +} + // GetProtectedBranchByRepoID getting protected branch by repo ID func GetProtectedBranchByRepoID(repoID int64) ([]*ProtectedBranch, error) { protectedBranches := make([]*ProtectedBranch, 0) diff --git a/models/error.go b/models/error.go index 09fb4ebcaf..19a1229ada 100644 --- a/models/error.go +++ b/models/error.go @@ -916,6 +916,25 @@ func (err ErrFilePathInvalid) Error() string { return fmt.Sprintf("path is invalid [path: %s]", err.Path) } +// ErrFilePathProtected represents a "FilePathProtected" kind of error. +type ErrFilePathProtected struct { + Message string + Path string +} + +// IsErrFilePathProtected checks if an error is an ErrFilePathProtected. +func IsErrFilePathProtected(err error) bool { + _, ok := err.(ErrFilePathProtected) + return ok +} + +func (err ErrFilePathProtected) Error() string { + if err.Message != "" { + return err.Message + } + return fmt.Sprintf("path is protected and can not be changed [path: %s]", err.Path) +} + // ErrUserDoesNotHaveAccessToRepo represets an error where the user doesn't has access to a given repo. type ErrUserDoesNotHaveAccessToRepo struct { UserID int64 diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 2badb72788..c554121e85 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -196,6 +196,8 @@ var migrations = []Migration{ NewMigration("Expand webhooks for more granularity", expandWebhooks), // v131 -> v132 NewMigration("Add IsSystemWebhook column to webhooks table", addSystemWebhookColumn), + // v132 -> v133 + NewMigration("Add Branch Protection Protected Files Column", addBranchProtectionProtectedFilesColumn), } // Migrate database to current version diff --git a/models/migrations/v132.go b/models/migrations/v132.go new file mode 100644 index 0000000000..3f7b1c9709 --- /dev/null +++ b/models/migrations/v132.go @@ -0,0 +1,22 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "xorm.io/xorm" +) + +func addBranchProtectionProtectedFilesColumn(x *xorm.Engine) error { + type ProtectedBranch struct { + ProtectedFilePatterns string `xorm:"TEXT"` + } + + if err := x.Sync2(new(ProtectedBranch)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} |