From bb623fc545f0e0187cc9b32386c383b732bcc9ae Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Sun, 23 Apr 2017 14:56:07 +0200 Subject: Make references to Git commits clickable Automatically detect Git commit identifiers, shorten them, and make them link to the cgit interface. Implements FS#43290. Signed-off-by: Lukas Fleischer --- aurweb/scripts/rendercomment.py | 59 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) (limited to 'aurweb/scripts/rendercomment.py') diff --git a/aurweb/scripts/rendercomment.py b/aurweb/scripts/rendercomment.py index c8921f8f..659e18ad 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) -- cgit v1.2.3-24-g4f1b