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