class Gitdocs::Repository::Committer

Public Class Methods

new(root_dirname) click to toggle source

@raise if the repository is not valid for commits

# File lib/gitdocs/repository/committer.rb, line 5
def initialize(root_dirname)
  @root_dirname        = root_dirname
  @rugged              = Rugged::Repository.new(root_dirname)
  @grit                = Grit::Repo.new(root_dirname)
  @commit_message_path = File.expand_path('.gitmessage~', root_dirname)
rescue Rugged::OSError
  raise(Gitdocs::Repository::InvalidError, 'No directory')
rescue Rugged::RepositoryError
  raise(Gitdocs::Repository::InvalidError, 'Not a repository')
end

Public Instance Methods

commit() click to toggle source

@return [Boolean]

# File lib/gitdocs/repository/committer.rb, line 17
def commit
  # Do this first to allow the message file to be deleted, if it exists.
  message = read_and_delete_commit_message_file

  mark_empty_directories

  # FIXME: Consider a more appropriate location for the dirty check.
  return false unless Gitdocs::Repository.new(@root_dirname).dirty?
  Gitdocs.log_debug("Repo #{@root_dirname} is dirty")

  # Commit any changes in the working directory.
  Dir.chdir(@root_dirname) do
    @rugged.index.add_all
    @rugged.index.update_all
  end
  @rugged.index.write
  Gitdocs.log_debug("Index to be committed #{@rugged.index}")

  commit_result = @grit.commit_index(message)
  Gitdocs.log_debug("Commit result: <#{commit_result.inspect}>")

  true
end
write_commit_message(message) click to toggle source

@param [String] message @return [void]

# File lib/gitdocs/repository/committer.rb, line 43
def write_commit_message(message)
  return unless message
  return if message.empty?

  File.open(@commit_message_path, 'w') { |f| f.print(message) }
end

Private Instance Methods

mark_empty_directories() click to toggle source
# File lib/gitdocs/repository/committer.rb, line 54
def mark_empty_directories
  Find.find(@root_dirname).each do |path|
    Find.prune if File.basename(path) == '.git'
    if File.directory?(path) && Dir.entries(path).count == 2
      FileUtils.touch(File.join(path, '.gitignore'))
    end
  end
end
read_and_delete_commit_message_file() click to toggle source

@return [String] either the message in the file, or the regular

automatic commit message.
# File lib/gitdocs/repository/committer.rb, line 65
def read_and_delete_commit_message_file
  return(
    'Auto-commit from gitdocs'
  ) unless File.exist?(@commit_message_path)

  message = File.read(@commit_message_path)
  File.delete(@commit_message_path)
  message
end