From efcce7fc123b9e64fb9d93224e4e78d09144af3d Mon Sep 17 00:00:00 2001 From: scott Chacon Date: Sat, 10 Nov 2007 15:34:12 -0800 Subject: got clone and init to work - my first writing functions --- lib/git/base.rb | 45 +++++++++++++++++++++++++++++++++------------ lib/git/lib.rb | 33 ++++++++++++++++++++++++++++++--- lib/git/path.rb | 4 ++-- 3 files changed, 65 insertions(+), 17 deletions(-) (limited to 'lib/git') diff --git a/lib/git/base.rb b/lib/git/base.rb index 1111887..00495c7 100644 --- a/lib/git/base.rb +++ b/lib/git/base.rb @@ -6,22 +6,26 @@ module Git @repository = nil @index = nil - # opens a Git Repository - no working directory options - def self.repo(git_dir) + # opens a bare Git Repository - no working directory options + def self.bare(git_dir) self.new :repository => git_dir end # opens a new Git Project from a working directory # you can specify non-standard git_dir and index file in the options def self.open(working_dir, opts={}) - default = {:working_directory => working_dir, - :repository => File.join(working_dir, '.git'), - :index => File.join(working_dir, '.git', 'index')} + default = {:working_directory => working_dir} git_options = default.merge(opts) self.new(git_options) end - + + # initializes a git repository + # + # options: + # :repository + # :index_file + # def self.init(working_dir, opts = {}) default = {:working_directory => working_dir, :repository => File.join(working_dir, '.git')} @@ -38,19 +42,36 @@ module Git self.new(git_options) end - def self.clone - raise NotImplementedError + # clones a git repository locally + # + # repository - http://repo.or.cz/w/sinatra.git + # name - sinatra + # + # options: + # :repository + # + # :bare + # or + # :working_directory + # :index_file + # + def self.clone(repository, name, opts = {}) + # run git-clone + self.new(Git::Lib.new.clone(repository, name, opts)) end def initialize(options = {}) + if working_dir = options[:working_directory] + options[:repository] = File.join(working_dir, '.git') if !options[:repository] + options[:index] = File.join(working_dir, '.git', 'index') if !options[:index] + end + @working_directory = Git::WorkingDirectory.new(options[:working_directory]) if options[:working_directory] @repository = Git::Repository.new(options[:repository]) if options[:repository] - @index = Git::Index.new(options[:index]) if options[:index] + @index = Git::Index.new(options[:index], false) if options[:index] end - - - + def dir @working_directory end diff --git a/lib/git/lib.rb b/lib/git/lib.rb index 8bb518b..9fa3986 100644 --- a/lib/git/lib.rb +++ b/lib/git/lib.rb @@ -8,8 +8,9 @@ module Git @git_dir = nil @git_index_file = nil @git_work_dir = nil + @path = nil - def initialize(base) + def initialize(base = nil) if base.is_a?(Git::Base) @git_dir = base.repo.path @git_index_file = base.index.path @@ -25,6 +26,32 @@ module Git command('init') end + # tries to clone the given repo + # + # returns {:repository} (if bare) + # {:working_directory} otherwise + # + # accepts options: + # :remote - name of remote (rather than 'origin') + # :bare - no working directory + # + # TODO - make this work with SSH password or auth_key + # + def clone(repository, name, opts = {}) + @path = opts[:path] || '.' + clone_dir = File.join(@path, name) + + arr_opts = [] + arr_opts << "--bare" if opts[:bare] + arr_opts << "-o #{opts[:remote]}" if opts[:remote] + arr_opts << repository + arr_opts << clone_dir + + command('clone', arr_opts) + + opts[:bare] ? {:repository => clone_dir} : {:working_directory => clone_dir} + end + def log_commits(opts = {}) arr_opts = ['--pretty=oneline'] arr_opts << "-#{opts[:count]}" if opts[:count] @@ -142,10 +169,10 @@ module Git end def command(cmd, opts = {}) - ENV['GIT_DIR'] = @git_dir + ENV['GIT_DIR'] = @git_dir if @git_dir ENV['GIT_INDEX_FILE'] = @git_index_file if @git_index_file ENV['GIT_WORK_DIR'] = @git_work_dir if @git_work_dir - Dir.chdir(@git_work_dir || @git_dir) do + Dir.chdir(@git_work_dir || @git_dir || @path) do opts = opts.to_a.join(' ') #puts "git #{cmd} #{opts}" out = `git #{cmd} #{opts} 2>&1`.chomp diff --git a/lib/git/path.rb b/lib/git/path.rb index 18845fa..e429d6f 100644 --- a/lib/git/path.rb +++ b/lib/git/path.rb @@ -5,9 +5,9 @@ module Git def initialize(path, check_path = true) if !check_path || File.exists?(path) - @path = path + @path = File.expand_path(path) else - raise ArgumentError, "path does not exist", path + raise ArgumentError, "path does not exist", File.expand_path(path) end end -- cgit