summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <archlinux@cryptocrack.de>2014-04-04 23:10:38 +0200
committerLukas Fleischer <archlinux@cryptocrack.de>2014-04-05 12:21:36 +0200
commitb558572a2ee6c1022eb1e663840f11a5745459a9 (patch)
tree82a1a181e5d08de1648246c69e972c4747eb8ce7
parent45bd1b34f120909c48bc8fefa3dce1be28aeed0f (diff)
downloadaur-b558572a2ee6c1022eb1e663840f11a5745459a9.tar.gz
aur-b558572a2ee6c1022eb1e663840f11a5745459a9.tar.xz
Make the delete function remove package bases
Deleting a single package without deleting the whole package base makes no sense. Comments and votes are already stored on a per-package basis, making this a straightforward extension. Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
-rw-r--r--web/html/packages.php8
-rw-r--r--web/lib/pkgfuncs.inc.php82
2 files changed, 58 insertions, 32 deletions
diff --git a/web/html/packages.php b/web/html/packages.php
index f5ecf946..d9c3a860 100644
--- a/web/html/packages.php
+++ b/web/html/packages.php
@@ -72,13 +72,13 @@ if (check_token()) {
} elseif (current_action("do_Delete")) {
if (isset($_POST['confirm_Delete'])) {
if (!isset($_POST['merge_Into']) || empty($_POST['merge_Into'])) {
- list($ret, $output) = pkg_delete($atype, $ids, NULL);
+ list($ret, $output) = pkg_delete($atype, pkgbase_from_pkgid($ids), NULL);
unset($_GET['ID']);
}
else {
- $mergepkgid = pkgid_from_name($_POST['merge_Into']);
- if ($mergepkgid) {
- list($ret, $output) = pkg_delete($atype, $ids, $mergepkgid);
+ $merge_base_id = pkgbase_from_name($_POST['merge_Into']);
+ if ($merge_base_id) {
+ list($ret, $output) = pkg_delete($atype, pkgbase_from_pkgid($ids), $merge_base_id);
unset($_GET['ID']);
}
else {
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 4b317f5f..ef0eba94 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -788,6 +788,35 @@ function pkgbase_from_pkgid($ids) {
}
/**
+ * Retrieve ID of a package base by name
+ *
+ * @param string $name The package base name to retrieve the ID for
+ *
+ * @return int The ID of the package base
+ */
+function pkgbase_from_name($name) {
+ $dbh = DB::connect();
+ $q = "SELECT ID FROM PackageBases WHERE Name = " . $dbh->quote($name);
+ $result = $dbh->query($q);
+ return $result->fetch(PDO::FETCH_COLUMN, 0);
+}
+
+/**
+ * Retrieve the name of a package base given its ID
+ *
+ * @param int $base_id The ID of the package base to query
+ *
+ * @return string The name of the package base
+ */
+function pkgbase_name_from_id($base_id) {
+ $dbh = DB::connect();
+ $q = "SELECT Name FROM PackageBases WHERE ID = " . intval($base_id);
+ $result = $dbh->query($q);
+ return $result->fetch(PDO::FETCH_COLUMN, 0);
+}
+
+
+/**
* Flag package(s) as out-of-date
*
* @global string $AUR_LOCATION The AUR's URL used for notification e-mails
@@ -884,15 +913,15 @@ function pkg_unflag($atype, $ids) {
}
/**
- * Delete packages
+ * Delete package bases
*
* @param string $atype Account type, output of account_from_sid
- * @param array $ids Array of package IDs to delete
- * @param int $mergepkgid Package to merge the deleted ones into
+ * @param array $base_ids Array of package base IDs to delete
+ * @param int $merge_base_id Package base to merge the deleted ones into
*
* @return array Tuple of success/failure indicator and error message
*/
-function pkg_delete ($atype, $ids, $mergepkgid) {
+function pkg_delete ($atype, $base_ids, $merge_base_id) {
if (!$atype) {
return array(false, __("You must be logged in before you can delete packages."));
}
@@ -901,26 +930,24 @@ function pkg_delete ($atype, $ids, $mergepkgid) {
return array(false, __("You do not have permission to delete packages."));
}
- $ids = sanitize_ids($ids);
- $base_ids = pkgbase_from_pkgid($ids);
- if (empty($ids)) {
+ $base_ids = sanitize_ids($base_ids);
+ if (empty($base_ids)) {
return array(false, __("You did not select any packages to delete."));
}
$dbh = DB::connect();
- if ($mergepkgid) {
- $mergepkgname = pkgname_from_id($mergepkgid);
- $mergepkgbase = pkgbase_from_pkgid($mergepkgid);
+ if ($merge_base_id) {
+ $merge_base_name = pkgbase_name_from_id($merge_base_id);
}
/* Send e-mail notifications. */
- foreach ($ids as $pkgid) {
+ foreach ($base_ids as $base_id) {
$q = "SELECT CommentNotify.*, Users.Email ";
$q.= "FROM CommentNotify, Users ";
$q.= "WHERE Users.ID = CommentNotify.UserID ";
$q.= "AND CommentNotify.UserID != " . uid_from_sid($_COOKIE['AURSID']) . " ";
- $q.= "AND CommentNotify.PackageBaseID = " . pkgbase_from_pkgid($pkgid);
+ $q.= "AND CommentNotify.PackageBaseID = " . $base_id;
$result = $dbh->query($q);
$bcc = array();
@@ -928,7 +955,7 @@ function pkg_delete ($atype, $ids, $mergepkgid) {
array_push($bcc, $row['Email']);
}
if (!empty($bcc)) {
- $pkgname = pkgname_from_id($pkgid);
+ $pkgbase_name = pkgbase_name_from_id($base_id);
/*
* TODO: Add native language emails for users, based on
@@ -938,11 +965,11 @@ function pkg_delete ($atype, $ids, $mergepkgid) {
* comment was in.
*/
$body = "";
- if ($mergepkgid) {
- $body .= username_from_sid($_COOKIE['AURSID']) . " merged \"".$pkgname."\" into \"$mergepkgname\".\n\n";
- $body .= "You will no longer receive notifications about this package, please go to https://aur.archlinux.org" . get_pkg_uri($mergepkgname) . " and click the Notify button if you wish to recieve them again.";
+ if ($merge_base_id) {
+ $body .= username_from_sid($_COOKIE['AURSID']) . " merged \"".$pkgbase_name."\" into \"$merge_base_name\".\n\n";
+ $body .= "You will no longer receive notifications about this package, please go to https://aur.archlinux.org" . get_pkgbase_uri($merge_base_name) . " and click the Notify button if you wish to recieve them again.";
} else {
- $body .= username_from_sid($_COOKIE['AURSID']) . " deleted \"".$pkgname."\".\n\n";
+ $body .= username_from_sid($_COOKIE['AURSID']) . " deleted \"".$pkgbase_name."\".\n\n";
$body .= "You will no longer receive notifications about this package.";
}
$body = wordwrap($body, 70);
@@ -953,43 +980,42 @@ function pkg_delete ($atype, $ids, $mergepkgid) {
"Reply-to: nobody@archlinux.org\r\n" .
"From: aur-notify@archlinux.org\r\n" .
"X-Mailer: AUR";
- @mail('undisclosed-recipients: ;', "AUR Package deleted: " . $pkgname, $body, $headers);
+ @mail('undisclosed-recipients: ;', "AUR Package deleted: " . $pkgbase_name, $body, $headers);
}
}
- if ($mergepkgid) {
+ if ($merge_base_id) {
/* Merge comments */
$q = "UPDATE PackageComments ";
- $q.= "SET PackageBaseID = " . intval($mergepkgbase) . " ";
+ $q.= "SET PackageBaseID = " . intval($merge_base_id) . " ";
$q.= "WHERE PackageBaseID IN (" . implode(",", $base_ids) . ")";
$dbh->exec($q);
/* Merge votes */
foreach ($base_ids as $base_id) {
$q = "UPDATE PackageVotes ";
- $q.= "SET PackageBaseID = " . intval($mergepkgbase) . " ";
+ $q.= "SET PackageBaseID = " . intval($merge_base_id) . " ";
$q.= "WHERE PackageBaseID = " . $base_id . " ";
$q.= "AND UsersID NOT IN (";
$q.= "SELECT * FROM (SELECT UsersID ";
$q.= "FROM PackageVotes ";
- $q.= "WHERE PackageBaseID = " . intval($mergepkgbase);
+ $q.= "WHERE PackageBaseID = " . intval($merge_base_id);
$q.= ") temp)";
$dbh->exec($q);
}
$q = "UPDATE PackageBases ";
$q.= "SET NumVotes = (SELECT COUNT(*) FROM PackageVotes ";
- $q.= "WHERE PackageBaseID = " . intval($mergepkgbase) . ") ";
- $q.= "WHERE ID = " . intval($mergepkgbase);
+ $q.= "WHERE PackageBaseID = " . intval($merge_base_id) . ") ";
+ $q.= "WHERE ID = " . intval($merge_base_id);
$dbh->exec($q);
}
- $q = "DELETE FROM Packages WHERE ID IN (" . implode(",", $ids) . ")";
- $result = $dbh->exec($q);
+ $q = "DELETE FROM Packages WHERE PackageBaseID IN (" . implode(",", $base_ids) . ")";
+ $dbh->exec($q);
- /* Deleting a package also removes the corresponding package base. */
$q = "DELETE FROM PackageBases WHERE ID IN (" . implode(",", $base_ids) . ")";
- $result = $dbh->exec($q);
+ $dbh->exec($q);
return array(true, __("The selected packages have been deleted."));
}