class Blaggard::GroupConfig
Attributes
git[RW]
groups is an object like this: {
# group: { 'read': [refs] # 'write': [refs]} "admin_users" => { 'read' => ['refs/heads/*'], 'write' => ['refs/heads/haacked', 'refs/heads/master'] }, "normal_users" => { 'read' => ['refs/heads/*'], 'write' => [] }
}
groups[RW]
groups is an object like this: {
# group: { 'read': [refs] # 'write': [refs]} "admin_users" => { 'read' => ['refs/heads/*'], 'write' => ['refs/heads/haacked', 'refs/heads/master'] }, "normal_users" => { 'read' => ['refs/heads/*'], 'write' => [] }
}
Public Class Methods
new( repo_path )
click to toggle source
# File lib/blaggard/group_config.rb, line 18 def initialize( repo_path ) @repo_path = repo_path @git = Blaggard::Git.new(repo_path) @config_path = File.join(@repo_path, 'refs/meta') unless File.directory?(@config_path) FileUtils.mkdir_p(File.join(@repo_path, 'refs/meta')) end @config_file = File.join(@config_path, 'config') read_from_git end
Public Instance Methods
add_branch(group, priv, branch)
click to toggle source
# File lib/blaggard/group_config.rb, line 56 def add_branch(group, priv, branch) @groups = read_from_git @groups[group] = {:read =>[], :write => []} unless @groups[group] validate_privilege priv unless @groups[group][priv].include? branch if valid_branch_name? branch @groups[group][priv] << branch write_to_git else raise Blaggard::GroupConfigError, "Branch name #{branch} invalid. Must be of format 'refs/heads/<branch_name>" end end end
branches(user_groups, priv)
click to toggle source
# File lib/blaggard/group_config.rb, line 97 def branches(user_groups, priv) validate_privilege priv user_groups.map{ |group| validate_group group rescue next @groups[group][priv] }.uniq.flatten.compact end
can_access_branch?(group, priv, branch)
click to toggle source
# File lib/blaggard/group_config.rb, line 91 def can_access_branch?(group, priv, branch) validate_group group rescue (return false) validate_privilege priv @groups[group][priv].include? branch end
delete_branch(group, priv, branch)
click to toggle source
# File lib/blaggard/group_config.rb, line 70 def delete_branch(group, priv, branch) @groups = read_from_git validate_group group validate_privilege priv if @groups[group][priv].delete(branch) write_to_git else return false end end
delete_group(group)
click to toggle source
# File lib/blaggard/group_config.rb, line 81 def delete_group(group) @groups = read_from_git validate_group group if @groups.delete(group) write_to_git else false end end
read_from_git()
click to toggle source
# File lib/blaggard/group_config.rb, line 47 def read_from_git ref = File.open(@config_file, &:readline).chomp yml = git.execute(['cat-file', '-p', ref]) @groups = YAML.load yml return @groups rescue @groups = {} end
valid_branch_name?(branch)
click to toggle source
# File lib/blaggard/group_config.rb, line 105 def valid_branch_name?(branch) valid_branches = Dir[File.join(@repo_path, 'refs/heads/*')].map{|b| b.split('/')[-3..-1].join('/')} valid_branches << 'refs/heads/*' return valid_branches.include?(branch) end
validate_group(group)
click to toggle source
Validation Methods
# File lib/blaggard/group_config.rb, line 113 def validate_group(group) unless @groups[group] raise Blaggard::GroupConfigError, "Group #{group} does not exist. Use add_branch to create it." end end
validate_privilege(priv)
click to toggle source
# File lib/blaggard/group_config.rb, line 119 def validate_privilege(priv) raise Blaggard::GroupConfigError, "Privilege must be either :read or :write" unless [:read, :write].include?(priv) end
write_to_git()
click to toggle source
# File lib/blaggard/group_config.rb, line 29 def write_to_git tmp_file = File.absolute_path File.join(@config_path, 'tmp') if File.exist? tmp_file # tmp acts like a lock file to prevent multiple writes at the same time. raise Blaggard::GroupConfigError, "Unable to write to meta config, someone else is currently using it. Try again in a few minutes." end File.open( tmp_file , 'w' ) do |f| f.write(YAML.dump @groups) end ref = git.execute(['hash-object', '-w', tmp_file]) File.open( @config_file , 'w') do |f| f.write(ref) end FileUtils.rm(tmp_file) return true end