diff options
author | Lukas Fleischer <archlinux@cryptocrack.de> | 2014-04-19 10:32:43 +0200 |
---|---|---|
committer | Lukas Fleischer <archlinux@cryptocrack.de> | 2014-04-19 10:59:48 +0200 |
commit | 34453d32958cc71cf08e932368952f98b46b7020 (patch) | |
tree | 34a7775559a0262e48cd20a02145797d9e0762fc | |
parent | e582cfe1823617398657f1b46482f7c608b5aabe (diff) | |
download | aur-34453d32958cc71cf08e932368952f98b46b7020.tar.gz aur-34453d32958cc71cf08e932368952f98b46b7020.tar.xz |
Handle pkgbase array overrides gracefully
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 <archlinux@cryptocrack.de>
-rw-r--r-- | web/html/pkgsubmit.php | 4 | ||||
-rw-r--r-- | 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 045b8f93..11206e1f 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 16aa2619..b41b720c 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; +} |