Class | RSCM::MonotoneLogParser |
In: |
lib/rscm/scm/monotone_log_parser.rb
|
Parent: | Object |
# File lib/rscm/scm/monotone_log_parser.rb, line 49 49: def parse_revision(revision_io, path_revisions) 50: revision = Revision.new 51: state = nil 52: revision_io.each_line do |line| 53: if(line =~ /^Revision: (.*)$/ && revision.identifier.nil?) 54: revision.identifier = $1 55: elsif(line =~ /^Author: (.*)$/ && revision.developer.nil?) 56: revision.developer = $1 57: elsif(line =~ /^Date: (.*)$/ && revision.time.nil?) 58: revision.time = Time.utc( 59: $1[0..3].to_i, 60: $1[5..6].to_i, 61: $1[8..9].to_i, 62: $1[11..12].to_i, 63: $1[14..15].to_i, 64: $1[17..18].to_i 65: ) 66: elsif(line =~ /^ChangeLog:\s*$/ && revision.message.nil?) 67: state = :message 68: elsif(state == :message && revision.message.nil?) 69: revision.message = "" 70: elsif(state == :message && revision.message) 71: revision.message << line 72: elsif(line =~ /^Added files:\s*$/) 73: state = :added 74: elsif(state == :added) 75: add_changes(revision, line, RevisionFile::ADDED, path_revisions) 76: elsif(line =~ /^Modified files:\s*$/) 77: state = :modified 78: elsif(state == :modified) 79: add_changes(revision, line, RevisionFile::MODIFIED, path_revisions) 80: end 81: end 82: revision.message.chomp! rescue revision.message = '' 83: revision 84: end
# File lib/rscm/scm/monotone_log_parser.rb, line 9 9: def parse_revisions(io, from_identifier=Time.epoch, to_identifier=Time.infinity) 10: # skip first separator 11: io.readline 12: 13: all_revisions = [] 14: revision_string = "" 15: 16: # hash of path => [array of revisions] 17: path_revisions = {} 18: io.each_line do |line| 19: if(line =~ /-----------------------------------------------------------------/) 20: revision = parse_revision(StringIO.new(revision_string), path_revisions) 21: all_revisions << revision 22: revision_string = "" 23: else 24: revision_string << line 25: end 26: end 27: revision = parse_revision(StringIO.new(revision_string), path_revisions) 28: all_revisions << revision 29: 30: # Filter out the revisions and set the previous revisions, knowing that most recent is at index 0. 31: 32: from_time = time(all_revisions, from_identifier, Time.epoch) 33: to_time = time(all_revisions, to_identifier, Time.infinity) 34: 35: revisions = Revisions.new 36: 37: all_revisions.each do |revision| 38: if((from_time < revision.time) && (revision.time <= to_time)) 39: revisions.add(revision) 40: revision.each do |change| 41: current_index = path_revisions[change.path].index(change.native_revision_identifier) 42: change.previous_native_revision_identifier = path_revisions[change.path][current_index + 1] 43: end 44: end 45: end 46: revisions 47: end