40 lines
1.2 KiB
Ruby
40 lines
1.2 KiB
Ruby
# -*- encoding : utf-8 -*-
|
|
module Rosa
|
|
module Constraints
|
|
class Owner
|
|
def initialize(class_name, bang = false)
|
|
@class_name = class_name
|
|
@finder = 'find_by_insensitive_uname'
|
|
@finder << '!' if bang
|
|
end
|
|
|
|
def matches?(request)
|
|
@class_name.send(@finder, request.params[:uname]).present?
|
|
end
|
|
end
|
|
|
|
class AdminAccess
|
|
def self.matches?(request)
|
|
!!request.env['warden'].user.try(:admin?)
|
|
end
|
|
end
|
|
|
|
class Treeish
|
|
def self.matches?(request)
|
|
if (params = request.path_parameters) && params[:treeish] # parse existing branch (tag) and path
|
|
branch_or_tag = begin
|
|
(p = Project.find_by_owner_and_name params[:owner_name], params[:project_name]) &&
|
|
p.repo.branches_and_tags.map(&:name).sort{|a,b| b.length <=> a.length}.detect{|b| params[:treeish].start_with?(b)} ||
|
|
params[:treeish].split('/').first
|
|
end
|
|
if path = params[:treeish].sub(branch_or_tag, '')[1..-1] and path.present?
|
|
params[:path] = File.join([path, params[:path]].compact)
|
|
end
|
|
params[:treeish] = branch_or_tag
|
|
end
|
|
true
|
|
end
|
|
end
|
|
end
|
|
end
|