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.



236
237
238
239
240
# File 'lib/rjgit.rb', line 236

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

Instance Attribute Details

#logObject (readonly)

Returns the value of attribute log.



234
235
236
# File 'lib/rjgit.rb', line 234

def log
  @log
end

#treemapObject

Returns the value of attribute treemap.



233
234
235
# File 'lib/rjgit.rb', line 233

def treemap
  @treemap
end

Instance Method Details

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



261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/rjgit.rb', line 261

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



246
247
248
# File 'lib/rjgit.rb', line 246

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

#object_inserterObject



242
243
244
# File 'lib/rjgit.rb', line 242

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

#only_contains_deletions(hashmap) ⇒ Object



250
251
252
253
254
255
256
257
258
259
# File 'lib/rjgit.rb', line 250

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



306
307
308
309
310
# File 'lib/rjgit.rb', line 306

def write_blob(contents, flush = false)
  blobid = object_inserter.insert(Constants::OBJ_BLOB, contents.to_java_bytes)
  object_inserter.flush if flush
  blobid
end