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>
This commit is contained in:
Lukas Fleischer 2017-04-23 14:56:07 +02:00
parent a9ac385cb9
commit bb623fc545
4 changed files with 57 additions and 5 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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