class Svnx::Diff::Parser
Public Instance Methods
parse_all_output(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 95 def parse_all_output lines Array.new.tap do |diffs| until lines.empty? if filediff = parse_file_diff(lines) diffs << filediff else break end end end end
parse_file_diff(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 79 def parse_file_diff lines if header = parse_header_section(lines) SvnFileDiff.new(header).tap do |diff| if header.from && header.to while !lines.empty? if hunk = parse_hunk(lines) diff.hunks << hunk else break end end end end end end
parse_header_file(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 11 def parse_header_file lines re = Regexp.new '^[\-\+]{3} (.*)\t\((?:nonexistent|working copy|revision (\d+))\)' if md = re.match(lines.first) lines.shift File.new filename: md[1], revision: md[2] && md[2].to_i end end
parse_header_section(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 19 def parse_header_section lines re = Regexp.new '^Index: (.*)' if md = re.match(lines.first) filename = md[1] lines.shift # discard the ==== line: lines.shift from = parse_header_file lines to = parse_header_file lines Header.new filename: filename, from: from, to: to end end
parse_hunk(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 48 def parse_hunk lines if ranges = parse_ranges(lines) Hunk.new(ranges, Array.new).tap do |hunk| char_to_type = { ' ' => :context, '+' => :added, '-' => :deleted } while !lines.empty? if lines.first == "\\ No newline at end of file" hunk.lines << [ :context, :no_newline ] lines.shift elsif type = char_to_type[lines.first[0]] hunk.lines << [ type, lines.shift[1 .. -1] ] else break end end end end end
parse_hunks(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 67 def parse_hunks lines Array.new.tap do |hunks| while !lines.empty? if hunk = parse_hunk(lines) hunks << hunk else break end end end end
parse_ranges(lines)
click to toggle source
# File lib/svnx/diff/parser.rb, line 35 def parse_ranges lines range_re = Regexp.new '@@ \-(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@' if md = range_re.match(lines.first) lines.shift from, to = [ 1, 3 ].collect do |idx| HunkRange.new md[idx].to_i, (md[idx + 1] || 1).to_i end HunkRanges.new from, to end end