summaryrefslogtreecommitdiff
path: root/aurweb/git
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@archlinux.org>2016-10-11 07:44:21 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2016-10-11 22:14:41 +0200
commitfc6dc44295bed8c5d9c8014c2eab2d6bf33d2541 (patch)
tree3fe0ca49397f71530d642dacd246119bbfbbabb7 /aurweb/git
parent51101d21b972b6afcef299795430cb5aea81e373 (diff)
git-serve: Close orphan requests upon disown
When disowning a package base via the SSH interface, auto-accept all pending orphan requests for the affected package. Also, add a test case that checks whether (only) orphan requests belonging to disowned packages are closed correctly. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
Diffstat (limited to 'aurweb/git')
-rwxr-xr-xaurweb/git/serve.py44
1 files changed, 43 insertions, 1 deletions
diff --git a/aurweb/git/serve.py b/aurweb/git/serve.py
index ebfef94..476aea8 100755
--- a/aurweb/git/serve.py
+++ b/aurweb/git/serve.py
@@ -183,6 +183,44 @@ def pkgbase_set_comaintainers(pkgbase, userlist, user, privileged):
conn.close()
+def pkgreq_by_pkgbase(pkgbase_id, reqtype):
+ conn = aurweb.db.Connection()
+
+ cur = conn.execute("SELECT PackageRequests.ID FROM PackageRequests " +
+ "INNER JOIN RequestTypes ON " +
+ "RequestTypes.ID = PackageRequests.ReqTypeID " +
+ "WHERE PackageRequests.Status = 0 " +
+ "AND PackageRequests.PackageBaseID = ?" +
+ "AND RequestTypes.Name = ?", [pkgbase_id, reqtype])
+
+ return [row[0] for row in cur.fetchall()]
+
+
+def pkgreq_close(reqid, reason, comments, autoclose=False):
+ statusmap = {'accepted': 2, 'rejected': 3}
+ if reason not in statusmap:
+ die('{:s}: invalid reason: {:s}'.format(action, reason))
+ status = statusmap[reason]
+
+ conn = aurweb.db.Connection()
+
+ if autoclose:
+ userid = 0
+ else:
+ cur = conn.execute("SELECT ID FROM Users WHERE Username = ?", [user])
+ userid = cur.fetchone()[0]
+ if userid == 0:
+ die('{:s}: unknown user: {:s}'.format(action, user))
+
+ conn.execute("UPDATE PackageRequests SET Status = ?, ClosureComment = ? " +
+ "WHERE ID = ?", [status, comments, reqid])
+ conn.commit()
+ conn.close()
+
+ subprocess.Popen((notify_cmd, 'request-close', str(userid), str(reqid),
+ reason)).wait()
+
+
def pkgbase_disown(pkgbase, user, privileged):
pkgbase_id = pkgbase_from_name(pkgbase)
if not pkgbase_id:
@@ -193,7 +231,11 @@ def pkgbase_disown(pkgbase, user, privileged):
die('{:s}: permission denied: {:s}'.format(action, user))
# TODO: Support disowning package bases via package request.
- # TODO: Scan through pending orphan requests and close them.
+
+ # Scan through pending orphan requests and close them.
+ comment = 'The user {:s} disowned the package.'.format(user)
+ for reqid in pkgreq_by_pkgbase(pkgbase_id, 'orphan'):
+ pkgreq_close(reqid, 'accepted', comment, True)
comaintainers = []
new_maintainer_userid = None