aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xhistory.rb6
-rw-r--r--log.rb54
-rw-r--r--poll.rb6
3 files changed, 42 insertions, 24 deletions
diff --git a/history.rb b/history.rb
index 46ab5ec..a425d91 100755
--- a/history.rb
+++ b/history.rb
@@ -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>"
diff --git a/log.rb b/log.rb
index dd817ef..afcf6c4 100644
--- a/log.rb
+++ b/log.rb
@@ -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
diff --git a/poll.rb b/poll.rb
index 03980b6..8da05aa 100644
--- a/poll.rb
+++ b/poll.rb
@@ -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)