require 'rscm/time_ext' require 'rscm/revision_file' module RSCM # A Revisions object is a collection of Revision objects with some # additional behaviour. # # Most importantly, it provides logic to group individual RevisionFile # objects into Revision objects internally. This means that implementors # of RSCM adapters that don't support atomic changesets can still emulate # them, simply by adding RevisionFile objects to a Revisions object. Example: # # revisions = Revisions.new # revisions.add revision_file_1 # revisions.add revision_file_2 # revisions.add revision_file_3 # # The added RevisionFile objects will end up in Revision objects grouped by # their comment, developer and timestamp. A set of RevisionFile object with # identical developer and message will end up in the same Revision provided # their time attributes are a minute apart or less. # # Each Revisions object also has an attribute cmd which should contain # the command used to retrieve the revision data and populate it. This is useful # for debugging an RSCM adapter that might behaving incorrectly. Keep in mind that # it is the responsibility of each RSCM adapter implementation to set this attribute, # and that it should omit setting it if the store_revisions_command is # true class Revisions include Enumerable attr_accessor :cmd def initialize(revisions=[]) @revisions = revisions end def add(file_or_revision) if(file_or_revision.is_a?(Revision)) @revisions << file_or_revision else revision = find { |a_revision| a_revision.accept?(file_or_revision) } if(revision.nil?) revision = Revision.new @revisions << revision end revision.add file_or_revision end end def sort! @revisions.sort!{|r1,r2| r1.time<=>r2.time} end def to_s @revisions.collect{|revision| revision.to_s}.join("\n-----------") end def ==(other) self.to_s == other.to_s end def each(&block) @revisions.each(&block) end def [](n) @revisions[n] end def length @revisions.length end def empty? @revisions.empty? end end end