lib/gitauth/repo.rb in brownbeagle-gitauth-0.0.1 vs lib/gitauth/repo.rb in brownbeagle-gitauth-0.0.2

- old
+ new

@@ -16,91 +16,94 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. #++ require 'fileutils' module GitAuth - class Repo - REPOS_PATH = File.join(GitAuth::GITAUTH_DIR, "repositories.yml") + class Repo < SaveableClass(:repositories) + NAME_RE = /^([\w\_\-\.\+]+(\.git)?)$/i - def self.all - @@all_repositories ||= nil - end - - def self.load! - self.all = YAML.load_file(REPOS_PATH) rescue nil if File.exist?(REPOS_PATH) - self.all = [] unless self.all.is_a?(Array) - end - - def self.save! - load! if self.all.nil? - File.open(REPOS_PATH, "w+") do |f| - f.write self.all.to_yaml - end - end - - def self.all=(value) - @@all_repositories = value - end - def self.get(name) GitAuth.logger.debug "Getting Repo w/ name: '#{name}'" self.all.detect { |r| r.name == name } end def self.create(name, path = name) - return false unless self.get(name).nil? + return false if name.nil? || path.nil? + return false if self.get(name) || self.all.any? { |r| r.path == path } || name !~ NAME_RE || path !~ NAME_RE repository = self.new(name, path) - if repository.create_repo! - self.load! - self.all << repository - self.save! - return true - else - return false - end + return false unless repository.create_repo! + self.add_item(repository) + return true end - attr_accessor :name, :path + attr_accessor :name, :path, :permissions def initialize(name, path, auto_create = false) @name, @path = name, path @permissions = {} end - def writeable_by(user) + def ==(other) + other.is_a?(Repo) && other.name == name && other.path == path + end + + def writeable_by(user_or_group) @permissions[:write] ||= [] - @permissions[:write] << user.name + @permissions[:write] << user_or_group.to_s @permissions[:write].uniq! end - def readable_by(user) + def readable_by(user_or_group) @permissions[:read] ||= [] - @permissions[:read] << user.name + @permissions[:read] << user_or_group.to_s @permissions[:read].uniq! end - def writeable_by?(user) - (@permissions[:write] || []).include? user.name + def writeable_by?(user_or_group) + !(@permissions[:write] || []).detect do |writer| + writer = GitAuth.get_user_or_group(writer) + writer == user_or_group || (writer.is_a?(Group) && writer.member?(user_or_group, true)) + end.nil? end - def readable_by?(user) - (@permissions[:read] || []).include? user.name + def readable_by?(user_or_group) + !(@permissions[:read] || []).detect do |reader| + reader = GitAuth.get_user_or_group(reader) + reader == user_or_group || (reader.is_a?(Group) && reader.member?(user_or_group, true)) + end.nil? end + def remove_permissions_for(user_or_group) + @permissions.each_value do |val| + val.reject! { |m| m == user_or_group.to_s } + end + end + def real_path File.join(GitAuth.settings.base_path, @path) end def create_repo! + return false if !self.class.has_git? path = self.real_path unless File.exist?(path) && File.directory?(path) FileUtils.mkdir_p(path) output = "" Dir.chdir(path) do IO.popen("git init --bare") { |f| output << f.read } end return !!(output =~ /Initialized empty Git repository/) end + end + + def destroy! + FileUtils.rm_rf(self.real_path) if File.exist?(self.real_path) + self.class.all.reject! { |r| r == self } + self.class.save! + end + + def self.has_git? + !`which git`.strip.empty? end end end \ No newline at end of file