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 <[email protected]>
---
 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 = '<pkg-notifications-' + pkgbase + '@aur.archlinux.org>'
+    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 '<p>' . __("Use this form to create an account.") . '</p>';
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 @@
                        <label for="id_commentnotify"><?= __("Notify of new 
comments") ?>:</label>
                        <input type="checkbox" name="CN" id="id_commentnotify" 
<?= $CN ? 'checked="checked"' : '' ?> />
                </p>
+               <p>
+                       <label for="id_updatenotify"><?= __("Notify of package 
updates") ?>:</label>
+                       <input type="checkbox" name="UN" id="id_updatenotify" 
<?= $UN ? 'checked="checked"' : '' ?> />
+               </p>
        </fieldset>
 
        <fieldset>
-- 
2.7.0

Reply via email to