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