File viewvc-buglink.patch of Package viewvc.575

--- conf/viewvc.conf.dist
+++ conf/viewvc.conf.dist
@@ -329,6 +329,21 @@
 ##---------------------------------------------------------------------------
 [options]
 
+## The 'buglink_base' value is a string that can be used to form a URL
+## by appending a bug number.  If viewvc sees something that looks
+## like a bug number in a log message (eg. "bug 12345" or "#12345"), it
+## will be displayed as a link to the bug in your bug tracking system.
+##
+## For a Bugzilla installation, you probably want to set this to
+## something like "http://hostname/show_bug.cgi?id=".  For the Debian
+## bug tracker, you might use
+## "http://hostname/cgi-bin/bugreport.cgi?bug=".
+##
+## If 'buglink_base' is not set, then bug tracker links won't be
+## generated.
+##
+#buglink_base = http://example.com/show_bug.cgi?id=
+
 ## root_as_url_component: Interpret the first path component in the URL
 ## after the script location as the root to use.  This is an
 ## alternative to using the "root=" query key. If ViewVC is configured
--- lib/config.py
+++ lib/config.py
@@ -438,6 +438,7 @@
     self.options.log_pagesize = 0
     self.options.log_pagesextra = 3
     self.options.limit_changes = 100
+    self.options.buglink_base = None
 
     self.templates.diff = None
     self.templates.directory = None
--- lib/viewvc.py
+++ lib/viewvc.py
@@ -1122,6 +1122,10 @@
     return out, out_len, 0
 
     
+# Matches bug numbers
+_re_rewrite_bug = re.compile(r'((?:\bbug[\s:#+]|[^&]#|^#)\s*(\d\d+))', re.I)
+_re_buglink_prefix = ""
+ 
 class ViewVCHtmlFormatter:
   """Format a string as HTML-encoded output with customizable markup
   rules, for example turning strings that look like URLs into anchor links.
@@ -1134,6 +1138,19 @@
   def __init__(self):
     self._formatters = []
 
+  def format_bugzilla(self, mobj, userdata, maxlen=0):
+    """Return a 2-tuple containing:
+         - the text represented by MatchObject MOBJ, formatted as
+           linkified URL, with no more than MAXLEN characters in the
+           non-HTML-tag bits.  If MAXLEN is 0, there is no maximum.
+         - the number of non-HTML-tag characters returned.
+    """
+    s = mobj.group(0)
+    trunc_s = maxlen and s[:maxlen] or s
+    return '<a href="%s%s">%s</a>' % (_re_buglink_prefix, urllib.quote(mobj.group(2)),
+                    sapi.escape(trunc_s)), \
+                    len(trunc_s)
+
   def format_url(self, mobj, userdata, maxlen=0):
     """Return a 2-tuple containing:
          - the text represented by MatchObject MOBJ, formatted as
@@ -1356,6 +1373,11 @@
           lf.add_formatter(_re_rewrite_svnrevref, lf.format_svnrevref,
                            revision_to_url)
 
+        if cfg.options.buglink_base is not None:
+          global _re_buglink_prefix
+          _re_buglink_prefix = cfg.options.buglink_base
+          lf.add_formatter(_re_rewrite_bug, lf.format_bugzilla)
+
         # Rewrite email addresses.
         if cfg.options.mangle_email_addresses == 2:
           lf.add_formatter(_re_rewrite_email, lf.format_email_truncated)