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@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