From 9d2d8f1c8c1cbc65d0842544e1803d95e8a5b130 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 17 Sep 2015 19:15:47 +0200 Subject: Honor virtual provisions in package requirements Implements FS#14125. Signed-off-by: Lukas Fleischer --- web/lib/pkgfuncs.inc.php | 31 ++++++++++++++++++++++++++----- web/template/pkg_details.php | 8 ++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php index 2939c25..b00b22d 100644 --- a/web/lib/pkgfuncs.inc.php +++ b/web/lib/pkgfuncs.inc.php @@ -343,12 +343,14 @@ function pkg_depend_link($name, $type, $cond, $arch, $pkg_id) { * Get the HTML code to display a package requirement link * * @param string $name The name of the requirement + * @param string $depends The (literal) name of the dependency of $name * @param string $type The name of the dependency type * @param string $arch The package dependency architecture + * @param string $pkgname The name of dependant package * * @return string The HTML code of the link to display */ -function pkg_requiredby_link($name, $type, $arch) { +function pkg_requiredby_link($name, $depends, $type, $arch, $pkgname) { if ($type == 'optdepends' && strpos($name, ':') !== false) { $tokens = explode(':', $name, 2); $name = $tokens[0]; @@ -359,6 +361,18 @@ function pkg_requiredby_link($name, $type, $arch) { $link .= '" title="' . __('View packages details for') .' ' . htmlspecialchars($name) . '">'; $link .= htmlspecialchars($name) . ''; + if ($depends != $pkgname) { + $depname = $depends; + if (strpos($depends, ':') !== false) { + $tokens = explode(':', $depname, 2); + $depname = $tokens[0]; + } + + $link .= ' ('; + $link .= __('requires %s', htmlspecialchars($depname)); + $link .= ')'; + } + return $link . pkg_deplink_annotation($type, $arch); } @@ -410,18 +424,25 @@ function pkg_source_link($url, $arch) { * Determine packages that depend on a package * * @param string $name The package name for the dependency search + * @param array $provides A list of virtual provisions of the package * * @return array All packages that depend on the specified package name */ -function pkg_required($name="") { +function pkg_required($name="", $provides) { $deps = array(); if ($name != "") { $dbh = DB::connect(); - $q = "SELECT p.Name, dt.Name, pd.DepArch FROM PackageDepends pd "; + + $name_list = $dbh->quote($name); + foreach ($provides as $p) { + $name_list .= ',' . $dbh->quote($p[0]); + } + + $q = "SELECT p.Name, pd.DepName, dt.Name, pd.DepArch FROM PackageDepends pd "; $q.= "LEFT JOIN Packages p ON p.ID = pd.PackageID "; $q.= "LEFT JOIN DependencyTypes dt ON dt.ID = pd.DepTypeID "; - $q.= "WHERE pd.DepName = " . $dbh->quote($name) . " "; - $q.= "OR SUBSTRING(pd.DepName FROM 1 FOR POSITION(': ' IN pd.DepName) - 1) = " . $dbh->quote($name) . " "; + $q.= "WHERE pd.DepName IN (" . $name_list . ") "; + $q.= "OR SUBSTRING(pd.DepName FROM 1 FOR POSITION(': ' IN pd.DepName) - 1) IN (" . $name_list . ") "; $q.= "ORDER BY p.Name"; $result = $dbh->query($q); if (!$result) {return array();} diff --git a/web/template/pkg_details.php b/web/template/pkg_details.php index 0a2d90e..b9fd51b 100644 --- a/web/template/pkg_details.php +++ b/web/template/pkg_details.php @@ -40,9 +40,6 @@ $out_of_date_time = ($row["OutOfDateTS"] == 0) ? $msg : gmdate("Y-m-d", intval($ $lics = pkg_licenses($row["ID"]); $grps = pkg_groups($row["ID"]); -$deps = pkg_dependencies($row["ID"]); -$requiredby = pkg_required($row["Name"]); - usort($deps, function($x, $y) { if ($x[1] != $y[1]) { if ($x[1] == "depends") { @@ -83,6 +80,9 @@ foreach ($rels as $rel) { } } +$deps = pkg_dependencies($row["ID"]); +$requiredby = pkg_required($row["Name"], $rels_p); + # $sources[0] = 'src'; $sources = pkg_sources($row["ID"]); @@ -285,7 +285,7 @@ endif; 0): ?> -- cgit v1.2.3-70-g09d2