Class: RJGit::Plumbing::TreeBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/rjgit.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(repository) ⇒ TreeBuilder

Returns a new instance of TreeBuilder.



259
260
261
262
263
# File 'lib/rjgit.rb', line 259

def initialize(repository)
  @jrepo = RJGit.repository_type(repository)
  @treemap = {}
  init_log
end

Instance Attribute Details

#logObject (readonly)

Returns the value of attribute log.



257
258
259
# File 'lib/rjgit.rb', line 257

def log
  @log
end

#treemapObject

Returns the value of attribute treemap.



256
257
258
# File 'lib/rjgit.rb', line 256

def treemap
  @treemap
end

Instance Method Details

#build_tree(start_tree, treemap = nil, flush = false) ⇒ Object



284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# 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_logObject



269
270
271
# File 'lib/rjgit.rb', line 269

def init_log
  @log = {:deleted => [], :added => [] }
end

#object_inserterObject



265
266
267
# File 'lib/rjgit.rb', line 265

def object_inserter
  @object_inserter ||= @jrepo.newObjectInserter
end

#only_contains_deletions(hashmap) ⇒ Object



273
274
275
276
277
278
279
280
281
282
# 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) ⇒ Object



329
330
331
332
333
# 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