From 3fddf300bd33b356540bee50ae17590ea9b61341 Mon Sep 17 00:00:00 2001 From: scott Chacon Date: Fri, 23 Nov 2007 11:50:02 -0800 Subject: [PATCH] started the ruby-only command line git client --- bin/gitr | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/git/base.rb | 4 ++++ lib/git/branches.rb | 12 ++++++++++ lib/git/lib.rb | 5 ++-- 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100755 bin/gitr diff --git a/bin/gitr b/bin/gitr new file mode 100755 index 0000000..53c8055 --- /dev/null +++ b/bin/gitr @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby + +# This is a command line client that can do a number of read operations +# on a git repository in pure ruby. This may be helpful if you have access +# to a computer that has no C compiler but you want to do some git stuff +# on it. It's also helpful for me to test Git stuff with. +# +# author : Scott Chacon (schacon@gmail.com) +# +# todo: +# add --git-dir +# add --log-file +# add --help + +#require 'lib/git' +require 'rubygems' +require 'git' +require 'logger' + +command = ARGV[0] + +if !command + puts 'You have to provide a command' + puts 'usage: gitr (command) [args]' + puts + puts 'commands: log' + puts ' log-shas' + puts ' cat-file' + puts ' rev-parse' + puts ' branches' + puts ' config' + exit +end + +git_dir = ENV['GIT_DIR'] || '.git' +@git = Git.bare(git_dir, :log => Logger.new(STDOUT)) + +case command +when 'log' + # gitr log + @git.log.each do |l| + puts 'commit ' + l.sha + puts l.contents + puts + end +when 'log-shas' + # gitr log-shas + puts @git.log +when 'cat-file' + # gitr cat-file + puts @git.cat_file(ARGV[1]) +when 'rev-parse' + # gitr rev-parse + puts @git.revparse(ARGV[1]) +when 'branches' + # gitr branches + puts @git.branches +when 'config' + # gitr config + @git.config.sort.each do |k,v| + puts "#{k} : #{v}" + end +end + +# gitr ls-tree +# gitr pack-browse + +# gitr diff / stats ? +# output in yaml? \ No newline at end of file diff --git a/lib/git/base.rb b/lib/git/base.rb index 1820ee2..31ba9ff 100644 --- a/lib/git/base.rb +++ b/lib/git/base.rb @@ -429,6 +429,10 @@ module Git self.lib.revparse(objectish) end + def cat_file(objectish) + self.lib.object_contents(objectish) + end + # returns the name of the branch the working directory is currently on def current_branch self.lib.branch_current diff --git a/lib/git/branches.rb b/lib/git/branches.rb index 47d001a..60ab16b 100644 --- a/lib/git/branches.rb +++ b/lib/git/branches.rb @@ -41,5 +41,17 @@ module Git @branches[symbol.to_s] end + def to_s + out = '' + @branches.each do |k, b| + if b.current + out += "* " + b.to_s + "\n" + else + out += " " + b.to_s + "\n" + end + end + out + end + end end \ No newline at end of file diff --git a/lib/git/lib.rb b/lib/git/lib.rb index 9c6a041..120d9ce 100644 --- a/lib/git/lib.rb +++ b/lib/git/lib.rb @@ -81,7 +81,7 @@ module Git sha = revparse(opts[:object] || branch_current || 'master') count = opts[:count] || 30 - repo = Git::Raw::Repository.new(@git_dir) + repo = get_raw_repo return process_commit_data(repo.log(sha, count)) end @@ -182,7 +182,8 @@ module Git end def object_contents(sha) - command('cat-file', ['-p', sha]) + #command('cat-file', ['-p', sha]) + get_raw_repo.cat_file(revparse(sha)) end def ls_tree(sha) -- 2.11.4.GIT