Instead of overwriting arrays, such as depends, from the pkgbase
section, new entries should be appended. Replace array_merge() with a
mixture of array_merge_recursive() and array_replace_recursive() that
merges array fields and replaces non-array fields.

Signed-off-by: Lukas Fleischer <[email protected]>
---
 web/html/pkgsubmit.php |  4 ++--
 web/lib/aur.inc.php    | 25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index 045b8f9..11206e1 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -147,7 +147,7 @@ if ($uid):
                                        if (isset($section_info['pkgbase'])) {
                                                $pkgbase_info = $section_info;
                                        } elseif 
(isset($section_info['pkgname'])) {
-                                               $pkginfo[] = 
array_merge($pkgbase_info, $section_info);
+                                               $pkginfo[] = 
array_pkgbuild_merge($pkgbase_info, $section_info);
                                        }
                                }
                                $section_info = array(
@@ -180,7 +180,7 @@ if ($uid):
                        if (isset($section_info['pkgbase'])) {
                                $pkgbase_info = $section_info;
                        } elseif (isset($section_info['pkgname'])) {
-                               $pkginfo[] = array_merge($pkgbase_info, 
$section_info);
+                               $pkginfo[] = 
array_pkgbuild_merge($pkgbase_info, $section_info);
                        }
                } else {
                        /* Use data from the PKGBUILD parser (deprecated!) */
diff --git a/web/lib/aur.inc.php b/web/lib/aur.inc.php
index 16aa261..b41b720 100644
--- a/web/lib/aur.inc.php
+++ b/web/lib/aur.inc.php
@@ -572,3 +572,28 @@ function latest_pkgs($numpkgs) {
 
        return $packages;
 }
+
+/**
+ * Merge pkgbase and package options
+ *
+ * Merges entries of the first and the second array. If any key appears in both
+ * arrays and the corresponding value is an array itself, the arrays are
+ * merged. If a key appears in both arrays and the corresponding value is not
+ * an array, the second value replaces the first one.
+ *
+ * @param array $pkgbase_info Options from the pkgbase section
+ * @param array $section_info Options from the package section
+ *
+ * @return array Merged information from both sections
+ */
+function array_pkgbuild_merge($pkgbase_info, $section_info) {
+       $pi = $pkgbase_info;
+       foreach ($section_info as $opt_key => $opt_val) {
+               if (is_array($opt_val)) {
+                       $pi[$opt_key] += $opt_val;
+               } else {
+                       $pi[$opt_key] = $opt_val;
+               }
+       }
+       return $pi;
+}
-- 
1.9.2

Reply via email to