class RJGit::Plumbing::TreeBuilder
Attributes
log[R]
treemap[RW]
Public Class Methods
new(repository)
click to toggle source
# File lib/rjgit.rb, line 259 def initialize(repository) @jrepo = RJGit.repository_type(repository) @treemap = {} init_log end
Public Instance Methods
build_tree(start_tree, treemap = nil, flush = false)
click to toggle source
# File lib/rjgit.rb, line 284 def build_tree(start_tree, treemap = nil, flush = false) existing_trees = {} untouched_objects = {} formatter = TreeFormatter.new treemap ||= self.treemap if start_tree treewalk = TreeWalk.new(@jrepo) treewalk.add_tree(start_tree) while treewalk.next filename = treewalk.get_name_string if treemap.keys.include?(filename) kind = treewalk.isSubtree ? :tree : :blob if treemap[filename] == false @log[:deleted] << [kind, filename, treewalk.get_object_id(0)] else existing_trees[filename] = treewalk.get_object_id(0) if kind == :tree end else mode = treewalk.get_file_mode(0) filename = "#{filename}/" if mode == FileMode::TREE untouched_objects[filename] = [mode, treewalk.get_object_id(0)] end end end sorted_treemap = treemap.inject({}) {|h, (k,v)| v.is_a?(Hash) ? h["#{k}/"] = v : h[k] = v; h }.merge(untouched_objects).sort sorted_treemap.each do |object_name, data| case data when Array object_name = object_name[0...-1] if data[0] == FileMode::TREE formatter.append(object_name.to_java_string, data[0], data[1]) when Hash object_name = object_name[0...-1] next_tree = build_tree(existing_trees[object_name], data) formatter.append(object_name.to_java_string, FileMode::TREE, next_tree) @log[:added] << [:tree, object_name, next_tree] unless only_contains_deletions(data) when String blobid = write_blob(data) formatter.append(object_name.to_java_string, FileMode::REGULAR_FILE, blobid) @log[:added] << [:blob, object_name, blobid] end end object_inserter.insert(formatter) end
init_log()
click to toggle source
# File lib/rjgit.rb, line 269 def init_log @log = {:deleted => [], :added => [] } end
object_inserter()
click to toggle source
# File lib/rjgit.rb, line 265 def object_inserter @object_inserter ||= @jrepo.newObjectInserter end
only_contains_deletions(hashmap)
click to toggle source
# File lib/rjgit.rb, line 273 def only_contains_deletions(hashmap) hashmap.each do |key, value| if value.is_a?(Hash) return false unless only_contains_deletions(value) elsif value.is_a?(String) return false end end true end
write_blob(contents, flush = false)
click to toggle source
# File lib/rjgit.rb, line 329 def write_blob(contents, flush = false) blobid = object_inserter.insert(Constants::OBJ_BLOB, contents.to_java_bytes) object_inserter.flush if flush blobid end