summaryrefslogtreecommitdiffstats
path: root/lib/git
diff options
context:
space:
mode:
Diffstat (limited to 'lib/git')
-rw-r--r--lib/git/base.rb45
-rw-r--r--lib/git/lib.rb33
-rw-r--r--lib/git/path.rb4
3 files changed, 65 insertions, 17 deletions
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