class Gitolite::Repo

Constants

GIOLITE_ALL_GROUP
RepoConfTemplate

We check if there are users in addition to tenant with line, (repo_conf.rights_hash.values.flatten.size > 1) In case no, we do not give permission to tenant even

Attributes

commit_messages[RW]
logger[RW]
repo_dir_path[R]
repo_name[RW]
rights_hash[RW]
user_groups[RW]

Public Class Methods

get_repo_type(repo_name) click to toggle source
# File lib/gitolite/repo.rb, line 51
def get_repo_type(repo_name)
  repo_name.match(/\-\-cm\-\-/) ? 'component' : 'service'
end
new(repo_name, configuration_, logger_, gitolite_path, gitolite_branch = 'master') click to toggle source
# File lib/gitolite/repo.rb, line 57
def initialize(repo_name, configuration_, logger_, gitolite_path, gitolite_branch = 'master')
  @rights_hash = { 'R' => [], 'W' => [], 'RW' => [], 'RW+' => []}
  @repo_name = repo_name
  @user_groups = []
  @commit_messages = []
  @repo_conf_file_path = configuration_.repo_path(repo_name)
  @repo_dir_path       = configuration_.bare_repo_path(repo_name)
  @gitolite_admin_repo ||= Git::FileAccess.new(gitolite_path, gitolite_branch)
  @logger = logger_

  if exists?
    load_repo()
  end
end

Public Instance Methods

add_all_with_rights(access_rights) click to toggle source
# File lib/gitolite/repo.rb, line 119
def add_all_with_rights(access_rights)
  add_username_with_rights(GIOLITE_ALL_GROUP, access_rights)
end
add_user_group_with_rights(group_name, access_rights) click to toggle source
# File lib/gitolite/repo.rb, line 115
def add_user_group_with_rights(group_name, access_rights)
  add_username_with_rights("@#{group_name}", access_rights)
end
add_username_with_rights(username, access_rights) click to toggle source
# File lib/gitolite/repo.rb, line 95
def add_username_with_rights(username, access_rights)
  # if we get nil that means that we have to delete user from its permission stack
  if access_rights.nil?
    return remove_username(username)
  end

  # Only make changes if this is new user/group
  unless @rights_hash[access_rights.upcase].include?(username)
    remove_username(username)

    @rights_hash[access_rights.upcase] << username
    @commit_messages << "Added access rights ('#{access_rights}') for user/group '#{username}', in repo '#{@repo_name}'"

    # add to user groups if user group is added
    if username.match(/^@/)
      @user_groups << username
    end
  end
end
any_changes?() click to toggle source
# File lib/gitolite/repo.rb, line 131
def any_changes?
  !@commit_messages.empty?
end
branches() click to toggle source
# File lib/gitolite/repo.rb, line 123
def branches
  Git::FileAccess.new(@repo_dir_path).branches()
end
commit_changes(override_commit_message = nil) click to toggle source
# File lib/gitolite/repo.rb, line 135
def commit_changes(override_commit_message = nil)
  unless @commit_messages.empty?
    content = configuration_content()
    validate_gitolite_conf_file(content)

    commit_msg = override_commit_message || @commit_messages.join(', ')

    @gitolite_admin_repo.add_file(@repo_conf_file_path,content)
    @gitolite_admin_repo.commit(commit_msg)

    @logger.info(commit_msg)
  else
    @logger.info("There has been no changes on repo '#{@repo_name}' skipping gitolite commit.")
  end
end
exists?() click to toggle source
# File lib/gitolite/repo.rb, line 127
def exists?
  !@gitolite_admin_repo.file_content(@repo_conf_file_path).nil?
end
file_content(path, branch=Git::Adapter::DEFAULT_BRANCH) click to toggle source
# File lib/gitolite/repo.rb, line 151
def file_content(path, branch=Git::Adapter::DEFAULT_BRANCH)
  Git::FileAccess.new(@repo_dir_path, branch).file_content(path)
end
file_content_and_size(path, branch=Git::Adapter::DEFAULT_BRANCH) click to toggle source
# File lib/gitolite/repo.rb, line 155
def file_content_and_size(path, branch=Git::Adapter::DEFAULT_BRANCH)
  Git::FileAccess.new(@repo_dir_path, branch).file_content_and_size(path)
end
file_list(depth=nil, branch=Git::Adapter::DEFAULT_BRANCH) click to toggle source
# File lib/gitolite/repo.rb, line 159
def file_list(depth=nil, branch=Git::Adapter::DEFAULT_BRANCH)
  Git::FileAccess.new(@repo_dir_path, branch).ls_r(depth)
end
remove_group(group_name) click to toggle source
# File lib/gitolite/repo.rb, line 91
def remove_group(group_name)
  remove_username("@#{group_name}")
end
remove_username(username) click to toggle source
# File lib/gitolite/repo.rb, line 82
def remove_username(username)
  @rights_hash.each do |k,v|
    if v.include?(username)
      v.delete(username)
      @commit_messages << "Removed access rights ('#{k}') for user/group '#{username}'"
    end
  end
end
rights_for_username(username) click to toggle source
# File lib/gitolite/repo.rb, line 72
def rights_for_username(username)
  @rights_hash.each do |k,v|
    if v.include?(username)
      return k
    end
  end

  return nil
end

Private Instance Methods

configuration_content() click to toggle source
# File lib/gitolite/repo.rb, line 165
def configuration_content()
  RepoConfTemplate.result(:repo_conf => self)
end
load_repo() click to toggle source
# File lib/gitolite/repo.rb, line 169
def load_repo()
  raw_content = @gitolite_admin_repo.file_content(@repo_conf_file_path)

  unless raw_content
    raise ::Error::NotFound, "Configuration file for repo (#{repo_name}) does not exist"
  end

  raw_content.each_line do |l|
    l.chomp!()
    if l =~ /^[ ]*repo[ ]+([^ ]+)/
      unless $1 == repo_name
        raise Error::GitoliteParsing, "Parsing error: expected repo to be (${repo_name} in (#{l})"
      end
    elsif l =~ /[ ]*([^ ]+)[ ]*=[ ]*(.+)$/
      access_rights = $1
      users = $2
      users.scan(/[^ ]+/) do |user|
        unless access_rights.match(/R|W|RW|RW+/)
          raise  Error::GitoliteParsing, "Unexpected access rights while parsing file '#{access_rights}'"
        end

        @rights_hash[access_rights.to_s] << user unless @rights_hash[access_rights.to_s].include?(user)

        # add to user groups if present
        if user.match(/^@/)
          @user_groups << user
        end
      end
    elsif l.strip.empty? || l.strip().match(/^include/)
      #no op
    else
      raise ::Error::GitoliteParsing, "Parsing repo error: (#{l})"
    end
  end
end