78 lines
2.4 KiB
Diff
78 lines
2.4 KiB
Diff
--- lib/package_alternatives.c.orig
|
|
+++ lib/package_alternatives.c
|
|
@@ -249,8 +249,8 @@ xbps_alternatives_set(struct xbps_handle *xhp, const char *pkgname,
|
|
const char *group)
|
|
{
|
|
xbps_array_t allkeys;
|
|
- xbps_dictionary_t alternatives, pkg_alternatives, pkgd;
|
|
- const char *pkgver;
|
|
+ xbps_dictionary_t alternatives, pkg_alternatives, pkgd, prevpkgd, prevpkg_alts;
|
|
+ const char *pkgver, *prevpkgname;
|
|
int rv = 0;
|
|
|
|
assert(xhp);
|
|
@@ -289,6 +289,20 @@ xbps_alternatives_set(struct xbps_handle *xhp, const char *pkgname,
|
|
if (array == NULL)
|
|
continue;
|
|
|
|
+ /* remove symlinks from previous alternative */
|
|
+ xbps_array_get_cstring_nocopy(array, 0, &prevpkgname);
|
|
+ if (prevpkgname && strcmp(pkgname, prevpkgname) != 0) {
|
|
+ if ((prevpkgd = xbps_pkgdb_get_pkg(xhp, prevpkgname)) &&
|
|
+ (prevpkg_alts = xbps_dictionary_get(prevpkgd, "alternatives")) &&
|
|
+ xbps_dictionary_count(prevpkg_alts)) {
|
|
+ rv = remove_symlinks(xhp,
|
|
+ xbps_dictionary_get(prevpkg_alts, keyname),
|
|
+ keyname);
|
|
+ if (rv != 0)
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
/* put this alternative group at the head */
|
|
xbps_remove_string_from_array(array, pkgname);
|
|
kstr = xbps_string_create_cstring(pkgname);
|
|
--- tests/xbps/xbps-alternatives/main.sh.orig
|
|
+++ tests/xbps/xbps-alternatives/main.sh
|
|
@@ -429,6 +429,35 @@ update_pkgs_body() {
|
|
atf_check_equal $rv 0
|
|
}
|
|
|
|
+atf_test_case less_entries
|
|
+
|
|
+less_entries_pkgs_head() {
|
|
+ atf_set "descr" "xbps-alternatives: remove symlinks not provided by the new alternative"
|
|
+}
|
|
+less_entries_body() {
|
|
+ mkdir -p repo pkg_A/usr/bin pkg_B/usr/bin
|
|
+ touch pkg_A/usr/bin/A1 pkg_A/usr/bin/A2 pkg_B/usr/bin/B1
|
|
+ cd repo
|
|
+ xbps-create -A noarch -n A-1.1_1 -s "A pkg" --alternatives "1:1:/usr/bin/A1 1:2:/usr/bin/A2" ../pkg_A
|
|
+ atf_check_equal $? 0
|
|
+ xbps-create -A noarch -n B-1.1_1 -s "B pkg" --alternatives "1:1:/usr/bin/B1" ../pkg_B
|
|
+ atf_check_equal $? 0
|
|
+ xbps-rindex -d -a $PWD/*.xbps
|
|
+ atf_check_equal $? 0
|
|
+ cd ..
|
|
+
|
|
+ xbps-install -r root --repository=repo -ydv A B
|
|
+ atf_check_equal $? 0
|
|
+
|
|
+ xbps-alternatives -r root -s B
|
|
+ atf_check_equal $? 0
|
|
+
|
|
+ rv=1
|
|
+ [ -e root/usr/bin/2 ] || rv=0
|
|
+ atf_check_equal $rv 0
|
|
+}
|
|
+
|
|
+
|
|
atf_init_test_cases() {
|
|
atf_add_test_case register_one
|
|
atf_add_test_case register_one_dangling
|
|
@@ -441,4 +470,5 @@ atf_init_test_cases() {
|
|
atf_add_test_case set_pkg
|
|
atf_add_test_case set_pkg_group
|
|
atf_add_test_case update_pkgs
|
|
+ atf_add_test_case less_entries
|
|
}
|