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