4a1c897aa9407cf7715b6d522c93d9512f5187e6
[rubygit.git] / lib / git / raw / repository.rb
blob4a1c897aa9407cf7715b6d522c93d9512f5187e6
1 require 'git/raw/internal/object'
2 require 'git/raw/internal/pack'
3 require 'git/raw/internal/loose'
4 require 'git/raw/object'
6 module Git
7   module Raw
8     
9     class Repository
10       def initialize(git_dir)
11         @git_dir = git_dir
12         @loose = Raw::Internal::LooseStorage.new(git_path("objects"))
13         @packs = []
14         initpacks
15       end
17       def show
18         @packs.each do |p|
19           puts p.name
20           puts
21           p.each_sha1 do |s|
22             puts "**#{p[s].type}**"
23             if p[s].type.to_s == 'commit'
24               puts s.unpack('H*')
25               puts p[s].content
26             end
27           end
28           puts
29         end
30       end
31       
32       def cat_file(sha)
33         get_raw_object_by_sha1(sha).content rescue nil
34       end
35       
36       def log(sha, count = 30)
37         output = ''
38         i = 0
40         while sha && (i < count) do
41           o = get_raw_object_by_sha1(sha)
42           c = Git::Raw::Object.from_raw(o)
43           
44           output += "commit #{sha}\n"
45           output += o.content + "\n"
47           sha = c.parent.first
48           i += 1
49         end
50         
51         output
52       end
53       
54       def get_object_by_sha1(sha1)
55         r = get_raw_object_by_sha1(sha1)
56         return nil if !r
57         Object.from_raw(r, self)
58       end
60       def get_raw_object_by_sha1(sha1)
61         sha1 = [sha1].pack("H*")
63         # try packs
64         @packs.each do |pack|
65           o = pack[sha1]
66           return o if o
67         end
69         # try loose storage
70         o = @loose[sha1]
71         return o if o
73         # try packs again, maybe the object got packed in the meantime
74         initpacks
75         @packs.each do |pack|
76           o = pack[sha1]
77           return o if o
78         end
80         nil
81       end
83       protected
84       
85         def git_path(path)
86           return "#@git_dir/#{path}"
87         end
89       private 
90       
91         def initpacks
92           @packs.each do |pack|
93             pack.close
94           end
95           @packs = []
96           Dir.open(git_path("objects/pack/")) do |dir|
97             dir.each do |entry|
98               if entry =~ /\.pack$/i
99                 @packs << Git::Raw::Internal::PackStorage.new(git_path("objects/pack/" \
100                                                                   + entry))
101               end
102             end
103           end
104         end
105       
106     end
107     
108   end