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 +++++++++++++++++++++++++++++++++++++---- conf/config.proto | 1 + test/setup.sh | 1 + test/t2600-rendercomment.sh | 1 + 4 files changed, 57 insertions(+), 5 deletions(-) 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) diff --git a/conf/config.proto b/conf/config.proto index 094d8211..6c637b02 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/commit/?h=%s&id=%s snapshot_uri = /cgit/aur.git/snapshot/%s.tar.gz enable-maintenance = 1 maintenance-exceptions = 127.0.0.1 diff --git a/test/setup.sh b/test/setup.sh index f29695a6..efa1ab86 100644 --- a/test/setup.sh +++ b/test/setup.sh @@ -29,6 +29,7 @@ aur_location = https://aur.archlinux.org aur_request_ml = aur-requests@archlinux.org enable-maintenance = 0 maintenance-exceptions = 127.0.0.1 +commit_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s&id=%s [notifications] notify-cmd = $NOTIFY diff --git a/test/t2600-rendercomment.sh b/test/t2600-rendercomment.sh index 50a5adb9..6db9467d 100755 --- a/test/t2600-rendercomment.sh +++ b/test/t2600-rendercomment.sh @@ -6,6 +6,7 @@ test_description='rendercomment tests' test_expect_success 'Test comment rendering.' ' cat <<-EOD | sqlite3 aur.db && + INSERT INTO PackageBases (ID, Name, PackagerUID, SubmittedTS, ModifiedTS, FlaggerComment) VALUES (1, "foobar", 1, 0, 0, ""); INSERT INTO PackageComments (ID, PackageBaseID, Comments, RenderedComment) VALUES (1, 1, "Hello world! This is a comment.", ""); EOD -- cgit v1.2.3-24-g4f1b