Skip to content

Commit 07ebb95

Browse files
author
scott Chacon
committed
added Matthias and Simon to credits for the gitrb code
fixed an issue with raw object tree formatting added ls_tree implementation in raw git
1 parent 3fddf30 commit 07ebb95

File tree

12 files changed

+139
-21
lines changed

12 files changed

+139
-21
lines changed

camping/gitweb.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,7 @@ def get repo_id, path
107107
class Commit < R '/commit/(\d+)/(\w+)'
108108
def get repo_id, sha
109109
@repo = Repository.find repo_id
110-
logger = Logger.new('/tmp/git.log')
111-
logger.level = Logger::INFO
112-
113-
@git = Git.bare(@repo.path, :log => logger)
110+
@git = Git.bare(@repo.path)
114111
@commit = @git.gcommit(sha)
115112
render :commit
116113
end
@@ -119,7 +116,10 @@ def get repo_id, sha
119116
class Tree < R '/tree/(\d+)/(\w+)'
120117
def get repo_id, sha
121118
@repo = Repository.find repo_id
122-
@git = Git.bare(@repo.path)
119+
logger = Logger.new('/tmp/git.log')
120+
logger.level = Logger::INFO
121+
122+
@git = Git.bare(@repo.path, :log => logger)
123123
@tree = @git.gtree(sha)
124124
render :tree
125125
end

lib/git/lib.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,16 +183,22 @@ def process_commit_data(data, sha = nil)
183183

184184
def object_contents(sha)
185185
#command('cat-file', ['-p', sha])
186-
get_raw_repo.cat_file(revparse(sha))
186+
get_raw_repo.cat_file(revparse(sha)).chomp
187187
end
188188

189189
def ls_tree(sha)
190190
data = {'blob' => {}, 'tree' => {}}
191-
command_lines('ls-tree', sha.to_s).each do |line|
192-
(info, filenm) = line.split("\t")
193-
(mode, type, sha) = info.split
194-
data[type][filenm] = {:mode => mode, :sha => sha}
191+
192+
get_raw_repo.object(revparse(sha)).entry.each do |e|
193+
data[e.format_type][e.name] = {:mode => e.format_mode, :sha => e.sha1}
195194
end
195+
196+
#command_lines('ls-tree', sha.to_s).each do |line|
197+
# (info, filenm) = line.split("\t")
198+
# (mode, type, sha) = info.split
199+
# data[type][filenm] = {:mode => mode, :sha => sha}
200+
#end
201+
196202
data
197203
end
198204

lib/git/raw/internal/loose.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
require 'zlib'
212
require 'digest/sha1'
313

lib/git/raw/internal/mmap.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
begin
212
require 'mmap'
313
rescue LoadError

lib/git/raw/internal/object.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
require 'digest/sha1'
212

313
module Git

lib/git/raw/internal/pack.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
require 'zlib'
212
require 'git/raw/internal/object'
313
require 'git/raw/internal/mmap'

lib/git/raw/object.rb

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
require 'digest/sha1'
212

313
module Git
@@ -132,6 +142,21 @@ def type=(type)
132142
end
133143
end
134144

145+
def format_type
146+
case type
147+
when :link
148+
'link'
149+
when :directory
150+
'tree'
151+
when :file
152+
'blob'
153+
end
154+
end
155+
156+
def format_mode
157+
"%06o" % @mode
158+
end
159+
135160
def raw
136161
"%o %s\0%s" % [@mode, @name, [@sha1].pack("H*")]
137162
end
@@ -160,8 +185,7 @@ def type
160185
def raw_content
161186
# TODO: sort correctly
162187
#@entry.sort { |a,b| a.name <=> b.name }.
163-
@entry.
164-
collect { |e| e.raw }.join
188+
@entry.collect { |e| [[e.format_mode, e.format_type, e.sha1].join(' '), e.name].join("\t") }.join("\n")
165189
end
166190
end
167191

lib/git/raw/repository.rb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#
2+
# converted from the gitrb project
3+
#
4+
# authors:
5+
# Matthias Lederhofer <matled@gmx.net>
6+
# Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
7+
#
8+
# provides native ruby access to git objects and pack files
9+
#
10+
111
require 'git/raw/internal/object'
212
require 'git/raw/internal/pack'
313
require 'git/raw/internal/loose'
@@ -28,9 +38,14 @@ def show
2838
puts
2939
end
3040
end
31-
41+
42+
def object(sha)
43+
o = get_raw_object_by_sha1(sha)
44+
c = Git::Raw::Object.from_raw(o)
45+
end
46+
3247
def cat_file(sha)
33-
get_raw_object_by_sha1(sha).content rescue nil
48+
object(sha).raw_content
3449
end
3550

3651
def log(sha, count = 30)

tests/test_helper.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ def teardown
2828
end
2929
end
3030

31+
32+
def with_temp_bare
33+
in_temp_dir do |path|
34+
g = Git.clone(@wbare, 'new')
35+
Dir.chdir('new') do
36+
yield g
37+
end
38+
end
39+
end
40+
3141
def create_temp_repo(clone_path)
3242
filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s.rjust(3, '0')
3343
@tmp_path = File.join("/tmp/", filename)

tests/units/test_index_ops.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def setup
1010
end
1111

1212
def test_add
13-
in_temp_dir(false) do |path|
13+
in_temp_dir do |path|
1414
g = Git.clone(@wbare, 'new')
1515
Dir.chdir('new') do
1616
assert_equal('100644', g.status['example.txt'].mode_index)

tests/units/test_lib.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ def test_config_remote
102102
assert_equal('+refs/heads/*:refs/remotes/working/*', config['fetch'])
103103
end
104104

105+
106+
def test_ls_tree
107+
tree = @lib.ls_tree('94c827875e2cadb8bc8d4cdd900f19aa9e8634c7')
108+
assert_equal("3aac4b445017a8fc07502670ec2dbf744213dd48", tree['blob']['example.txt'][:sha])
109+
assert_equal("100644", tree['blob']['example.txt'][:mode])
110+
assert(tree['tree'])
111+
end
112+
113+
105114
# options this will accept
106115
# :treeish
107116
# :path_limiter

tests/units/test_raw_internals.rb

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ def setup
99
end
1010

1111
def test_raw_log
12-
g = Git.bare(@wbare)
13-
t_log(g)
12+
with_temp_bare do |g|
13+
t_log(g)
14+
end
1415
end
1516

1617
def test_packed_log
17-
g = Git.bare(@wbare)
18-
g.repack
19-
t_log(g)
18+
with_temp_bare do |g|
19+
g.repack
20+
t_log(g)
21+
end
2022
end
2123

2224
def test_commit_object
@@ -26,15 +28,27 @@ def test_commit_object
2628
assert_equal('test', c.message)
2729
end
2830

31+
def test_lstree
32+
g = Git.bare(@wbare)
33+
c = g.object("v2.5").gtree
34+
sha = c.sha
35+
36+
repo = Git::Raw::Repository.new(@wbare)
37+
puts repo.object(sha).inspect
38+
end
39+
2940
def t_log(g)
3041
c = g.object("v2.5")
3142
sha = c.sha
3243

33-
repo = Git::Raw::Repository.new(@wbare)
44+
repo = Git::Raw::Repository.new(g.repo.path)
3445
raw_out = repo.log(sha)
3546

3647
assert_equal('commit 546bec6f8872efa41d5d97a369f669165ecda0de', raw_out.split("\n").first)
3748
assert_equal('546bec6f8872efa41d5d97a369f669165ecda0de', c.log(30).first.sha)
3849
end
3950

51+
52+
53+
4054
end

0 commit comments

Comments
 (0)