class RJGit::Plumbing::Index

Attributes

current_tree[RW]
jrepo[R]
treemap[RW]

Public Class Methods

new(repository) click to toggle source
# File lib/rjgit.rb, line 343
def initialize(repository)
  @treemap = {}
  @jrepo = RJGit.repository_type(repository)
  @treebuilder = TreeBuilder.new(@jrepo)
end
successful?(result) click to toggle source
# File lib/rjgit.rb, line 422
def self.successful?(result)
  ["NEW", "FAST_FORWARD", "FORCED"].include?(result)
end

Public Instance Methods

add(path, data) click to toggle source
# File lib/rjgit.rb, line 349
def add(path, data)
  path = path[1..-1] if path[0] == '/'
  path = path.split('/')
  filename = path.pop

  current = self.treemap

  path.each do |dir|
    current[dir] ||= {}
    node = current[dir]
    current = node
  end

  current[filename] = data
  @treemap
end
commit(message, author, parents = nil, ref = "refs/heads/ click to toggle source
# File lib/rjgit.rb, line 400
def commit(message, author, parents = nil, ref = "refs/heads/#{Constants::MASTER}", force = false)
  new_tree = build_new_tree(@treemap, "#{ref}^{tree}")
  return false if @current_tree && new_tree.name == @current_tree.name

  parents = parents ? parents : @jrepo.resolve(ref+"^{commit}")
  new_head = do_commit(message, author, parents, new_tree)

  # Point ref to the newest commit
  ru = @jrepo.updateRef(ref)
  ru.setNewObjectId(new_head)
  ru.setForceUpdate(force)
  ru.setRefLogIdent(author.person_ident)
  ru.setRefLogMessage("commit: #{message}", false)
  res = ru.update.to_string

  @current_tree = new_tree
  log = @treebuilder.log
  @treebuilder.init_log
  sha =  ObjectId.to_string(new_head)
  return res, log, sha
end
delete(path) click to toggle source
# File lib/rjgit.rb, line 366
def delete(path)
  path = path[1..-1] if path[0] == '/'
  path = path.split('/')
  last = path.pop

  current = self.treemap

  path.each do |dir|
    current[dir] ||= {}
    node = current[dir]
    current = node
  end

  current[last] = false
  @treemap
end
do_commit(message, author, parents, new_tree) click to toggle source
# File lib/rjgit.rb, line 383
def do_commit(message, author, parents, new_tree)
  commit_builder = CommitBuilder.new
  person = author.person_ident
  commit_builder.setCommitter(person)
  commit_builder.setAuthor(person)
  commit_builder.setMessage(message)
  commit_builder.setTreeId(RJGit.tree_type(new_tree))
  if parents.is_a?(Array)
    parents.each {|parent| commit_builder.addParentId(RJGit.commit_type(parent)) }
  elsif parents
    commit_builder.addParentId(RJGit.commit_type(parents))
  end
  result = @treebuilder.object_inserter.insert(commit_builder)
  @treebuilder.object_inserter.flush
  result
end

Private Instance Methods

build_new_tree(treemap, ref) click to toggle source
# File lib/rjgit.rb, line 428
def build_new_tree(treemap, ref)
  @treebuilder.treemap = treemap
  new_tree = @treebuilder.build_tree(@current_tree ? RJGit.tree_type(@current_tree) : @jrepo.resolve(ref))
end