class RepositoryMerger::CommitHistoryMerger

Attributes

commit_message_conversion[R]
configuration[R]
monorepo_head_commit[R]
original_references[R]
progress_title[R]
wants_to_abort[RW]

Public Class Methods

new(references, configuration:, commit_message_conversion: nil, progress_title: nil) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 10
def initialize(references, configuration:, commit_message_conversion: nil, progress_title: nil)
  @original_references = references
  @configuration = configuration
  @commit_message_conversion = commit_message_conversion
  @progress_title = progress_title
end

Public Instance Methods

run() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 17
def run
  logger.verbose("Importing commits from #{original_references.map { |ref| "#{ref.name} (#{ref.repo.name})" }.join(', ')}", title: true)
  logger.start_tracking_progress_for('commits', total: unprocessed_original_commit_queue.size, title: progress_title)

  while (original_commit = unprocessed_original_commit_queue.next)
    process_commit(original_commit)
    break if wants_to_abort
  end

  monorepo_head_commit
ensure
  repo_commit_map.merge!(branch_local_commit_map)
  repo_commit_map.save if repo_commit_map.path
end

Private Instance Methods

already_imported_monorepo_commit_for(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 58
def already_imported_monorepo_commit_for(original_commit)
  monorepo_commits = repo_commit_map.monorepo_commits_for(original_commit)

  monorepo_commits.find do |monorepo_commit|
    monorepo_commit.parents == parent_commits_in_monorepo_for(original_commit)
  end
end
branch_local_commit_map() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 122
def branch_local_commit_map
  @branch_local_commit_map ||= BranchLocalCommitMap.new(monorepo: monorepo)
end
commit_message_from(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 96
def commit_message_from(original_commit)
  if commit_message_conversion
    commit_message_conversion.call(original_commit)
  else
    original_commit.message
  end
end
import_commit_into_monorepo(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 66
def import_commit_into_monorepo(original_commit)
  parent_commits_in_monorepo = parent_commits_in_monorepo_for(original_commit)

  monorepo.import_commit(
    original_commit,
    new_parents: parent_commits_in_monorepo,
    subdirectory: original_commit.repo.name,
    message: commit_message_from(original_commit)
  )
end
logger() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 126
def logger
  configuration.logger
end
mainline?(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 91
def mainline?(original_commit)
  original_reference = original_references_by_repo[original_commit.repo]
  original_reference.mainline?(original_commit)
end
monorepo() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 114
def monorepo
  configuration.monorepo
end
original_references_by_repo() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 108
def original_references_by_repo
  @original_references_by_repo ||= original_references.each_with_object({}) do |original_reference, hash|
    hash[original_reference.repo] = original_reference
  end
end
parent_commits_in_monorepo_for(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 77
def parent_commits_in_monorepo_for(original_commit)
  if original_commit.root?
    return [monorepo_head_commit].compact
  end

  original_commit.parents.map do |original_parent_commit|
    if mainline?(original_commit) && mainline?(original_parent_commit)
      monorepo_head_commit
    else
      branch_local_commit_map.monorepo_commit_for(original_parent_commit)
    end
  end
end
process_commit(original_commit) click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 36
def process_commit(original_commit)
  logger.verbose "  #{original_commit.commit_time} [#{original_commit.repo.name}] #{original_commit.message.each_line.first}"

  if (monorepo_commit = already_imported_monorepo_commit_for(original_commit))
    logger.verbose "    Already imported as #{monorepo_commit.abbreviated_id}. Skipping."
  else
    monorepo_commit = import_commit_into_monorepo(original_commit)
    logger.verbose "    Created commit #{monorepo_commit.abbreviated_id}."
  end

  branch_local_commit_map.register(
    monorepo_commit: monorepo_commit,
    original_commit: original_commit
  )

  if mainline?(original_commit)
    @monorepo_head_commit = monorepo_commit
  end

  logger.increment_progress
end
repo_commit_map() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 118
def repo_commit_map
  configuration.repo_commit_map
end
unprocessed_original_commit_queue() click to toggle source
# File lib/repository_merger/commit_history_merger.rb, line 104
def unprocessed_original_commit_queue
  @unprocessed_original_commit_queue ||= OriginalCommitQueue.new(original_references)
end