summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@archlinux.org>2017-04-23 14:56:07 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2017-04-24 17:41:35 +0200
commitbb623fc545f0e0187cc9b32386c383b732bcc9ae (patch)
treea07d2fe5ff5fcddf32cc1c85de4d04bc6807b6f9
parenta9ac385cb90d0251253a2a3925f72a71af52f97b (diff)
downloadaur-bb623fc545f0e0187cc9b32386c383b732bcc9ae.tar.gz
aur-bb623fc545f0e0187cc9b32386c383b732bcc9ae.tar.xz
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 <lfleischer@archlinux.org>
-rwxr-xr-xaurweb/scripts/rendercomment.py59
-rw-r--r--conf/config.proto1
-rw-r--r--test/setup.sh1
-rwxr-xr-xtest/t2600-rendercomment.sh1
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