Class: Grit::GitRuby::Internal::LooseStorage
- Inherits:
-
Object
- Object
- Grit::GitRuby::Internal::LooseStorage
- Defined in:
- lib/grit/git-ruby/internal/loose.rb
Class Method Summary collapse
-
.calculate_sha(content, type) ⇒ Object
simply figure out the sha.
- .verify_header(type, size) ⇒ Object
Instance Method Summary collapse
- #[](sha1) ⇒ Object
- #get_raw_object(buf) ⇒ Object
-
#initialize(directory) ⇒ LooseStorage
constructor
A new instance of LooseStorage.
-
#put_raw_object(content, type) ⇒ Object
currently, I’m using the legacy format because it’s easier to do this function takes content and a type and writes out the loose object and returns a sha.
Constructor Details
#initialize(directory) ⇒ LooseStorage
Returns a new instance of LooseStorage.
23 24 25 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 23 def initialize(directory) @directory = directory end |
Class Method Details
.calculate_sha(content, type) ⇒ Object
simply figure out the sha
87 88 89 90 91 92 93 94 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 87 def self.calculate_sha(content, type) size = content.length.to_s verify_header(type, size) header = "#{type} #{size}\0" store = header + content Digest::SHA1.hexdigest(store) end |
.verify_header(type, size) ⇒ Object
96 97 98 99 100 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 96 def self.verify_header(type, size) if !%w(blob tree commit tag).include?(type) || size !~ /^\d+$/ raise LooseObjectError, "invalid object header" end end |
Instance Method Details
#[](sha1) ⇒ Object
27 28 29 30 31 32 33 34 35 36 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 27 def [](sha1) sha1 = sha1.unpack("H*")[0] begin return nil unless sha1[0...2] && sha1[2..39] path = @directory + '/' + sha1[0...2] + '/' + sha1[2..39] get_raw_object(open(path, 'rb') { |f| f.read }) rescue Errno::ENOENT nil end end |
#get_raw_object(buf) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 38 def get_raw_object(buf) if buf.length < 2 raise LooseObjectError, "object file too small" end if legacy_loose_object?(buf) content = Zlib::Inflate.inflate(buf) header, content = content.split(/\0/, 2) if !header || !content raise LooseObjectError, "invalid object header" end type, size = header.split(/ /, 2) if !%w(blob tree commit tag).include?(type) || size !~ /^\d+$/ raise LooseObjectError, "invalid object header" end type = type.to_sym size = size.to_i else type, size, used = unpack_object_header_gently(buf) content = Zlib::Inflate.inflate(buf[used..-1]) end raise LooseObjectError, "size mismatch" if content.length != size return RawObject.new(type, content) end |
#put_raw_object(content, type) ⇒ Object
currently, I’m using the legacy format because it’s easier to do this function takes content and a type and writes out the loose object and returns a sha
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/grit/git-ruby/internal/loose.rb', line 65 def put_raw_object(content, type) size = content.length.to_s LooseStorage.verify_header(type, size) header = "#{type} #{size}\0" store = header + content sha1 = Digest::SHA1.hexdigest(store) path = @directory+'/'+sha1[0...2]+'/'+sha1[2..40] if !File.exists?(path) content = Zlib::Deflate.deflate(store) FileUtils.mkdir_p(@directory+'/'+sha1[0...2]) File.open(path, 'wb') do |f| f.write content end end return sha1 end |