[4/4] Make references to Git commits clickable

Message ID 20170423165302.25025-5-lfleischer@archlinux.org
State Accepted, archived
Headers show
Series
  • Add Markdown syntax to comments
Related show

Commit Message

Lukas Fleischer April 23, 2017, 4:53 p.m. UTC
Automatically detect Git commit identifiers, shorten them, and make them
link to the cgit interface.

Implements FS#43290.

Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
---
 aurweb/scripts/rendercomment.py | 59 +++++++++++++++++++++++++++++++++++++----
 conf/config.proto               |  1 +
 2 files changed, 55 insertions(+), 5 deletions(-)

Comments

Lukas Fleischer April 24, 2017, 3:59 p.m. UTC | #1
On Sun, 23 Apr 2017 at 18:53:02, Lukas Fleischer wrote:
> Automatically detect Git commit identifiers, shorten them, and make them
> link to the cgit interface.
> 
> Implements FS#43290.
> 
> Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
> ---
>  aurweb/scripts/rendercomment.py | 59 +++++++++++++++++++++++++++++++++++++----
>  conf/config.proto               |  1 +
>  2 files changed, 55 insertions(+), 5 deletions(-)
> [...]
> diff --git a/conf/config.proto b/conf/config.proto
> index 094d821..84351d9 100644
> --- a/conf/config.proto
> +++ b/conf/config.proto
> @@ -30,6 +30,7 @@ auto_orphan_age = 15552000
>  auto_delete_age = 86400
>  source_file_uri =  https://aur.archlinux.org/cgit/aur.git/tree/%s?h=%s
>  log_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s
> +commit_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s&id=%s

Small typo here, this should link to the commit page instead of the log
page. I queued a fixed version on pu which also includes some test suite
changes.

>  snapshot_uri = /cgit/aur.git/snapshot/%s.tar.gz
>  enable-maintenance = 1
>  maintenance-exceptions = 127.0.0.1
> -- 
> 2.12.2

Patch

diff --git a/aurweb/scripts/rendercomment.py b/aurweb/scripts/rendercomment.py
index c8921f8..659e18a 100755
--- a/aurweb/scripts/rendercomment.py
+++ b/aurweb/scripts/rendercomment.py
@@ -1,12 +1,17 @@ 
 #!/usr/bin/python3
 
 import re
+import pygit2
 import sys
 import bleach
 import markdown
 
+import aurweb.config
 import aurweb.db
 
+repo_path = aurweb.config.get('serve', 'repo-path')
+commit_uri = aurweb.config.get('options', 'commit_uri')
+
 
 class LinkifyPreprocessor(markdown.preprocessors.Preprocessor):
     _urlre = re.compile(r'(\b(?:https?|ftp):\/\/[\w\/\#~:.?+=&%@!\-;,]+?'
@@ -21,10 +26,53 @@  class LinkifyExtension(markdown.extensions.Extension):
         md.preprocessors.add('linkify', LinkifyPreprocessor(md), '_end')
 
 
+class GitCommitsPreprocessor(markdown.preprocessors.Preprocessor):
+    _oidre = re.compile(r'(\b)([0-9a-f]{7,40})(\b)')
+    _repo = pygit2.Repository(repo_path)
+    _head = None
+
+    def __init__(self, md, head):
+        self._head = head
+        super(markdown.preprocessors.Preprocessor, self).__init__(md)
+
+    def handleMatch(self, m):
+        oid = m.group(2)
+        if oid not in self._repo:
+            return oid
+
+        prefixlen = 12
+        while prefixlen < 40:
+            if oid[:prefixlen] in self._repo:
+                break
+            prefixlen += 1
+
+        html = '[`' + oid[:prefixlen] + '`]'
+        html += '(' + commit_uri % (self._head, oid[:prefixlen]) + ')'
+
+        return html
+
+    def run(self, lines):
+        return [self._oidre.sub(self.handleMatch, line) for line in lines]
+
+
+class GitCommitsExtension(markdown.extensions.Extension):
+    _head = None
+
+    def __init__(self, head):
+        self._head = head
+        super(markdown.extensions.Extension, self).__init__()
+
+    def extendMarkdown(self, md, md_globals):
+        preprocessor = GitCommitsPreprocessor(md, self._head)
+        md.preprocessors.add('git-commits', preprocessor, '_end')
+
+
 def get_comment(conn, commentid):
-    cur = conn.execute('SELECT Comments FROM PackageComments WHERE ID = ?',
-                       [commentid])
-    return cur.fetchone()[0]
+    cur = conn.execute('SELECT PackageComments.Comments, PackageBases.Name '
+                       'FROM PackageComments INNER JOIN PackageBases '
+                       'ON PackageBases.ID = PackageComments.PackageBaseID '
+                       'WHERE PackageComments.ID = ?', [commentid])
+    return cur.fetchone()
 
 
 def save_rendered_comment(conn, commentid, html):
@@ -37,8 +85,9 @@  def main():
 
     conn = aurweb.db.Connection()
 
-    text = get_comment(conn, commentid)
-    html = markdown.markdown(text, extensions=['nl2br', LinkifyExtension()])
+    text, pkgbase = get_comment(conn, commentid)
+    html = markdown.markdown(text, extensions=['nl2br', LinkifyExtension(),
+                                               GitCommitsExtension(pkgbase)])
     allowed_tags = bleach.sanitizer.ALLOWED_TAGS + ['p', 'br']
     html = bleach.clean(html, tags=allowed_tags)
     save_rendered_comment(conn, commentid, html)
diff --git a/conf/config.proto b/conf/config.proto
index 094d821..84351d9 100644
--- a/conf/config.proto
+++ b/conf/config.proto
@@ -30,6 +30,7 @@  auto_orphan_age = 15552000
 auto_delete_age = 86400
 source_file_uri =  https://aur.archlinux.org/cgit/aur.git/tree/%s?h=%s
 log_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s
+commit_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s&id=%s
 snapshot_uri = /cgit/aur.git/snapshot/%s.tar.gz
 enable-maintenance = 1
 maintenance-exceptions = 127.0.0.1