From 64072461dfcc74857087b23c9ba7d9812b6afe40 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer
Date: Tue, 10 Nov 2015 20:18:13 +0100
Subject: Add support for package update notifications
Introduce a new notification option to receive notifications when a new
commit is pushed to a package repository.
Implements FS#30109.
Signed-off-by: Lukas Fleischer
---
git-interface/git-update.py | 18 ++++++++++++++++--
schema/aur-schema.sql | 1 +
scripts/notify.py | 33 +++++++++++++++++++++++++++++++++
upgrading/4.2.0.txt | 3 ++-
web/html/account.php | 10 +++++-----
web/html/register.php | 4 ++--
web/lib/acctfuncs.inc.php | 7 +++++--
web/template/account_edit_form.php | 4 ++++
8 files changed, 68 insertions(+), 12 deletions(-)
diff --git a/git-interface/git-update.py b/git-interface/git-update.py
index 3b587b3..e54e0e6 100755
--- a/git-interface/git-update.py
+++ b/git-interface/git-update.py
@@ -5,6 +5,7 @@ import mysql.connector
import os
import pygit2
import re
+import subprocess
import sys
import srcinfo.parse
@@ -19,6 +20,8 @@ aur_db_user = config.get('database', 'user')
aur_db_pass = config.get('database', 'password')
aur_db_socket = config.get('database', 'socket')
+notify_cmd = config.get('notifications', 'notify-cmd')
+
repo_path = config.get('serve', 'repo-path')
repo_regex = config.get('serve', 'repo-regex')
@@ -169,6 +172,13 @@ def save_metadata(metadata, db, cur, user):
db.commit()
+def update_notify(db, cur, user, pkgbase_id):
+ # Obtain the user ID of the new maintainer.
+ cur.execute("SELECT ID FROM Users WHERE Username = %s", [user])
+ user_id = int(cur.fetchone()[0])
+
+ # Execute the notification script.
+ subprocess.Popen((notify_cmd, 'update', str(user_id), str(pkgbase_id)))
def die(msg):
sys.stderr.write("error: {:s}\n".format(msg))
@@ -336,8 +346,6 @@ for pkgname in srcinfo.utils.get_package_names(metadata):
# Store package base details in the database.
save_metadata(metadata, db, cur, user)
-db.close()
-
# Create (or update) a branch with the name of the package base for better
# accessibility.
repo.create_reference('refs/heads/' + pkgbase, sha1_new, True)
@@ -347,3 +355,9 @@ repo.create_reference('refs/heads/' + pkgbase, sha1_new, True)
# http://git.661346.n2.nabble.com/PATCH-receive-pack-Create-a-HEAD-ref-for-ref-namespace-td7632149.html
# for details.
repo.create_reference('refs/namespaces/' + pkgbase + '/HEAD', sha1_new, True)
+
+# Send package update notifications.
+update_notify(db, cur, user, pkgbase_id)
+
+# Close the database.
+db.close()
diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql
index 13a052e..1a141c1 100644
--- a/schema/aur-schema.sql
+++ b/schema/aur-schema.sql
@@ -39,6 +39,7 @@ CREATE TABLE Users (
InactivityTS BIGINT UNSIGNED NOT NULL DEFAULT 0,
RegistrationTS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CommentNotify TINYINT(1) NOT NULL DEFAULT 1,
+ UpdateNotify TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (ID),
UNIQUE (Username),
UNIQUE (Email),
diff --git a/scripts/notify.py b/scripts/notify.py
index 6b10600..56534ae 100755
--- a/scripts/notify.py
+++ b/scripts/notify.py
@@ -105,6 +105,16 @@ def get_comment_recipients(cur, pkgbase_id, uid):
return [row[0] for row in cur.fetchall()]
+def get_update_recipients(cur, pkgbase_id, uid):
+ cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
+ 'INNER JOIN PackageNotifications ' +
+ 'ON PackageNotifications.UserID = Users.ID WHERE ' +
+ 'Users.UpdateNotify = 1 AND ' +
+ 'PackageNotifications.UserID != %s AND ' +
+ 'PackageNotifications.PackageBaseID = %s', [uid, pkgbase_id])
+ return [row[0] for row in cur.fetchall()]
+
+
def get_request_recipients(cur, pkgbase_id, uid):
cur.execute('SELECT DISTINCT Users.Email FROM Users ' +
'INNER JOIN PackageBases ' +
@@ -189,6 +199,28 @@ def comment(cur, uid, pkgbase_id, comment_id):
send_notification(to, subject, body, refs, headers)
+def update(cur, uid, pkgbase_id):
+ user = username_from_id(cur, uid)
+ pkgbase = pkgbase_from_id(cur, pkgbase_id)
+ to = get_update_recipients(cur, pkgbase_id, uid)
+
+ user_uri = aur_location + '/account/' + user + '/'
+ pkgbase_uri = aur_location + '/pkgbase/' + pkgbase + '/'
+
+ subject = 'AUR Package Update: %s' % (pkgbase)
+ body = '%s [1] pushed a new commit to %s [2].' % (user, pkgbase)
+ body += '\n\n'
+ body += 'If you no longer wish to receive notifications about this ' \
+ 'package, please go to the package page [2] and select "%s".' % \
+ ('Disable notifications')
+ refs = '[1] ' + user_uri + '\n'
+ refs += '[2] ' + pkgbase_uri
+ thread_id = ''
+ headers = headers_reply(thread_id)
+
+ send_notification(to, subject, body, refs, headers)
+
+
def flag(cur, uid, pkgbase_id):
user = username_from_id(cur, uid)
pkgbase = pkgbase_from_id(cur, pkgbase_id)
@@ -327,6 +359,7 @@ if __name__ == '__main__':
'send-resetkey': send_resetkey,
'welcome': welcome,
'comment': comment,
+ 'update': update,
'flag': flag,
'comaintainer-add': comaintainer_add,
'comaintainer-remove': comaintainer_remove,
diff --git a/upgrading/4.2.0.txt b/upgrading/4.2.0.txt
index ce76f49..0bf9a31 100644
--- a/upgrading/4.2.0.txt
+++ b/upgrading/4.2.0.txt
@@ -52,5 +52,6 @@ ALTER TABLE CommentNotify RENAME TO PackageNotifications;
----
ALTER TABLE Users
- ADD COLUMN CommentNotify TINYINT(1) NOT NULL DEFAULT 1;
+ ADD COLUMN CommentNotify TINYINT(1) NOT NULL DEFAULT 1,
+ ADD COLUMN UpdateNotify TINYINT(1) NOT NULL DEFAULT 0;
----
diff --git a/web/html/account.php b/web/html/account.php
index 2f85a8a..9007ace 100644
--- a/web/html/account.php
+++ b/web/html/account.php
@@ -35,8 +35,8 @@ if ($action == "UpdateAccount") {
in_request("E"), in_request("H"), in_request("P"),
in_request("C"), in_request("R"), in_request("L"),
in_request("I"), in_request("K"), in_request("PK"),
- in_request("J"), in_request("CN"), in_request("ID"),
- $row["Username"]);
+ in_request("J"), in_request("CN"), in_request("UN"),
+ in_request("ID"), $row["Username"]);
}
}
@@ -83,7 +83,7 @@ if (isset($_COOKIE["AURSID"])) {
$row["HideEmail"], "", "", $row["RealName"],
$row["LangPreference"], $row["IRCNick"], $row["PGPKey"], $PK,
$row["InactivityTS"] ? 1 : 0, $row["CommentNotify"],
- $row["ID"], $row["Username"]);
+ $row["UpdateNotify"], $row["ID"], $row["Username"]);
} else {
print __("You do not have permission to edit this account.");
}
@@ -123,8 +123,8 @@ if (isset($_COOKIE["AURSID"])) {
in_request("R"), in_request("L"),
in_request("I"), in_request("K"),
in_request("PK"), in_request("J"),
- in_request("CN"), in_request("ID"),
- $row["Username"]);
+ in_request("CN"), in_request("UN"),
+ in_request("ID"), $row["Username"]);
}
} else {
diff --git a/web/html/register.php b/web/html/register.php
index f58fb25..3155449 100644
--- a/web/html/register.php
+++ b/web/html/register.php
@@ -23,7 +23,7 @@ if (in_request("Action") == "NewAccount") {
"new", "NewAccount", in_request("U"), 1, 0,
in_request("E"), in_request("H"), '', '', in_request("R"),
in_request("L"), in_request("I"), in_request("K"),
- in_request("PK"), 0, in_request("CN"));
+ in_request("PK"), 0, in_request("CN"), in_request("UN"));
print $message;
@@ -31,7 +31,7 @@ if (in_request("Action") == "NewAccount") {
display_account_form("NewAccount", in_request("U"), 1, 0,
in_request("E"), in_request("H"), '', '', in_request("R"),
in_request("L"), in_request("I"), in_request("K"),
- in_request("PK"), 0, in_request("CN"));
+ in_request("PK"), 0, in_request("CN"), in_request("UN"));
}
} else {
print '
' . __("Use this form to create an account.") . '
';
diff --git a/web/lib/acctfuncs.inc.php b/web/lib/acctfuncs.inc.php
index 796b82b..b39420f 100644
--- a/web/lib/acctfuncs.inc.php
+++ b/web/lib/acctfuncs.inc.php
@@ -57,13 +57,14 @@ function html_format_pgp_fingerprint($fingerprint) {
* @param string $PK The list of SSH public keys
* @param string $J The inactivity status of the displayed user
* @param string $CN Whether to notify of new comments
+ * @param string $UN Whether to notify of package updates
* @param string $UID The user ID of the displayed user
* @param string $N The username as present in the database
*
* @return void
*/
function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R="",
- $L="",$I="",$K="",$PK="",$J="",$CN="",$UID=0,$N="") {
+ $L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
include("account_edit_form.php");
@@ -90,13 +91,14 @@ function display_account_form($A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",$R=""
* @param string $PK The list of public SSH keys
* @param string $J The inactivity status of the user
* @param string $CN Whether to notify of new comments
+ * @param string $UN Whether to notify of package updates
* @param string $UID The user ID of the modified account
* @param string $N The username as present in the database
*
* @return array Boolean indicating success and message to be printed
*/
function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C="",
- $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UID=0,$N="") {
+ $R="",$L="",$I="",$K="",$PK="",$J="",$CN="",$UN="",$UID=0,$N="") {
global $SUPPORTED_LANGS;
$error = '';
@@ -344,6 +346,7 @@ function process_account_form($TYPE,$A,$U="",$T="",$S="",$E="",$H="",$P="",$C=""
$q.= ", PGPKey = " . $dbh->quote(str_replace(" ", "", $K));
$q.= ", InactivityTS = " . $inactivity_ts;
$q.= ", CommentNotify = " . ($CN ? "1" : "0");
+ $q.= ", UpdateNotify = " . ($UN ? "1" : "0");
$q.= " WHERE ID = ".intval($UID);
$result = $dbh->exec($q);
diff --git a/web/template/account_edit_form.php b/web/template/account_edit_form.php
index 4f92f69..b9affd6 100644
--- a/web/template/account_edit_form.php
+++ b/web/template/account_edit_form.php
@@ -139,6 +139,10 @@
/>