diff --git a/lib/package_alternatives.c b/lib/package_alternatives.c index 3c66f57b..b2867cdd 100644 --- a/lib/package_alternatives.c +++ b/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); diff --git a/tests/xbps/xbps-alternatives/main.sh b/tests/xbps/xbps-alternatives/main.sh index adb4be2a..3d0f57d8 100644 --- a/tests/xbps/xbps-alternatives/main.sh +++ b/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 }