From c9f5b10d2b18c0ea0a9fa0a960dd6ad52be81ea0 Mon Sep 17 00:00:00 2001 From: Simon 'corecode' Schubert Date: Wed, 24 Jan 2007 09:22:35 +0100 Subject: [PATCH] Keep storages as instance variables --- git.rb | 30 ++++++++++++++++++++---------- git/internal/mmap.rb | 4 ++++ git/internal/pack.rb | 6 ++++++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/git.rb b/git.rb index d8e4185234..73aec9ab22 100644 --- a/git.rb +++ b/git.rb @@ -7,6 +7,9 @@ module Git class Repository def initialize(git_dir) @git_dir = git_dir + @loose = Internal::LooseStorage.new("#@git_dir/objects") + @packs = [] + initpacks end def get_object_by_sha1(sha1) @@ -17,28 +20,35 @@ module Git def get_raw_object_by_sha1(sha1) sha1 = [sha1].pack("H*") - packs = Dir.glob(@git_dir + '/objects/pack/pack-*.pack') # try packs - packs.each do |pack| - storage = Git::Internal::PackStorage.new(pack) - o = storage[sha1] + @packs.each do |pack| + o = pack[sha1] return o if o end # try loose storage - storage = Git::Internal::LooseStorage.new(@git_dir+'/objects') - o = storage[sha1] + o = @loose[sha1] return o if o # try packs again, maybe the object got packed in the meantime - packs.each do |pack| - storage = Git::Internal::PackStorage.new(pack) - o = storage[sha1] + initpacks + @packs.each do |pack| + o = pack[sha1] return o if o end - return nil + nil + end + + def initpacks + @packs.each do |pack| + pack.close + end + @packs = [] + Dir.glob("#@git_dir/objects/pack/pack-*.pack").each do |pack| + @packs << Git::Internal::PackStorage.new(pack) + end end end end diff --git a/git/internal/mmap.rb b/git/internal/mmap.rb index 3cb05589de..c1500c1869 100644 --- a/git/internal/mmap.rb +++ b/git/internal/mmap.rb @@ -9,6 +9,10 @@ module Git module Internal @offset = nil end + def unmap + @file = nil + end + def [](*idx) idx = idx[0] if idx.length == 1 case idx diff --git a/git/internal/pack.rb b/git/internal/pack.rb index 5408eed690..d9c297e84a 100644 --- a/git/internal/pack.rb +++ b/git/internal/pack.rb @@ -40,6 +40,12 @@ module Git module Internal @size = @offsets[-1] end + def close + @packfile.close + @idx.unmap + @idxfile.close + end + def [](sha1) offset = find_object(sha1) return nil if !offset -- 2.11.4.GIT