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