From 54917bbdb9f2df527c6a14f06cb9c2bb8415dd9d Mon Sep 17 00:00:00 2001 From: rick Date: Wed, 13 Oct 2010 09:52:04 -0700 Subject: [PATCH] recover from bad shas --- lib/gollum/git_access.rb | 17 ++++++++++------- lib/gollum/page.rb | 2 +- test/test_git_access.rb | 15 +++++++++++++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/gollum/git_access.rb b/lib/gollum/git_access.rb index 25bace47..00ae88f0 100644 --- a/lib/gollum/git_access.rb +++ b/lib/gollum/git_access.rb @@ -47,8 +47,9 @@ module Gollum end def tree(ref) - sha = ref_to_sha(ref) - get_cache(:tree, sha) { tree!(sha) } + if sha = ref_to_sha(ref) + get_cache(:tree, sha) { tree!(sha) } + end end def blob(sha) @@ -62,9 +63,10 @@ module Gollum if sha = get_cache(:ref, ref) commit(sha) else - cm = commit!(ref) - set_cache(:ref, ref, cm.id) - set_cache(:commit, cm.id, cm) + if cm = commit!(ref) + set_cache(:ref, ref, cm.id) + set_cache(:commit, cm.id, cm) + end end end end @@ -95,6 +97,7 @@ module Gollum def ref_to_sha!(ref) @repo.git.rev_list({:max_count=>1}, ref) + rescue Grit::GitRuby::Repository::NoSuchShaFound end def tree!(sha) @@ -119,12 +122,12 @@ module Gollum if value.nil? && block_given? set_cache(name, key, value = yield) end - value + value == :_nil ? nil : value end def set_cache(name, key, value) cache = instance_variable_get("@#{name}_map") - cache[key] = value + cache[key] = value || :_nil end def multi_get(name, keys) diff --git a/lib/gollum/page.rb b/lib/gollum/page.rb index 32f0ad51..a534371c 100644 --- a/lib/gollum/page.rb +++ b/lib/gollum/page.rb @@ -289,7 +289,7 @@ module Gollum # # Returns a Gollum::Page or nil if the page could not be found. def find_page_in_tree(map, name, checked_dir = nil) - return nil if name.to_s.empty? + return nil if !map || name.to_s.empty? if checked_dir = BlobEntry.normalize_dir(checked_dir) checked_dir.downcase! end diff --git a/test/test_git_access.rb b/test/test_git_access.rb index 7e62c689..2d9ac653 100644 --- a/test/test_git_access.rb +++ b/test/test_git_access.rb @@ -15,7 +15,6 @@ context "GitAccess" do test "#commits uses commit_map" do actual = @access.repo.commits.first - #@access.commit actual.id @access.commit_map['abc'] = 1 commits = @access.commits('abc', actual.id) assert_equal 1, commits[0] @@ -27,7 +26,7 @@ context "GitAccess" do assert @access.tree_map.empty? @access.tree 'master' assert_equal({"master"=>"60f12f4254f58801b9ee7db7bca5fa8aeefaa56b"}, @access.ref_map) - + map = @access.tree_map['60f12f4254f58801b9ee7db7bca5fa8aeefaa56b'] assert_equal 'Bilbo-Baggins.md', map[0].path assert_equal '', map[0].dir @@ -45,4 +44,16 @@ context "GitAccess" do entry = @access.tree_map['60f12f4254f58801b9ee7db7bca5fa8aeefaa56b'][0] assert_equal 'Bilbo-Baggins.md', entry.path end + + test "cannot access commit from invalid ref" do + assert_nil @access.commit('foo') + end + + test "cannot access sha from invalid ref" do + assert_nil @access.ref_to_sha('foo') + end + + test "cannot access tree from invalid ref" do + assert_nil @access.tree('foo') + end end \ No newline at end of file