Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Edwards-Jones <jedwardsjones@gitlab.com>2017-04-03 17:17:24 +0300
committerJames Edwards-Jones <jedwardsjones@gitlab.com>2017-04-03 19:19:53 +0300
commit65f3d5062f081d8f8ebf727a3408650d90ec9711 (patch)
tree0246397bd1a234ce9f34b9145321a1c4e40c1cd4 /app/models/concerns/protected_ref.rb
parenta7c71c7f292c9cdf892f7d33dfb52d7e16af28e6 (diff)
Extract ProtectedRef Concern
Diffstat (limited to 'app/models/concerns/protected_ref.rb')
-rw-r--r--app/models/concerns/protected_ref.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/app/models/concerns/protected_ref.rb b/app/models/concerns/protected_ref.rb
new file mode 100644
index 00000000000..77d7b597534
--- /dev/null
+++ b/app/models/concerns/protected_ref.rb
@@ -0,0 +1,47 @@
+module ProtectedRef
+ extend ActiveSupport::Concern
+
+ included do
+ belongs_to :project
+ validates :name, presence: true
+ validates :project, presence: true
+
+ def self.matching_refs_accesible_to(ref, user, action: :push)
+ access_levels_for_ref(ref, action).any? do |access_level|
+ access_level.check_access(user)
+ end
+ end
+
+ def self.access_levels_for_ref(ref, action: :push)
+ self.matching(ref).map(&:"@#{action}_access_levels").flatten
+ end
+
+ private
+
+ def self.matching(ref_name, protected_refs: nil)
+ ProtectedRefMatcher.matching(self, ref_name, protected_refs: protected_refs)
+ end
+ end
+
+ def commit
+ project.commit(self.name)
+ end
+
+ def matching(refs)
+ ref_matcher.matching(refs)
+ end
+
+ def matches?(refs)
+ ref_matcher.matches?(refs)
+ end
+
+ def wildcard?
+ ref_matcher.wildcard?
+ end
+
+ private
+
+ def ref_matcher
+ @ref_matcher ||= ProtectedRefMatcher.new(self)
+ end
+end