[aur-dev] [PATCH] Add support for architecture-specific fields

Lukas Fleischer archlinux at cryptocrack.de
Sun Aug 10 06:31:35 EDT 2014


This adds support for architecture-specific dependencies and relations.
Support for this has recently been added to makepkg, see commit 2b556d8
(PKGBUILD: handle arch specific attributes, 2014-07-25) in the pacman
repository for details.

Signed-off-by: Lukas Fleischer <archlinux at cryptocrack.de>
---
 schema/aur-schema.sql        |  2 ++
 upgrading/3.5.0.txt          |  6 ++++
 web/html/pkgsubmit.php       | 31 +++++++++++++------
 web/lib/pkgfuncs.inc.php     | 72 +++++++++++++++++++++++++++++++++++---------
 web/template/pkg_details.php | 40 ++++++++++++++++--------
 5 files changed, 114 insertions(+), 37 deletions(-)
 create mode 100644 upgrading/3.5.0.txt

diff --git a/schema/aur-schema.sql b/schema/aur-schema.sql
index 0ec4f75..149695c 100644
--- a/schema/aur-schema.sql
+++ b/schema/aur-schema.sql
@@ -198,6 +198,7 @@ CREATE TABLE PackageDepends (
 	DepTypeID TINYINT UNSIGNED NOT NULL,
 	DepName VARCHAR(255) NOT NULL,
 	DepCondition VARCHAR(255),
+	DepArch VARCHAR(255) NULL DEFAULT NULL,
 	INDEX (PackageID),
 	INDEX (DepName),
 	FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
@@ -224,6 +225,7 @@ CREATE TABLE PackageRelations (
 	RelTypeID TINYINT UNSIGNED NOT NULL,
 	RelName VARCHAR(255) NOT NULL,
 	RelCondition VARCHAR(255),
+	RelArch VARCHAR(255) NULL DEFAULT NULL,
 	INDEX (PackageID),
 	INDEX (RelName),
 	FOREIGN KEY (PackageID) REFERENCES Packages(ID) ON DELETE CASCADE,
diff --git a/upgrading/3.5.0.txt b/upgrading/3.5.0.txt
new file mode 100644
index 0000000..a0ee389
--- /dev/null
+++ b/upgrading/3.5.0.txt
@@ -0,0 +1,6 @@
+1. Add support for architecture-specific dependencies to the database:
+
+----
+ALTER TABLE PackageDepends ADD COLUMN DepArch VARCHAR(255) NULL DEFAULT NULL;
+ALTER TABLE PackageRelations ADD COLUMN RelArch VARCHAR(255) NULL DEFAULT NULL;
+----
diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index 7d89425..eac95a3 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -137,6 +137,13 @@ if ($uid):
 				continue;
 			}
 			list($key, $value) = explode(' = ', $line, 2);
+			$tokens = explode('_', $key, 2);
+			$key = $tokens[0];
+			if (count($tokens) > 1) {
+				$arch = $tokens[1];
+			} else {
+				$arch = NULL;
+			}
 			switch ($key) {
 			case 'pkgbase':
 			case 'pkgname':
@@ -170,6 +177,8 @@ if ($uid):
 			case 'license':
 			case 'groups':
 			case 'source':
+				$section_info[$key][] = $value;
+				break;
 			case 'depends':
 			case 'makedepends':
 			case 'checkdepends':
@@ -177,7 +186,7 @@ if ($uid):
 			case 'conflicts':
 			case 'provides':
 			case 'replaces':
-				$section_info[$key][] = $value;
+				$section_info[$key][$arch][] = $value;
 				break;
 			}
 		}
