Support for more general diffing and retrieving any old revision.
Support for index formatting with local refs.
diff --git a/Tools/faqwiz/faqconf.py b/Tools/faqwiz/faqconf.py
index 6013e3f..9c6048e 100644
--- a/Tools/faqwiz/faqconf.py
+++ b/Tools/faqwiz/faqconf.py
@@ -77,6 +77,7 @@
 SH_RLOG = RCSBINDIR + "rlog %(file)s </dev/null 2>&1"
 SH_RLOG_H = RCSBINDIR + "rlog -h %(file)s </dev/null 2>&1"
 SH_RDIFF = RCSBINDIR + "rcsdiff -r%(prev)s -r%(rev)s %(file)s </dev/null 2>&1"
+SH_REVISION = RCSBINDIR + "co -p%(rev)s %(file)s </dev/null 2>&1"
 SH_LOCK = RCSBINDIR + "rcs -l %(file)s </dev/null 2>&1"
 SH_CHECKIN =  RCSBINDIR + "ci -u %(file)s <%(tfn)s 2>&1"
 
@@ -91,6 +92,7 @@
 T_RECENT = "What's New in the " + FAQNAME
 T_SHOW = FAQNAME + " Entry"
 T_LOG = "RCS log for %s entry" % FAQNAME
+T_REVISION = "RCS revision for %s entry" % FAQNAME
 T_DIFF = "RCS diff for %s entry" % FAQNAME
 T_ADD = "Add an entry to the " + FAQNAME
 T_DELETE = "Deleting an entry from the " + FAQNAME
@@ -142,7 +144,7 @@
 	/
     <INPUT TYPE=radio NAME=querytype VALUE=regex>
         Regular expression
-	/
+	/<BR>
     <INPUT TYPE=radio NAME=querytype VALUE=anykeywords>
         Keywords (any)
 	/
@@ -197,11 +199,15 @@
 <LI><A HREF="%(FAQCGI)s?req=show&amp;file=%(file)s">%(title)s</A>
 """
 
+LOCAL_ENTRY = """\
+<LI><A HREF="#%(sec)s.%(num)s">%(title)s</A>
+"""
+
 # Entry formatting
 
 ENTRY_HEADER = """
 <HR>
-<H2>%(title)s</H2>
+<H2><A NAME="%(sec)s.%(num)s">%(title)s</A></H2>
 """
 
 ENTRY_FOOTER = """
@@ -240,8 +246,14 @@
 previous one.
 """
 
+REVISIONLINK = """\
+<A HREF="%(FAQCGI)s?req=revision&amp;file=%(file)s&amp;rev=%(rev)s"
+>%(line)s</A>\
+"""
 DIFFLINK = """\
-<A HREF="%(FAQCGI)s?req=diff&amp;file=%(file)s&amp;rev=%(rev)s">%(line)s</A>
+ (<A HREF="%(FAQCGI)s?req=diff&amp;file=%(file)s&amp;\
+prev=%(prev)s&amp;rev=%(rev)s"
+>diff -r%(prev)s -r%(rev)s</A>)\
 """
 
 # Recently changed entries
diff --git a/Tools/faqwiz/faqwiz.py b/Tools/faqwiz/faqwiz.py
index 17a79d6..2b269c2 100644
--- a/Tools/faqwiz/faqwiz.py
+++ b/Tools/faqwiz/faqwiz.py
@@ -110,6 +110,18 @@
 	emphasize_prog = regex.compile(pat)
     return regsub.gsub(emphasize_prog, '<I>\\1</I>', line)
 
+revparse_prog = None
+
+def revparse(rev):
+    global revparse_prog
+    if not revparse_prog:
+	revparse_prog = regex.compile(
+	    '^\([1-9][0-9]?[0-9]?\)\.\([1-9][0-9]?[0-9]?[0-9]?\)$')
+    if revparse_prog.match(rev) < 0:
+	return None
+    [major, minor] = map(string.atoi, revparse_prog.group(1, 2))
+    return major, minor
+
 def load_cookies():
     if not os.environ.has_key('HTTP_COOKIE'):
 	return {}
@@ -440,12 +452,14 @@
 	self.prologue(T_ALL)
 	files = self.dir.list()
 	self.last_changed(files)
+	self.format_index(files, localrefs=1)
 	self.format_all(files)
 
     def do_compat(self):
 	files = self.dir.list()
 	emit(COMPAT)
 	self.last_changed(files)
+	self.format_index(files, localrefs=1)
 	self.format_all(files, edit=0)
 	sys.exit(0)
 
@@ -483,7 +497,7 @@
 	self.prologue(T_INDEX)
 	self.format_index(self.dir.list(), add=1)
 
-    def format_index(self, files, add=0):
+    def format_index(self, files, add=0, localrefs=0):
 	sec = 0
 	for file in files:
 	    try:
@@ -501,7 +515,10 @@
 		except KeyError:
 		    title = "Untitled"
 		emit(INDEX_SECTION, sec=sec, title=title)
-	    emit(INDEX_ENTRY, entry)
+	    if localrefs:
+		emit(LOCAL_ENTRY, entry)
+	    else:
+		emit(INDEX_ENTRY, entry)
 	if sec:
 	    if add:
 		emit(INDEX_ADDSECTION, sec=sec)
@@ -587,13 +604,23 @@
 	    if line[:1] == '=' and len(line) >= 40 and \
 	       line == line[0]*len(line):
 		del lines[-1]
+	headrev = None
 	for line in lines:
 	    if entry and athead and line[:9] == 'revision ':
 		rev = string.strip(line[9:])
-		if rev != '1.1':
-		    emit(DIFFLINK, entry, rev=rev, line=line)
-		else:
+		mami = revparse(rev)
+		if not mami:
 		    print line
+		else:
+		    emit(REVISIONLINK, entry, rev=rev, line=line)
+		    if mami[1] > 1:
+			prev = "%d.%d" % (mami[0], mami[1]-1)
+			emit(DIFFLINK, entry, prev=prev, rev=rev)
+		    if headrev:
+			emit(DIFFLINK, entry, prev=rev, rev=headrev)
+		    else:
+			headrev = rev
+		    print
 		athead = 0
 	    else:
 		athead = 0
@@ -605,18 +632,27 @@
 		    print line
 	print '</PRE>'
 
-    def do_diff(self):
+    def do_revision(self):
 	entry = self.dir.open(self.ui.file)
 	rev = self.ui.rev
-	r = regex.compile(
-	    '^\([1-9][0-9]?[0-9]?\)\.\([1-9][0-9]?[0-9]?[0-9]?\)$')
-	if r.match(rev) < 0:
+	mami = revparse(rev)
+	if not mami:
 	    self.error("Invalid revision number: %s." % `rev`)
-	[major, minor] = map(string.atoi, r.group(1, 2))
-	if minor == 1:
-	    self.error("No previous revision.")
-	    return
-	prev = '%d.%d' % (major, minor-1)
+	self.prologue(T_REVISION, entry)
+	self.shell(interpolate(SH_REVISION, entry, rev=rev))
+
+    def do_diff(self):
+	entry = self.dir.open(self.ui.file)
+	prev = self.ui.prev
+	rev = self.ui.rev
+	mami = revparse(rev)
+	if not mami:
+	    self.error("Invalid revision number: %s." % `rev`)
+	if prev:
+	    if not revparse(prev):
+		self.error("Invalid previous revision number: %s." % `prev`)
+	else:
+	    prev = '%d.%d' % (mami[0], mami[1])
 	self.prologue(T_DIFF, entry)
 	self.shell(interpolate(SH_RDIFF, entry, rev=rev, prev=prev))