diff options
author | Jacob Schatz <jschatz1@gmail.com> | 2016-07-11 17:19:17 -0400 |
---|---|---|
committer | Jacob Schatz <jschatz1@gmail.com> | 2016-07-11 17:19:17 -0400 |
commit | 0452e0a57e24fdd65f559cc1a8629892714adc7a (patch) | |
tree | bf33ca472a3d434770783d80b5d10211383e706c /app/models/protected_branch.rb | |
parent | 7690513495d02d14af8a1a0cb3bf00f243ec0419 (diff) | |
parent | f76596380fb545c54b14c6bfc339a68a1dc162d3 (diff) | |
download | gitlab-ce-faster-diffs.tar.gz |
Merge branch 'master' into faster-diffsfaster-diffs
Diffstat (limited to 'app/models/protected_branch.rb')
-rw-r--r-- | app/models/protected_branch.rb | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 33cf046fa75..b7011d7afdf 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -8,4 +8,51 @@ class ProtectedBranch < ActiveRecord::Base def commit project.commit(self.name) end + + # Returns all protected branches that match the given branch name. + # This realizes all records from the scope built up so far, and does + # _not_ return a relation. + # + # This method optionally takes in a list of `protected_branches` to search + # through, to avoid calling out to the database. + def self.matching(branch_name, protected_branches: nil) + (protected_branches || all).select { |protected_branch| protected_branch.matches?(branch_name) } + end + + # Returns all branches (among the given list of branches [`Gitlab::Git::Branch`]) + # that match the current protected branch. + def matching(branches) + branches.select { |branch| self.matches?(branch.name) } + end + + # Checks if the protected branch matches the given branch name. + def matches?(branch_name) + return false if self.name.blank? + + exact_match?(branch_name) || wildcard_match?(branch_name) + end + + # Checks if this protected branch contains a wildcard + def wildcard? + self.name && self.name.include?('*') + end + + protected + + def exact_match?(branch_name) + self.name == branch_name + end + + def wildcard_match?(branch_name) + wildcard_regex === branch_name + end + + def wildcard_regex + @wildcard_regex ||= begin + name = self.name.gsub('*', 'STAR_DONT_ESCAPE') + quoted_name = Regexp.quote(name) + regex_string = quoted_name.gsub('STAR_DONT_ESCAPE', '.*?') + /\A#{regex_string}\z/ + end + end end |