From dfa7291f8fafd2aac032ef73a78b588e4d0e9a36 Mon Sep 17 00:00:00 2001 From: 赵智超 <1012112796@qq.com> Date: Wed, 14 Oct 2020 02:50:57 +0800 Subject: [Enhancement] Allow admin to merge pr with protected file changes (#12078) * [Enhancement] Allow admin to merge pr with protected file changes As tilte, show protected message in diff page and merge box. Signed-off-by: a1012112796 <1012112796@qq.com> * remove unused ver * Update options/locale/locale_en-US.ini Co-authored-by: Cirno the Strongest <1447794+CirnoT@users.noreply.github.com> * Add TrN * Apply suggestions from code review * fix lint * Update options/locale/locale_en-US.ini Co-authored-by: zeripath * Apply suggestions from code review * move pr proteced files check to TestPatch * Call TestPatch when protected branches settings changed * Apply review suggestion @CirnoT * move to service @lunny * slightly restructure routers/private/hook.go Adds a lot of comments and simplifies the logic Signed-off-by: Andrew Thornton * placate lint Signed-off-by: Andrew Thornton * skip duplicate protected files check * fix check logic * slight refactor of TestPatch Signed-off-by: Andrew Thornton * When checking for protected files changes in TestPatch use the temporary repository Signed-off-by: Andrew Thornton * fix introduced issue with hook Signed-off-by: Andrew Thornton * Remove the check on PR index being greater than 0 as it unnecessary Signed-off-by: Andrew Thornton Co-authored-by: techknowlogick Co-authored-by: Cirno the Strongest <1447794+CirnoT@users.noreply.github.com> Co-authored-by: zeripath Co-authored-by: techknowlogick --- models/branches.go | 32 ++++++++++++++++++++++++++++++++ models/migrations/migrations.go | 2 ++ models/migrations/v155.go | 22 ++++++++++++++++++++++ models/pull.go | 2 ++ 4 files changed, 58 insertions(+) create mode 100644 models/migrations/v155.go (limited to 'models') diff --git a/models/branches.go b/models/branches.go index 20988deed7..420a4b663a 100644 --- a/models/branches.go +++ b/models/branches.go @@ -209,6 +209,38 @@ func (protectBranch *ProtectedBranch) GetProtectedFilePatterns() []glob.Glob { return extarr } +// MergeBlockedByProtectedFiles returns true if merge is blocked by protected files change +func (protectBranch *ProtectedBranch) MergeBlockedByProtectedFiles(pr *PullRequest) bool { + glob := protectBranch.GetProtectedFilePatterns() + if len(glob) == 0 { + return false + } + + return len(pr.ChangedProtectedFiles) > 0 +} + +// IsProtectedFile return if path is protected +func (protectBranch *ProtectedBranch) IsProtectedFile(patterns []glob.Glob, path string) bool { + if len(patterns) == 0 { + patterns = protectBranch.GetProtectedFilePatterns() + if len(patterns) == 0 { + return false + } + } + + lpath := strings.ToLower(strings.TrimSpace(path)) + + r := false + for _, pat := range patterns { + if pat.Match(lpath) { + r = true + break + } + } + + return r +} + // GetProtectedBranchByRepoID getting protected branch by repo ID func GetProtectedBranchByRepoID(repoID int64) ([]*ProtectedBranch, error) { protectedBranches := make([]*ProtectedBranch, 0) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 4e12181b15..0efcce30a9 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -244,6 +244,8 @@ var migrations = []Migration{ NewMigration("add Team review request support", addTeamReviewRequestSupport), // v154 > v155 NewMigration("add timestamps to Star, Label, Follow, Watch and Collaboration", addTimeStamps), + // v155 -> v156 + NewMigration("add changed_protected_files column for pull_request table", addChangedProtectedFilesPullRequestColumn), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v155.go b/models/migrations/v155.go new file mode 100644 index 0000000000..58d78b6cfb --- /dev/null +++ b/models/migrations/v155.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 addChangedProtectedFilesPullRequestColumn(x *xorm.Engine) error { + type PullRequest struct { + ChangedProtectedFiles []string `xorm:"TEXT JSON"` + } + + if err := x.Sync2(new(PullRequest)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/pull.go b/models/pull.go index 9f1f485266..9b6f0830d7 100644 --- a/models/pull.go +++ b/models/pull.go @@ -45,6 +45,8 @@ type PullRequest struct { CommitsAhead int CommitsBehind int + ChangedProtectedFiles []string `xorm:"TEXT JSON"` + IssueID int64 `xorm:"INDEX"` Issue *Issue `xorm:"-"` Index int64 -- cgit v1.2.3