Parent

Files

RSCM::MonotoneLogParser

Public Instance Methods

parse_revision(revision_io, path_revisions) click to toggle source
# File lib/rscm/scm/monotone_log_parser.rb, line 49
def parse_revision(revision_io, path_revisions)
  revision = Revision.new
  state = nil
  revision_io.each_line do |line|
    if(line =~ /^Revision: (.*)$/ && revision.identifier.nil?)
      revision.identifier =  $1
    elsif(line =~ /^Author: (.*)$/ && revision.developer.nil?)
      revision.developer = $1
    elsif(line =~ /^Date: (.*)$/ && revision.time.nil?)
      revision.time = Time.utc(
        $1[0..3].to_i,
        $1[5..6].to_i,
        $1[8..9].to_i,
        $1[11..12].to_i,
        $1[14..15].to_i,
        $1[17..18].to_i
      )
    elsif(line =~ /^ChangeLog:\s*$/ && revision.message.nil?)
      state = :message
    elsif(state == :message && revision.message.nil?)
      revision.message = ""
    elsif(state == :message && revision.message)
      revision.message << line
    elsif(line =~ /^Added files:\s*$/)
      state = :added
    elsif(state == :added)
      add_changes(revision, line, RevisionFile::ADDED, path_revisions)
    elsif(line =~ /^Modified files:\s*$/)
      state = :modified
    elsif(state == :modified)
      add_changes(revision, line, RevisionFile::MODIFIED, path_revisions)
    end
  end
  revision.message.chomp! rescue revision.message = ''
  revision
end
parse_revisions(io, from_identifier=Time.epoch, to_identifier=Time.infinity) click to toggle source
# File lib/rscm/scm/monotone_log_parser.rb, line 9
def parse_revisions(io, from_identifier=Time.epoch, to_identifier=Time.infinity)
  # skip first separator

  io.readline
  
  all_revisions = []
  revision_string = ""
  
  # hash of path => [array of revisions]

  path_revisions = {}
  io.each_line do |line|
    if(line =~ /-----------------------------------------------------------------/)
      revision = parse_revision(StringIO.new(revision_string), path_revisions)
      all_revisions << revision
      revision_string = ""
    else
      revision_string << line
    end
  end
  revision = parse_revision(StringIO.new(revision_string), path_revisions)
  all_revisions << revision
  
  # Filter out the revisions and set the previous revisions, knowing that most recent is at index 0.


  from_time = time(all_revisions, from_identifier, Time.epoch)
  to_time = time(all_revisions, to_identifier, Time.infinity)

  revisions = Revisions.new

  all_revisions.each do |revision|
    if((from_time < revision.time) && (revision.time <= to_time))
      revisions.add(revision)
      revision.each do |change|
        current_index = path_revisions[change.path].index(change.native_revision_identifier)
        change.previous_native_revision_identifier = path_revisions[change.path][current_index + 1]
      end
    end
  end
  revisions
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.