diff options
author | gitlabhq <m@gitlabhq.com> | 2011-10-09 01:36:38 +0400 |
---|---|---|
committer | gitlabhq <m@gitlabhq.com> | 2011-10-09 01:36:38 +0400 |
commit | 9ba1224867665844b117fa037e1465bb706b3685 (patch) | |
tree | 52fbfc1cdb55df21843965479c97be0c91121a9a /lib | |
parent | 93efff945215a4407afcaf0cba15ac601b56df0d (diff) |
init commit
Diffstat (limited to 'lib')
-rw-r--r-- | lib/assets/.gitkeep | 0 | ||||
-rw-r--r-- | lib/file_size_validator.rb | 65 | ||||
-rw-r--r-- | lib/gitosis.rb | 70 | ||||
-rw-r--r-- | lib/tasks/.gitkeep | 0 | ||||
-rw-r--r-- | lib/utils.rb | 8 |
5 files changed, 143 insertions, 0 deletions
diff --git a/lib/assets/.gitkeep b/lib/assets/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lib/assets/.gitkeep diff --git a/lib/file_size_validator.rb b/lib/file_size_validator.rb new file mode 100644 index 00000000000..151e0ce53c0 --- /dev/null +++ b/lib/file_size_validator.rb @@ -0,0 +1,65 @@ +class FileSizeValidator < ActiveModel::EachValidator + MESSAGES = { :is => :wrong_size, :minimum => :size_too_small, :maximum => :size_too_big }.freeze + CHECKS = { :is => :==, :minimum => :>=, :maximum => :<= }.freeze + + DEFAULT_TOKENIZER = lambda { |value| value.split(//) } + RESERVED_OPTIONS = [:minimum, :maximum, :within, :is, :tokenizer, :too_short, :too_long] + + def initialize(options) + if range = (options.delete(:in) || options.delete(:within)) + raise ArgumentError, ":in and :within must be a Range" unless range.is_a?(Range) + options[:minimum], options[:maximum] = range.begin, range.end + options[:maximum] -= 1 if range.exclude_end? + end + + super + end + + def check_validity! + keys = CHECKS.keys & options.keys + + if keys.empty? + raise ArgumentError, 'Range unspecified. Specify the :within, :maximum, :minimum, or :is option.' + end + + keys.each do |key| + value = options[key] + + unless value.is_a?(Integer) && value >= 0 + raise ArgumentError, ":#{key} must be a nonnegative Integer" + end + end + end + + def validate_each(record, attribute, value) + raise(ArgumentError, "A CarrierWave::Uploader::Base object was expected") unless value.kind_of? CarrierWave::Uploader::Base + + value = (options[:tokenizer] || DEFAULT_TOKENIZER).call(value) if value.kind_of?(String) + + CHECKS.each do |key, validity_check| + next unless check_value = options[key] + + value ||= [] if key == :maximum + + value_size = value.size + next if value_size.send(validity_check, check_value) + + errors_options = options.except(*RESERVED_OPTIONS) + errors_options[:file_size] = help.number_to_human_size check_value + + default_message = options[MESSAGES[key]] + errors_options[:message] ||= default_message if default_message + + record.errors.add(attribute, MESSAGES[key], errors_options) + end + end + + def help + Helper.instance + end + + class Helper + include Singleton + include ActionView::Helpers::NumberHelper + end +end diff --git a/lib/gitosis.rb b/lib/gitosis.rb new file mode 100644 index 00000000000..d19fb23966d --- /dev/null +++ b/lib/gitosis.rb @@ -0,0 +1,70 @@ +require 'lockfile' +require 'inifile' +require 'net/ssh' + +class Gitosis + + def pull + # create tmp dir + @local_dir = File.join(Dir.tmpdir,"gitme-gitosis-#{Time.now.to_i}") + + Dir.mkdir @local_dir + + # clone repo + `git clone #{GITOSIS['admin_uri']} #{@local_dir}/gitosis` + end + + def push + # add, commit, push, and remove local tmp dir + `cd #{File.join(@local_dir,'gitosis')} ; git add keydir/* gitosis.conf` + `cd #{File.join(@local_dir,'gitosis')} ; git commit -a -m 'updated by Gitlab Gitosis'` + `cd #{File.join(@local_dir,'gitosis')} ; git push` + + # remove local copy + `rm -Rf #{@local_dir}` + end + + def configure + File.open(File.join(Dir.tmpdir,"gitme-gitosis.lock"), "w+") do |f| + f.flock(File::LOCK_EX) + + pull + yield(self) + push + + f.flock(File::LOCK_UN) + end + end + + def destroy_project(project) + `rm -Rf #{project.path_to_repo}` + + conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) + + conf.delete_section("group #{project.path}") + + conf.write + end + + #update or create + def update_keys(user, key) + File.open(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) } + end + + def delete_key(user) + File.unlink(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub")) + `cd #{File.join(@local_dir,'gitosis')} ; git rm keydir/#{user}.pub` + end + + #update or create + def update_project(repo_name, name_writers) + # write config file + conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) + + conf["group #{repo_name}"]['writable'] = repo_name + conf["group #{repo_name}"]['members'] = name_writers.join(' ') + + conf.write + end + +end diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lib/tasks/.gitkeep diff --git a/lib/utils.rb b/lib/utils.rb new file mode 100644 index 00000000000..6e7460ed99a --- /dev/null +++ b/lib/utils.rb @@ -0,0 +1,8 @@ +module Utils + def self.binary?(string) + string.each_byte do |x| + x.nonzero? or return true + end + false + end +end |