class FileManager

Attributes

vfs[R]

Public Class Methods

new(branch) click to toggle source
# File lib/file_manager.rb, line 13
def initialize(branch)
  @branch = branch
  @vfs = VirtualFileSystem.new()
end

Public Instance Methods

apply!(commits, meta) click to toggle source
# File lib/file_manager.rb, line 18
def apply!(commits, meta)
  vfs.load!(commits, meta)
    .each do |commit|
      # TODO: Won't work for first commit...
      coverage = meta[:coverage].get_report(commit.id, @vfs.file_paths)
      errors = meta[:errors]&.get_errors!(commit) || []
      apply_commit!(commit, errors, coverage)
      Cache.index_commit(@branch, commit.id)
    end
end

Private Instance Methods

apply_commit!(commit, errors, coverage) click to toggle source
# File lib/file_manager.rb, line 31
def apply_commit!(commit, errors, coverage)
  Loggr.instance.info("APPLY COMMIT: #{commit.id}")

  movements = extract_changes(commit.movements)
  changes = extract_changes(commit.changes)

  commit.trees.each { |diff_tree| @vfs.touch_tree(diff_tree, commit) }

  files = commit
    .file_diffs
    .map { |file_name, file_diff| apply_file_diff!(commit, file_diff) }

  changes.each(&method(:merge_change!))
  movements.each(&method(:merge_movement!))

  merge_coverage!(coverage) if not coverage.nil?
  errors.each { |error| apply_error!(error) }

  @vfs.save(commit)
  files.each(&:save)
end
apply_error!(error) click to toggle source
# File lib/file_manager.rb, line 60
def apply_error!(error)
  error[:stack_trace].each_with_index do |trace, i|
    file = trace_file(trace[:file])
    if file.nil?
      Loggr.instance.error("Trace Not Found: #{trace[:file]}:#{trace[:line]} - #{trace[:message]}")
    else
      file.merge_error!(error, trace, i) if not file.nil?
    end
  end
rescue
  Loggr.instance.error("CANNOT APPLLY ERROR: #{error[:error_id]}")
end
apply_file_diff!(commit, file_diff) click to toggle source
# File lib/file_manager.rb, line 53
def apply_file_diff!(commit, file_diff)
  file = @vfs.file_for_diff(commit, file_diff)
  file.apply_file_diff!(commit, file_diff)
  compare(commit, file.path, file.plain_text(), nil, nil) if compare?(file)
  file
end
compare?(file) click to toggle source
# File lib/file_manager.rb, line 113
def compare?(file)
  ENV["GITOLEMY_COMPARE"] == "true" && !file.binary?
end
extract_changes(changes) click to toggle source
# File lib/file_manager.rb, line 73
def extract_changes(changes)
  changes.reduce({}) do |acc, (dest_file, changes)|
    changes.each do |dest_line, change|
      acc[dest_file] ||= {}
      acc[dest_file][dest_line] = @vfs[change[:from]].lines[change[:line]]
    end
    acc
  end
end
merge_change!(file, file_line_changes) click to toggle source
# File lib/file_manager.rb, line 83
def merge_change!(file, file_line_changes)
  file_line_changes.each do |(line_number, line_change)|
    @vfs[file].change_line!(line_change, line_number)
  end
end
merge_coverage!(coverage) click to toggle source

TODO: Technically, file lines aren't covered. Lines at commits are.

1: To avoid ambiguity, maybe only view trees by commit.
# File lib/file_manager.rb, line 97
def merge_coverage!(coverage)
  coverage.each do |file, file_coverage|
    begin
      @vfs[file].merge_coverage!(file_coverage)
      @vfs[file].save()
    rescue => ex
      Loggr.instance.error("Coverage File Not Found: #{file}")
    end
  end
end
merge_movement!(file, file_line_movements) click to toggle source
# File lib/file_manager.rb, line 89
def merge_movement!(file, file_line_movements)
  file_line_movements.each do |(line_number, line_movement)|
    @vfs[file].move_line!(line_movement, line_number)
  end
end
trace_file(trace_file) click to toggle source
# File lib/file_manager.rb, line 108
def trace_file(trace_file)
  match = @vfs.file_paths.detect { |app_file| trace_file.include?(app_file) }
  match.nil? ? nil : @vfs[match]
end