@@ -354,18 +363,22 @@ if ($uid):
 				}
 
 				foreach (array('depends', 'makedepends', 'checkdepends', 'optdepends') as $deptype) {
-					foreach ($pi[$deptype] as $dep) {
-						$deppkgname = preg_replace("/(<|=|>).*/", "", $dep);
-						$depcondition = str_replace($deppkgname, "", $dep);
-						pkg_add_dep($pkgid, $deptype, $deppkgname, $depcondition);
+					foreach ($pi[$deptype] as $deparch => $depgrp) {
+						foreach ($depgrp as $dep) {
+							$deppkgname = preg_replace("/(<|=|>).*/", "", $dep);
+							$depcondition = str_replace($deppkgname, "", $dep);
+							pkg_add_dep($pkgid, $deptype, $deppkgname, $depcondition, $deparch);
+						}
 					}
 				}
 
 				foreach (array('conflicts', 'provides', 'replaces') as $reltype) {
-					foreach ($pi[$reltype] as $rel) {
-						$relpkgname = preg_replace("/(<|=|>).*/", "", $rel);
-						$relcondition = str_replace($relpkgname, "", $rel);
-						pkg_add_rel($pkgid, $reltype, $relpkgname, $relcondition);
+					foreach ($pi[$reltype] as $relarch => $relgrp) {
+						foreach ($relgrp as $rel) {
+							$relpkgname = preg_replace("/(<|=|>).*/", "", $rel);
+							$relcondition = str_replace($relpkgname, "", $rel);
+							pkg_add_rel($pkgid, $reltype, $relpkgname, $relcondition, $relarch);
+						}
 					}
 				}
 
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 8c2a67d..5786ce5 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -146,7 +146,7 @@ function pkg_dependencies($pkgid) {
 	$pkgid = intval($pkgid);
 	if ($pkgid > 0) {
 		$dbh = DB::connect();
-		$q = "SELECT pd.DepName, dt.Name, pd.DepCondition, p.ID FROM PackageDepends pd ";
+		$q = "SELECT pd.DepName, dt.Name, pd.DepCondition, pd.DepArch, p.ID FROM PackageDepends pd ";
 		$q.= "LEFT JOIN Packages p ON pd.DepName = p.Name ";
 		$q.= "OR SUBSTRING(pd.DepName FROM 1 FOR POSITION(': ' IN pd.DepName) - 1) = p.Name ";
 		$q.= "LEFT JOIN DependencyTypes dt ON dt.ID = pd.DepTypeID ";
@@ -175,7 +175,7 @@ function pkg_relations($pkgid) {
 	$pkgid = intval($pkgid);
 	if ($pkgid > 0) {
 		$dbh = DB::connect();
-		$q = "SELECT pr.RelName, rt.Name, pr.RelCondition, p.ID FROM PackageRelations pr ";
+		$q = "SELECT pr.RelName, rt.Name, pr.RelCondition, pr.RelArch, p.ID FROM PackageRelations pr ";
 		$q.= "LEFT JOIN Packages p ON pr.RelName = p.Name ";
 		$q.= "LEFT JOIN RelationTypes rt ON rt.ID = pr.RelTypeID ";
 		$q.= "WHERE pr.PackageID = ". $pkgid . " ";
@@ -227,11 +227,12 @@ function pkg_relation_type_id_from_name($name) {
  * @param string $name The name of the dependency
  * @param string $type The name of the dependency type
  * @param string $cond The package dependency condition string
+ * @param string $arch The package dependency architecture
  * @param int $pkg_id The package of the package to display the dependency for
  *
  * @return string The HTML code of the label to display
  */
-function pkg_depend_link($name, $type, $cond, $pkg_id) {
+function pkg_depend_link($name, $type, $cond, $arch, $pkg_id) {
 	if ($type == 'optdepends' && strpos($name, ':') !== false) {
 		$tokens = explode(':', $name, 2);
 		$name = $tokens[0];
@@ -250,18 +251,55 @@ function pkg_depend_link($name, $type, $cond, $pkg_id) {
 	$link .= htmlspecialchars($name) . '</a>';
 	$link .= htmlspecialchars($cond);
 
-	if ($type == 'makedepends') {
-		$link .= ' <em>(make)</em>';
-	} elseif ($type == 'checkdepends') {
-		$link .= ' <em>(check)</em>';
-	} elseif ($type == 'optdepends') {
-		$link .= ' <em>(optional) – ' . htmlspecialchars($desc) . ' </em>';
+	if ($type != 'depends' || $arch) {
+		$link .= ' <em>(';
+
+		if ($type == 'makedepends') {
+			$link .= 'make';
+		} elseif ($type == 'checkdepends') {
+			$link .= 'check';
+		} elseif ($type == 'optdepends') {
+			$link .= 'optional';
+		}
+
+		if ($type != 'depends' && $arch) {
+			$link .= ', ';
+		}
+
+		if ($arch) {
+			$link .= htmlspecialchars($arch);
+		}
+
+		$link .= ')';
+		if ($type == 'optdepends') {
+			$link .= ' – ' . htmlspecialchars($desc) . ' </em>';
+		}
+		$link .= '</em>';
 	}
 
 	return $link;
 }
 
 /**
+ * Get the HTML code to display a package relation
+ *
+ * @param string $name The name of the relation
+ * @param string $cond The package relation condition string
+ * @param string $arch The package relation architecture
+ *
+ * @return string The HTML code of the label to display
+ */
+function pkg_rel_html($name, $cond, $arch) {
+	$html = htmlspecialchars($name) . htmlspecialchars($cond);
+
+	if ($arch) {
+		$html .= ' <em>(' . htmlspecialchars($arch) . ')</em>';
+	}
+
+	return $html;
+}
+
+/**
  * Determine packages that depend on a package
  *
  * @param string $name The package name for the dependency search
@@ -756,16 +794,18 @@ function pkg_create($base_id, $pkgname, $pkgver, $pkgdesc, $pkgurl) {
  * @param string $type The type of dependency to add
  * @param string $depname The name of the dependency to add
  * @param string $depcondition The  type of dependency for the package
+ * @param string $deparch The architecture of the dependency to add
  *
  * @return void
  */
-function pkg_add_dep($pkgid, $type, $depname, $depcondition) {
+function pkg_add_dep($pkgid, $type, $depname, $depcondition, $deparch) {
 	$dbh = DB::connect();
-	$q = sprintf("INSERT INTO PackageDepends (PackageID, DepTypeID, DepName, DepCondition) VALUES (%d, %d, %s, %s)",
+	$q = sprintf("INSERT INTO PackageDepends (PackageID, DepTypeID, DepName, DepCondition, DepArch) VALUES (%d, %d, %s, %s, %s)",
 		$pkgid,
 		pkg_dependency_type_id_from_name($type),
 		$dbh->quote($depname),
-		$dbh->quote($depcondition)
+		$dbh->quote($depcondition),
+		$deparch ? $dbh->quote($deparch) : 'NULL'
 	);
 	$dbh->exec($q);
 }
@@ -777,16 +817,18 @@ function pkg_add_dep($pkgid, $type, $depname, $depcondition) {
  * @param string $type The type of relation to add
  * @param string $relname The name of the relation to add
  * @param string $relcondition The version requirement of the relation
+ * @param string $relarch The architecture of the relation to add
  *
  * @return void
  */
-function pkg_add_rel($pkgid, $type, $relname, $relcondition) {
+function pkg_add_rel($pkgid, $type, $relname, $relcondition, $relarch) {
 	$dbh = DB::connect();
-	$q = sprintf("INSERT INTO PackageRelations (PackageID, RelTypeID, RelName, RelCondition) VALUES (%d, %d, %s, %s)",
+	$q = sprintf("INSERT INTO PackageRelations (PackageID, RelTypeID, RelName, RelCondition, RelArch) VALUES (%d, %d, %s, %s, %s)",
 		$pkgid,
 		pkg_relation_type_id_from_name($type),
 		$dbh->quote($relname),
-		$dbh->quote($relcondition)
+		$dbh->quote($relcondition),
+		$relarch ? $dbh->quote($relarch) : 'NULL'
 	);
 	$dbh->exec($q);
 }
diff --git a/web/template/pkg_details.php b/web/template/pkg_details.php
index 8a3cbcc..3752e1a 100644
--- a/web/template/pkg_details.php
+++ b/web/template/pkg_details.php
@@ -30,16 +30,30 @@ $deps = pkg_dependencies($row["ID"]);
 $requiredby = pkg_required($row["Name"]);
 
 usort($deps, function($x, $y) {
-	if ($x[1] == "depends" && $y[1] != "depends") {
-		return -1;
+	if ($x[1] != $y[1]) {
+		if ($x[1] == "depends") {
+			return -1;
+		} elseif ($y[1] == "depends") {
+			return 1;
+		}
+		return strcmp($x[1], $y[1]);
+	} elseif ($x[3] != $y[3]) {
+		return strcmp($x[3], $y[3]);
+	} else {
+		return strcmp($x[0], $y[0]);
 	}
-	if ($y[1] == "depends" && $x[1] != "depends") {
-		return 1;
-	}
-	return $x[1] == $y[1] ? strcmp($x[0], $y[0]) : strcmp($x[1], $y[1]);
 });
 
 $rels = pkg_relations($row["ID"]);
+
+usort($rels, function($x, $y) {
+	if ($x[3] != $y[3]) {
+		return strcmp($x[3], $y[3]);
+	} else {
+		return strcmp($x[0], $y[0]);
+	}
+});
+
 $rels_c = $rels_p = $rels_r = array();
 foreach ($rels as $rel) {
 	switch ($rel[1]) {
@@ -221,9 +235,9 @@ if (has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))):
 				<?php foreach($rels_c as $rarr): ?>
 				<span class="related">
 					<?php if ($rarr !== end($rels_c)): ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>,
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>,
 					<?php else: ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>
 					<?php endif; ?>
 				</span>
 				<?php endforeach; ?>
@@ -237,9 +251,9 @@ if (has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))):
 				<?php foreach($rels_p as $rarr): ?>
 				<span class="related">
 					<?php if ($rarr !== end($rels_p)): ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>,
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>,
 					<?php else: ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>
 					<?php endif; ?>
 				</span>
 				<?php endforeach; ?>
@@ -253,9 +267,9 @@ if (has_credential(CRED_PKGBASE_CHANGE_CATEGORY, array($row["MaintainerUID"]))):
 				<?php foreach($rels_r as $rarr): ?>
 				<span class="related">
 					<?php if ($rarr !== end($rels_r)): ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>,
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>,
 					<?php else: ?>
-					<?= htmlspecialchars($rarr[0] . $rarr[2]) ?>
+					<?= pkg_rel_html($rarr[0], $rarr[2], $rarr[3]) ?>
 					<?php endif; ?>
 				</span>
 				<?php endforeach; ?>
@@ -344,7 +358,7 @@ if ($row["PackagerUID"]):
 <?php if (count($deps) > 0): ?>
 			<ul id="pkgdepslist">
 <?php while (list($k, $darr) = each($deps)): ?>
-	<li><?= pkg_depend_link($darr[0], $darr[1], $darr[2], $darr[3]); ?></li>
+	<li><?= pkg_depend_link($darr[0], $darr[1], $darr[2], $darr[3], $darr[4]); ?></li>
 <?php endwhile; ?>
 			</ul>
 <?php endif; ?>
-- 
2.0.4


More information about the aur-dev mailing list