[aur-dev] [PATCH] Only show virtual dependency if version condition matches

Johannes Löthberg johannes at kyriasis.com
Fri Sep 23 18:16:06 UTC 2016


Signed-off-by: Johannes Löthberg <johannes at kyriasis.com>
---
The vercmp logic is relatively complicated, so shelling out to the 
official vercmp binary is much simpler, and will be available on any 
system with pacman installed.

 conf/config.proto        |  1 +
 web/lib/pkgfuncs.inc.php | 36 ++++++++++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/conf/config.proto b/conf/config.proto
index c56141c..37c455e 100644
--- a/conf/config.proto
+++ b/conf/config.proto
@@ -31,6 +31,7 @@ log_uri = https://aur.archlinux.org/cgit/aur.git/log/?h=%s
 snapshot_uri = /cgit/aur.git/snapshot/%s.tar.gz
 enable-maintenance = 1
 maintenance-exceptions = 127.0.0.1
+vercmp-cmd = /usr/bin/vercmp
 
 [notifications]
 notify-cmd = /srv/http/aurweb/scripts/notify.py
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 4b0fdba..a697e69 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -204,14 +204,14 @@ function pkg_groups($pkgid) {
  */
 function pkg_providers($name) {
 	$dbh = DB::connect();
-	$q = "SELECT p.ID, p.Name FROM Packages p ";
+	$q = "SELECT p.ID, p.Name, p.Version FROM Packages p ";
 	$q.= "LEFT JOIN PackageRelations pr ON pr.PackageID = p.ID ";
 	$q.= "LEFT JOIN RelationTypes rt ON rt.ID = pr.RelTypeID ";
 	$q.= "WHERE p.Name = " . $dbh->quote($name) . " ";
 	$q.= "OR (rt.Name = 'provides' ";
 	$q.= "AND pr.RelName = " . $dbh->quote($name) . ")";
 	$q.= "UNION ";
-	$q.= "SELECT 0, Name FROM OfficialProviders ";
+	$q.= "SELECT 0, Name, 0 FROM OfficialProviders ";
 	$q.= "WHERE Provides = " . $dbh->quote($name);
 	$result = $dbh->query($q);
 
@@ -349,6 +349,33 @@ function pkg_provider_link($name, $official) {
 	return $link;
 }
 
+function cmp_provider_ver($version, $cond) {
+	if (!$cond) {
+		return True;
+	}
+
+	$condition = preg_split("/^([<=>]{0,2})/", $cond, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+	$cmd = config_get('options', 'vercmp-cmd');
+	$cmd .= ' ' . escapeshellarg($version) . ' ' . escapeshellarg($condition[2]);
+	$handle = popen($cmd, 'r');
+	$result = fread($handle, 2);
+	pclose($handle);
+
+	switch ($condition[1]) {
+	case ">=":
+		return $result >= 0;
+	case "<=":
+		return $result <= 0;
+	case ">":
+		return $result > 0;
+	case "<":
+		return $result < 0;
+	case "==":
+		return $result == 0;
+	}
+}
+
 /**
  * Get the HTML code to display a package dependency link
  *
@@ -407,6 +434,11 @@ function pkg_depend_link($name, $type, $cond, $arch, $pkg_id) {
 	if (count($providers) > 0) {
 		$link .= '<span class="virtual-dep">(';
 		foreach ($providers as $provider) {
+			$version = $provider[2];
+			if (!cmp_provider_ver($version, $cond)) {
+				break;
+			}
+
 			$is_official = ($provider[0] == 0);
 			$name = $provider[1];
 			$link .= pkg_provider_link($name, $is_official) . ', ';
-- 
2.10.0


More information about the aur-dev mailing list