diff --git a/srcpkgs/xbps-static/template b/srcpkgs/xbps-static/template index e2428296cb5..bd282deb7b8 100644 --- a/srcpkgs/xbps-static/template +++ b/srcpkgs/xbps-static/template @@ -3,7 +3,7 @@ # NOTE: keep this package synchronized with "srcpkgs/xbps". pkgname=xbps-static version=0.50 -revision=1 +revision=2 build_style=configure short_desc="The XBPS package system utilities - static binaries" maintainer="Juan RP " diff --git a/srcpkgs/xbps/patches/conflicts-with-hold.patch b/srcpkgs/xbps/patches/conflicts-with-hold.patch new file mode 100644 index 00000000000..ae5f0222305 --- /dev/null +++ b/srcpkgs/xbps/patches/conflicts-with-hold.patch @@ -0,0 +1,178 @@ +--- lib/transaction_conflicts.c ++++ lib/transaction_conflicts.c +@@ -39,16 +39,16 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + xbps_dictionary_t pkgd, tpkgd; + xbps_object_t obj; + xbps_object_iterator_t iter; +- const char *cfpkg, *repopkgver, *pkgver, *atract; ++ const char *cfpkg, *repopkgver, *pkgver, *tract; + char *pkgname, *repopkgname, *buf; + + pkg_cflicts = xbps_dictionary_get(pkg_repod, "conflicts"); + if (xbps_array_count(pkg_cflicts) == 0) + return; + +- if (xbps_dictionary_get_cstring_nocopy(pkg_repod, "transaction", &atract)) { +- /* ignore pkgs to be removed */ +- if (strcmp(atract, "remove") == 0) ++ if (xbps_dictionary_get_cstring_nocopy(pkg_repod, "transaction", &tract)) { ++ /* ignore pkgs to be removed or on hold */ ++ if (!strcmp(tract, "remove") || !strcmp(tract, "hold")) + return; + } + +@@ -68,6 +68,11 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + */ + if ((pkgd = xbps_pkgdb_get_pkg(xhp, cfpkg)) || + (pkgd = xbps_pkgdb_get_virtualpkg(xhp, cfpkg))) { ++ /* If the conflicting pkg is on hold, ignore it */ ++ if (xbps_dictionary_get(pkgd, "hold")) ++ continue; ++ ++ /* Ignore itself */ + xbps_dictionary_get_cstring_nocopy(pkgd, + "pkgver", &pkgver); + pkgname = xbps_pkg_name(pkgver); +@@ -81,11 +86,11 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + * ignore it. + */ + if ((tpkgd = xbps_find_pkg_in_array(array, pkgname, NULL))) { +- const char *tract; +- + xbps_dictionary_get_cstring_nocopy(tpkgd, + "transaction", &tract); +- if (strcmp(tract, "remove")) { ++ if (!strcmp(tract, "install") || ++ !strcmp(tract, "update") || ++ !strcmp(tract, "hold")) { + free(pkgname); + continue; + } +@@ -93,7 +98,7 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + free(pkgname); + xbps_dbg_printf(xhp, "found conflicting installed " + "pkg %s with pkg in transaction %s " +- "(matched by %s)\n", pkgver, repopkgver, cfpkg); ++ "(matched by %s [trans])\n", pkgver, repopkgver, cfpkg); + buf = xbps_xasprintf("CONFLICT: %s with " + "installed pkg %s (matched by %s)", + repopkgver, pkgver, cfpkg); +@@ -108,6 +113,13 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + */ + if ((pkgd = xbps_find_pkg_in_array(array, cfpkg, NULL)) || + (pkgd = xbps_find_virtualpkg_in_array(xhp, array, cfpkg, NULL))) { ++ /* ignore pkgs to be removed or on hold */ ++ if (xbps_dictionary_get_cstring_nocopy(pkgd, ++ "transaction", &tract)) { ++ if (!strcmp(tract, "remove") || !strcmp(tract, "hold")) ++ continue; ++ } ++ /* ignore itself */ + xbps_dictionary_get_cstring_nocopy(pkgd, + "pkgver", &pkgver); + pkgname = xbps_pkg_name(pkgver); +@@ -118,11 +130,11 @@ pkg_conflicts_trans(struct xbps_handle *xhp, xbps_array_t array, + } + free(pkgname); + xbps_dbg_printf(xhp, "found conflicting pkgs in " +- "transaction %s <-> %s (matched by %s)\n", ++ "transaction %s <-> %s (matched by %s [trans])\n", + pkgver, repopkgver, cfpkg); + buf = xbps_xasprintf("CONFLICT: %s with " +- "%s in transaction (mached by %s)", +- repopkgver, pkgver); ++ "%s in transaction (matched by %s)", ++ repopkgver, pkgver, cfpkg); + if (!xbps_match_string_in_array(trans_cflicts, buf)) + xbps_array_add_cstring(trans_cflicts, buf); + +@@ -142,7 +154,7 @@ pkgdb_conflicts_cb(struct xbps_handle *xhp, xbps_object_t obj, + xbps_dictionary_t pkgd; + xbps_object_t obj2; + xbps_object_iterator_t iter; +- const char *cfpkg, *repopkgver, *pkgver; ++ const char *cfpkg, *repopkgver, *pkgver, *tract; + char *pkgname, *repopkgname, *buf; + + pkg_cflicts = xbps_dictionary_get(obj, "conflicts"); +@@ -169,6 +181,13 @@ pkgdb_conflicts_cb(struct xbps_handle *xhp, xbps_object_t obj, + (pkgd = xbps_find_virtualpkg_in_array(xhp, pkgs, cfpkg, NULL))) { + xbps_dictionary_get_cstring_nocopy(pkgd, + "pkgver", &pkgver); ++ /* ignore pkgs to be removed or on hold */ ++ if (xbps_dictionary_get_cstring_nocopy(pkgd, ++ "transaction", &tract)) { ++ if (!strcmp(tract, "remove") || !strcmp(tract, "hold")) ++ continue; ++ } ++ /* ignore itself */ + pkgname = xbps_pkg_name(pkgver); + assert(pkgname); + if (strcmp(pkgname, repopkgname) == 0) { +@@ -177,7 +196,7 @@ pkgdb_conflicts_cb(struct xbps_handle *xhp, xbps_object_t obj, + } + free(pkgname); + xbps_dbg_printf(xhp, "found conflicting pkgs in " +- "transaction %s <-> %s (matched by %s)\n", ++ "transaction %s <-> %s (matched by %s [pkgdb])\n", + pkgver, repopkgver, cfpkg); + buf = xbps_xasprintf("CONFLICT: %s with " + "%s in transaction (matched by %s)", +--- tests/xbps/libxbps/shell/conflicts.sh ++++ tests/xbps/libxbps/shell/conflicts.sh +@@ -27,6 +27,47 @@ conflicts_trans_body() { + atf_check_equal $(xbps-query -r root -l|wc -l) 0 + } + ++conflicts_trans_hold_head() { ++ atf_set "descr" "Tests for pkg conflicts: conflicting pkg with on-hold installed pkg" ++} ++ ++conflicts_trans_hold_body() { ++ mkdir some_repo ++ mkdir -p pkg_{A,B}/usr/bin ++ cd some_repo ++ xbps-create -A noarch -n A-1.0_1 -s "A pkg" --conflicts "vpkg>19_1" ../pkg_A ++ atf_check_equal $? 0 ++ xbps-create -A noarch -n B-1.0_1 -s "B pkg" --provides "vpkg-19_1" ../pkg_B ++ atf_check_equal $? 0 ++ xbps-rindex -d -a $PWD/*.xbps ++ atf_check_equal $? 0 ++ cd .. ++ ++ xbps-install -r root --repository=$PWD/some_repo -dy A B ++ atf_check_equal $? 0 ++ ++ cd some_repo ++ xbps-create -A noarch -n A-1.1_1 -s "A pkg" --conflicts "vpkg>19_1" ../pkg_B ++ atf_check_equal $? 0 ++ xbps-create -A noarch -n B-1.1_1 -s "B pkg" --provides "vpkg-20_1" ../pkg_B ++ atf_check_equal $? 0 ++ xbps-rindex -d -a $PWD/*.xbps ++ atf_check_equal $? 0 ++ cd .. ++ ++ echo "B updated to 1.1_1" ++ xbps-install -r root --repository=$PWD/some_repo -dyuv B ++ atf_check_equal $? 11 ++ ++ echo "B is now on hold" ++ xbps-pkgdb -r root -m hold B ++ xbps-install -r root --repository=$PWD/some_repo -dyuv ++ atf_check_equal $? 0 ++ ++ atf_check_equal $(xbps-query -r root -p pkgver A) A-1.1_1 ++ atf_check_equal $(xbps-query -r root -p pkgver B) B-1.0_1 ++} ++ + atf_test_case conflicts_trans_vpkg + + conflicts_trans_vpkg_head() { +@@ -242,6 +283,7 @@ conflicts_trans_installed_multi_body() { + + atf_init_test_cases() { + atf_add_test_case conflicts_trans ++ atf_add_test_case conflicts_trans_hold + atf_add_test_case conflicts_trans_vpkg + atf_add_test_case conflicts_trans_multi + atf_add_test_case conflicts_trans_installed diff --git a/srcpkgs/xbps/template b/srcpkgs/xbps/template index bfbf9c86064..027d3434545 100644 --- a/srcpkgs/xbps/template +++ b/srcpkgs/xbps/template @@ -1,7 +1,7 @@ # Template file for 'xbps' pkgname=xbps version=0.50 -revision=1 +revision=2 bootstrap=yes build_style=configure short_desc="The XBPS package system utilities"