class RSCM::SubversionLogEntryParser
Constants
- STATES
Public Class Methods
new(url, path=nil)
click to toggle source
Calls superclass method
RSCM::Parser.new
# File lib/rscm/scm/subversion_log_parser.rb, line 49 def initialize(url, path=nil) super(/^------------------------------------------------------------------------/) @url = url @path = path end
Public Instance Methods
parse(io, skip_line_parsing=false, &line_proc)
click to toggle source
Calls superclass method
RSCM::Parser#parse
# File lib/rscm/scm/subversion_log_parser.rb, line 55 def parse(io, skip_line_parsing=false, &line_proc) # We have to trim off the last newline - it's not meant to be part of the message revision = super revision.message = revision.message[0..-2] if revision revision end
relative_path(url, path_from_root)
click to toggle source
# File lib/rscm/scm/subversion_log_parser.rb, line 62 def relative_path(url, path_from_root) path_from_root = path_from_root.chomp url_tokens = url.split('/') path_from_root_tokens = path_from_root.split('/') max_similar = path_from_root_tokens.length while(max_similar > 0) url = url_tokens[-max_similar..-1] path = path_from_root_tokens[0..max_similar-1] if(url == path) break end max_similar -= 1 end if(max_similar == 0) if(@path.nil? || @path == "") path_from_root else nil end else path_from_root_tokens[max_similar..-1].join("/") end end
Protected Instance Methods
next_result()
click to toggle source
# File lib/rscm/scm/subversion_log_parser.rb, line 117 def next_result result = @revision @revision = nil result end
parse_line(line)
click to toggle source
# File lib/rscm/scm/subversion_log_parser.rb, line 90 def parse_line(line) if(@revision.nil?) parse_header(line) elsif(line.strip == "") @parse_state = :parse_message elsif(line =~ /Changed paths/) @parse_state = :parse_files elsif(@parse_state == :parse_files) file = parse_file(line) if(file && file.path) previously_added_file = @revision[-1] if(previously_added_file) # remove previous revision_file if it's a dir previous_tokens = previously_added_file.path.split("/") current_tokens = file.path.split("/") current_tokens.pop if(previous_tokens == current_tokens) @revision.pop end end @revision.add file end elsif(@parse_state == :parse_message) @revision.message << line.chomp << "\n" end end
Private Instance Methods
parse_file(line)
click to toggle source
# File lib/rscm/scm/subversion_log_parser.rb, line 138 def parse_file(line) file = RevisionFile.new path_from_root = nil if(line =~ /^ [M|A|D|R] ([^\s]+) \(from (.*)\)/) path_from_root = $1 file.status = RevisionFile::MOVED elsif(line =~ /^ ([M|A|D|R]) (.+)$/) status = $1 path_from_root = $2 file.status = STATES[status] else raise "could not parse file line: '#{line}'" end path_from_root.gsub!(/\/, "/") path_from_root = path_from_root[1..-1] rp = relative_path(@url, path_from_root) return if rp.nil? file.path = rp file.native_revision_identifier = @revision.identifier # http://jira.codehaus.org/browse/DC-204 file.previous_native_revision_identifier = file.native_revision_identifier.to_i - 1; file end
parse_header(line)
click to toggle source
# File lib/rscm/scm/subversion_log_parser.rb, line 127 def parse_header(line) @revision = Revision.new @revision.message = "" revision, developer, time, the_rest = line.split("|") @revision.identifier = revision.strip[1..-1].to_i unless revision.nil? developer.strip! @revision.developer = developer unless developer.nil? || developer == "(no author)" time.strip! @revision.time = Time.parse(time).utc unless time.nil? || time == "(no date)" end