i now have the gitweb view page running off only 2 git calls
authorscott Chacon <schacon@agadorsparticus.(none)>
Tue, 20 Nov 2007 16:54:45 +0000 (20 08:54 -0800)
committerscott Chacon <schacon@agadorsparticus.(none)>
Tue, 20 Nov 2007 16:54:45 +0000 (20 08:54 -0800)
README
TODO
camping/gitweb.rb
lib/git/base.rb
lib/git/lib.rb

diff --git a/README b/README
index 816e955..e71ec68 100644 (file)
--- a/README
+++ b/README
@@ -59,8 +59,7 @@ First you have to remember to require rubygems if it's not.  Then include the 'g
 
 Here are the operations that need read permission only.
       
-   g = Git.open (working_dir = '.')
-         (git_dir, index_file)
+   g = Git.open (working_dir, :log => Logger.new(STDOUT))
    
    g.index
    g.index.readable?
diff --git a/TODO b/TODO
index 3394996..c39db6b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,5 @@
 * more documentation
 
-* logging (Git.open(:log => Logger.new))
-
 
 * git revert, stash, rebase
 
@@ -15,7 +13,7 @@
   - prune, fsck, pack-refs, gc, count-objects, unpack-objects
 
 * email/patch integration
-  - request-pull(email_address), git-am, git-apply, cherry-pick
+  - request-pull(email_address), git-am, git-apply
   
   
 * compatible with git 1.4
index bf8cf24..b346824 100644 (file)
@@ -12,6 +12,7 @@ require 'lib/git'
 #
 # todo
 #   - diff/patch between any two objects
+#     - expand patch to entire file
 #   - grep / search function
 #   - prettify : http://projects.wh.techno-weenie.net/changesets/3030
 #   - add user model (add/remove repos)
@@ -89,7 +90,10 @@ module GitWeb::Controllers
   class View < R '/view/(\d+)'
     def get repo_id
       @repo = Repository.find repo_id
-      @git = Git.bare(@repo.path)      
+      logger = Logger.new('/tmp/git.log')
+      logger.level = Logger::INFO
+      
+      @git = Git.bare(@repo.path, :log => logger)      
       render :view
     end
   end
@@ -214,7 +218,7 @@ module GitWeb::Views
     gtags = @git.tags
     @tags = {}
     gtags.each { |tag| @tags[tag.sha] ||= []; @tags[tag.sha] << tag.name }
-        
+    
     url = 'http:' + URL(Fetch, @repo.id, '').to_s
 
     h3 'info'
@@ -321,6 +325,9 @@ module GitWeb::Views
     
     case ext
       when 'rb' : classnm = 'sh_ruby'
+      when 'js' : classnm = 'sh_javascript'
+      when 'html' : classnm = 'sh_html'
+      when 'css' : classnm = 'sh_css'
     end
     
     a.options 'repo', :href => R(View, @repo)
index fe0b2e7..1820ee2 100644 (file)
@@ -73,6 +73,7 @@ module Git
       end
       if options[:log]
         @logger = options[:log]
+        @logger.info("Starting Git")
       end
       
       @working_directory = Git::WorkingDirectory.new(options[:working_directory]) if options[:working_directory]
index 293e00b..256d4b6 100644 (file)
@@ -90,6 +90,13 @@ module Git
       if /\w{40}/.match(string)  # passing in a sha - just no-op it
         return string
       end
+            
+      head = File.join(@git_dir, 'refs', 'heads', string)
+      return File.read(head) if File.file?(head)
+
+      head = File.join(@git_dir, 'refs', 'remotes', string)
+      return File.read(head) if File.file?(head)
+      
       command('rev-parse', string)
     end
     
@@ -170,15 +177,31 @@ module Git
     end
 
     def branches_all
+      head = File.read(File.join(@git_dir, 'HEAD'))
       arr = []
-      command_lines('branch', '-a').each do |b| 
-        current = false
-        current = true if b[0, 2] == '* '
-        arr << [b.gsub('* ', '').strip, current]
+      
+      if m = /ref: refs\/heads\/(.*)/.match(head)
+        current = m[1]
       end
+      arr += list_files('heads').map { |f| [f, f == current] }
+      arr += list_files('remotes').map { |f| [f, false] }
+      
+      #command_lines('branch', '-a').each do |b| 
+      #  current = false
+      #  current = true if b[0, 2] == '* '
+      #  arr << [b.gsub('* ', '').strip, current]
+      #end
+      
       arr
     end
 
+    def list_files(ref_dir)
+      dir = File.join(@git_dir, 'refs', ref_dir)
+      files = nil
+      Dir.chdir(dir) { files = Dir.glob('**/*').select { |f| File.file?(f) } }
+      files
+    end
+    
     def branch_current
       branches_all.select { |b| b[1] }.first[0] rescue nil
     end
@@ -280,14 +303,38 @@ module Git
     end
 
     def config_get(name)
-      command('config', ['--get', name])
+      c = config_list
+      c[name]
+      #command('config', ['--get', name])
     end
     
     def config_list
+      config = {}
+      config.merge!(parse_config('~/.gitconfig'))
+      config.merge!(parse_config(File.join(@git_dir, 'config')))
+      #hsh = {}
+      #command_lines('config', ['--list']).each do |line|
+      #  (key, value) = line.split('=')
+      #  hsh[key] = value
+      #end
+      #hsh
+    end
+    
+    def parse_config(file)
       hsh = {}
-      command_lines('config', ['--list']).each do |line|
-        (key, value) = line.split('=')
-        hsh[key] = value
+      file = File.expand_path(file)
+      if File.file?(file)
+        current_section = nil
+        File.readlines(file).each do |line|
+          if m = /\[(\w+)\]/.match(line)
+            current_section = m[1]
+          elsif m = /\[(\w+?) "(.*?)"\]/.match(line)
+            current_section = "#{m[1]}.#{m[2]}"
+          elsif m = /(\w+?) = (.*)/.match(line)
+            key = "#{current_section}.#{m[1]}"
+            hsh[key] = m[2] 
+          end
+        end
       end
       hsh
     end
@@ -370,7 +417,11 @@ module Git
     end
 
     def tags
-      command_lines('tag')
+      tag_dir = File.join(@git_dir, 'refs', 'tags')
+      tags = []
+      Dir.chdir(tag_dir) { tags = Dir.glob('*') }
+      return tags
+      #command_lines('tag')
     end
 
     def tag(tag)
@@ -387,6 +438,9 @@ module Git
     end
     
     def tag_sha(tag_name)
+      head = File.join(@git_dir, 'refs', 'tags', tag_name)
+      return File.read(head).chomp if File.exists?(head)
+      
       command('show-ref',  ['--tags', '-s', tag_name])
     end