diff options
-rwxr-xr-x | history.rb | 6 | ||||
-rw-r--r-- | log.rb | 54 | ||||
-rw-r--r-- | poll.rb | 6 |
3 files changed, 42 insertions, 24 deletions
@@ -63,9 +63,9 @@ $html << table.to_html("",false) $html << "<h2>History</h2>" $html << "<div id='history'>" -historyselect = $cgi.include?("history") ? $cgi["history"] : nil -$html << table.history_selectform($cgi.include?("revision") ? nil : revno, historyselect) -$html << table.history_to_html(revno, historyselect) +$html << table.history_selectform($cgi.include?("revision") ? nil : revno, $cgi["history"]) + +$html << table.history_to_html(revno, $cgi["history"]) $html << "</div>" $html << "</div></body>" @@ -57,22 +57,33 @@ class Log } ret end + def revisions + @log.collect{|e| e.rev } + end def [](revision) - if revision.class == Fixnum - @log.each{|l| - return l if l.rev == revision - } - raise "No such revision found #{revision}" - else - min_r, max_r = "","" - @log.each_with_index{|l,i| - min_r = i if l.rev == revision.min - max_r = i if l.rev == revision.max - } - min_r = @log.index(min) if min_r == "" - max_r = @log.index(max) if max_r == "" - return Log.new(@log[min_r..max_r]) + i = revisions.index(revision) + if i + return @log[i] + else # no revision found, search the nearest + dist = revisions.collect{|e| (e - revision).abs }.sort[0] + i = revisions.index(revision + dist) || revisions.index(revision - dist) + return @log[i] + end + end + def around_rev(rev,number) + ret = [self[rev]] + midindex = @log.index(ret[0]) + counter = 1 + while ret.size < number && counter < @log.size + ret << @log[midindex + counter] + counter *= -1 if counter <= midindex + if counter > 0 + counter += 1 + end + ret.compact! end + ret.sort!{|a,b| a.rev <=> b.rev} + Log.new(ret) end def add(revision,timestamp,comment) @log << LogEntry.new(revision,timestamp,comment) @@ -135,10 +146,17 @@ require "test/unit" assert_equal(19,l.max.rev) assert_equal("baz 10",l[10].comment) - p = l[9..11] - assert_equal([9,10,11],[p[9].rev,p[10].rev,p[11].rev]) - - assert_equal([10],l.comment_matches(/^baz \d*$/).collect{|e| e.rev}) + assert_equal([10],l.comment_matches(/^baz \d*$/).revisions) + + [42,23].each{|i| + l.add(i,Time.now,"foo #{i}") + } + assert_equal(l[42],l[37]) + + assert_equal([16,17,18,19,23,42],l.around_rev(23,6).revisions) + assert_equal([0,1,2,3,4,5,6,7,8,9,10,11],l.around_rev(2,12).revisions) + assert_equal(l.revisions,l.around_rev(0,99).revisions) + end end end @@ -234,7 +234,7 @@ ADDCOMMENT <div> <select name='history'> FORM - ["comments","participants","columns"].each{|opt| + ["", "comments","participants","columns"].each{|opt| ret += "<option value='#{opt}' #{selected == opt ? "selected='selected'" : ""} >#{opt}</option>" } ret += "<input type='hidden' name='revision' value='#{revision}' />" if revision @@ -249,7 +249,7 @@ FORM def history_to_html(middlerevision,only) log = VCS.history - if only + if only != "" case only when "comments" match = /^Comment .*$/ @@ -262,7 +262,7 @@ FORM end log = log.comment_matches(match) end - log[((middlerevision-5)..(middlerevision+5))].to_html(middlerevision) + log.around_rev(middlerevision,11).to_html(middlerevision) end def add_participant(olduser, name, agreed) |