diff options
-rw-r--r-- | NEWS | 20 | ||||
-rw-r--r-- | bpkg/pkg-build-collect.cxx | 42 | ||||
-rw-r--r-- | bpkg/pkg-build-collect.hxx | 4 | ||||
-rw-r--r-- | bpkg/pkg-build.cxx | 8 | ||||
-rw-r--r-- | bpkg/system-package-manager-debian.cxx | 9 | ||||
-rw-r--r-- | bpkg/system-package-manager-fedora.cxx | 58 | ||||
-rw-r--r-- | bpkg/system-package-manager-fedora.test.testscript | 36 | ||||
-rwxr-xr-x | doc/cli.sh | 2 | ||||
-rw-r--r-- | manifest | 12 |
9 files changed, 142 insertions, 49 deletions
@@ -1,3 +1,23 @@ +Version 0.17.0 + + * Support for preserving existing package configuration on up/downgrade + and reconfiguration. + + * Support for the enable clause in the `tests` package manifest value. + + * New per package configuration *-build-*email manifest values. + + * New build-bot package manifest value allows specifying package-custom + build bots. + + * Support for specifying package archives and directories as dependencies + for pkg-build. + + * New `none` value for the --recursive option in pkg-bindist. + + * Empty --archive-lang* option values in pkg-bindist are now treated as a + request to clear previous entries. + Version 0.16.0 * System package manager query/installation support for Debian and Fedora diff --git a/bpkg/pkg-build-collect.cxx b/bpkg/pkg-build-collect.cxx index e99557a..c7be96a 100644 --- a/bpkg/pkg-build-collect.cxx +++ b/bpkg/pkg-build-collect.cxx @@ -1639,27 +1639,35 @@ namespace bpkg // Pick with the following preference order: user selection over // implicit one, source package over a system one, replacement version - // over a non-replacement one, newer version over an older one. So get - // the preferred into p1 and the other into p2. + // over a non-replacement one, deorphaning target version over the + // other one, newer version over an older one. So get the preferred + // into p1 and the other into p2. // { - const version& v1 (p1->available_version ()); - const version& v2 (p2->available_version ()); - - int us (p1->user_selection () - p2->user_selection ()); - int sf (p1->system - p2->system); - int rv (replacement_version != nullptr - ? (v1 == *replacement_version) - (v2 == *replacement_version) - : 0); - - if (us < 0 || - (us == 0 && sf > 0) || - (us == 0 && - sf == 0 && - (rv < 0 || (rv == 0 && v2 > v1)))) + auto prefer_p2 = [p1, p2, replacement_version] () { + const version& v1 (p1->available_version ()); + const version& v2 (p2->available_version ()); + + if (int us = p1->user_selection () - p2->user_selection ()) + return us < 0; + + if (int sf = p1->system - p2->system) + return sf > 0; + + if (int rv = replacement_version != nullptr + ? (v1 == *replacement_version) - (v2 == *replacement_version) + : 0) + return rv < 0; + + if (int d = p1->deorphan - p2->deorphan) + return d < 0; + + return v2 > v1; + }; + + if (prefer_p2 ()) swap (p1, p2); - } } // If the versions differ, pick the satisfactory one and if both are diff --git a/bpkg/pkg-build-collect.hxx b/bpkg/pkg-build-collect.hxx index 5c8a635..493e0f1 100644 --- a/bpkg/pkg-build-collect.hxx +++ b/bpkg/pkg-build-collect.hxx @@ -311,7 +311,9 @@ namespace bpkg // If true, then this package is requested to be deorphaned. Can only be // true if the package is already selected and is orphaned. Used by the // unsatisfied dependency constraints resolution logic (see - // try_replace_dependency() in pkg-build.cxx for details). + // try_replace_dependency() in pkg-build.cxx for details). Also, the + // package deorphaning target versions are normally preferred over the + // other versions by collect_build(). // bool deorphan; diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 6a9ad7d..de8d3ec 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -8019,7 +8019,13 @@ namespace bpkg // Distinguish between the package and archive/directory cases. // - const package_location& pl (ap->locations[0]); // Got to have one. + assert (!ap->locations.empty ()); // Got to have one. + + const package_location& pl (ap->locations[0]); + + // The package location always belongs to some repository fragment. + // + assert (pl.repository_fragment != nullptr); if (pl.repository_fragment.object_id () != "") // Special root? { diff --git a/bpkg/system-package-manager-debian.cxx b/bpkg/system-package-manager-debian.cxx index 8b27e37..b772352 100644 --- a/bpkg/system-package-manager-debian.cxx +++ b/bpkg/system-package-manager-debian.cxx @@ -4,6 +4,8 @@ #include <bpkg/system-package-manager-debian.hxx> #include <locale> +#include <thread> // this_thread::sleep_for() +#include <chrono> #include <libbutl/timestamp.hxx> #include <libbutl/filesystem.hxx> // permissions @@ -1487,6 +1489,13 @@ namespace bpkg } apt_get_install (specs); + + // Note that installing packages on Debian and Debian-like distributions + // may end up with asynchronous restart of some system services. That, + // in particular, may result in the network short-term unavailability. + // Thus, let's pause for a while before fetching the source packages. + // + std::this_thread::sleep_for (std::chrono::seconds (1)); } // Verify that versions we have promised in status() match what actually diff --git a/bpkg/system-package-manager-fedora.cxx b/bpkg/system-package-manager-fedora.cxx index 3b79c50..61ded1a 100644 --- a/bpkg/system-package-manager-fedora.cxx +++ b/bpkg/system-package-manager-fedora.cxx @@ -4,6 +4,8 @@ #include <bpkg/system-package-manager-fedora.hxx> #include <locale> +#include <thread> // this_thread::sleep_for() +#include <chrono> #include <bpkg/diagnostics.hxx> @@ -1738,11 +1740,46 @@ namespace bpkg // or not we will also always run `dnf mark install` afterwards for all // the packages to mark them as installed by the user. // - // Note also that for partially/not installed we don't specify the - // version, expecting the candidate version to be installed. We, however, - // still specify the candidate architecture in this case, since for + // Note also that for partially/not installed packages we used to not + // specify the version, expecting the candidate version to always be + // installed (we did specify the candidate architecture though, since for // reasons unknown dnf may install a package of a different architecture - // otherwise. + // otherwise). This, however, turned out to not always be the case. + // Moreover, we have observed such an undocumented behavior, that if the + // package versions are not specified, then the dnf-install command + // outcome may depend on the order of the packages specified on the + // command line: + // + // $ dnf list expat.x86_64 expat-devel.x86_64 + // Installed Packages + // expat.x86_64 2.5.0-3.fc39 @fedora + // Available Packages + // expat.x86_64 2.6.2-1.fc39 updates + // expat-devel.x86_64 2.6.2-1.fc39 updates + // + // $ sudo dnf install expat-devel.x86_64 expat.x86_64 + // Installing: + // expat-devel x86_64 2.6.2-1.fc39 updates 54 k + // Upgrading: + // expat x86_64 2.6.2-1.fc39 updates 114 k + // + // $ sudo dnf install expat.x86_64 expat-devel.x86_64 + // Installing: + // expat-devel x86_64 2.5.0-3.fc39 fedora 52 k + // + // $ sudo dnf install expat.x86_64 + // Nothing to do. + // + // $ sudo dnf install expat-devel.x86_64 + // Installing: + // expat-devel x86_64 2.6.2-1.fc39 updates 54 k + // Upgrading: + // expat x86_64 2.6.2-1.fc39 updates 114 k + // + // Thus, we now explicitly specify the versions for the partially/not + // installed packages as well. While this approach may potentially result + // in unnecessary upgrades (in the above example we would prefer to just + // install expat-devel 2.5.0-3), it feels much simpler and more robust. // bool install (false); @@ -1760,7 +1797,8 @@ namespace bpkg for (const package_info& pi: ps.package_infos) { string n (pi.name); - string v (fi ? pi.installed_version : string ()); + //string v (fi ? pi.installed_version : string ()); + string v (fi ? pi.installed_version : pi.candidate_version); string a (fi ? pi.installed_arch : pi.candidate_arch); auto i (find_if (pkgs.begin (), pkgs.end (), @@ -1810,8 +1848,18 @@ namespace bpkg // Install. // if (install) + { dnf_install (specs); + // Note that installing packages on Fedora and Fedora-like distributions + // may end up with asynchronous restart of some system services (see the + // %systemd_postun_with_restart RPM macro for details). That, in + // particular, may result in the network short-term unavailability. + // Thus, let's pause for a while before fetching the source packages. + // + std::this_thread::sleep_for (std::chrono::seconds (1)); + } + // Mark as installed by the user. // dnf_mark_install (specs); diff --git a/bpkg/system-package-manager-fedora.test.testscript b/bpkg/system-package-manager-fedora.test.testscript index b1d5b8c..3655514 100644 --- a/bpkg/system-package-manager-fedora.test.testscript +++ b/bpkg/system-package-manager-fedora.test.testscript @@ -505,8 +505,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet libpq-devel pq-devel rpm <libpq-devel+pq-devel.info LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" libpq-devel-13.4-1.fc35.x86_64 <libpq-devel.requires LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info - sudo dnf install --quiet --assumeno libpq.x86_64 libpq-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly libpq.x86_64 libpq-devel.x86_64 + sudo dnf install --quiet --assumeno libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info EOE libpq 13.4 (libpq 13.4-1.fc35) part installed @@ -567,8 +567,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet libpq-devel pq-devel rpm <libpq-devel+pq-devel.info-fetched LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" libpq-devel-13.4-1.fc35.x86_64 <libpq-devel.requires-fetched LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info-fetched - sudo dnf install --quiet --assumeno libpq.x86_64 libpq-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly libpq.x86_64 libpq-devel.x86_64 + sudo dnf install --quiet --assumeno libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info-installed EOE libpq 13.4 (libpq 13.4-1.fc35) part installed @@ -621,8 +621,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet libpq-devel pq-devel rpm <libpq-devel+pq-devel.info LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" libpq-devel-13.3-3.fc35.x86_64 <libpq-devel.requires LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info - sudo dnf install --quiet --assumeno libpq.x86_64 libpq-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly libpq.x86_64 libpq-devel.x86_64 + sudo dnf install --quiet --assumeno libpq-13.3-3.fc35.x86_64 libpq-devel-13.3-3.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly libpq-13.3-3.fc35.x86_64 libpq-devel-13.3-3.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info-installed error: unexpected fedora package version for libpq info: expected: 13.3-3.fc35 @@ -677,8 +677,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet libpq-devel pq-devel rpm <libpq-devel+pq-devel.info LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" libpq-devel-13.4-1.fc35.x86_64 <libpq-devel.requires LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info - sudo dnf install --quiet --assumeno libpq.x86_64 libpq-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly libpq.x86_64 libpq-devel.x86_64 + sudo dnf install --quiet --assumeno libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly libpq-13.4-1.fc35.x86_64 libpq-devel-13.4-1.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet libpq rpm <libpq.info-installed EOE libpq 13.4 (libpq 13.4-1.fc35) not installed @@ -869,8 +869,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet libsqlite3-devel sqlite-devel rpm <libsqlite3-devel+sqlite-devel.info-fetched LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" sqlite-devel-3.36.0-3.fc35.x86_64 <sqlite-devel.requires-fetched LC_ALL=C dnf list --all --cacheonly --quiet sqlite-libs rpm <sqlite-libs.info-fetched - sudo dnf install --quiet --assumeno sqlite-libs.x86_64 sqlite-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly sqlite-libs.x86_64 sqlite-devel.x86_64 + sudo dnf install --quiet --assumeno sqlite-libs-3.36.0-3.fc35.x86_64 sqlite-devel-3.36.0-3.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly sqlite-libs-3.36.0-3.fc35.x86_64 sqlite-devel-3.36.0-3.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet sqlite-libs rpm <sqlite-libs.info-installed EOE libsqlite3 3.36.0 (sqlite-libs 3.36.0-3.fc35) not installed @@ -971,8 +971,8 @@ LC_ALL=C dnf list --all --cacheonly --quiet sqlite3 sqlite rpm <sqlite3+sqlite.info sudo dnf makecache --quiet --assumeno --refresh LC_ALL=C dnf list --all --cacheonly --quiet sqlite3 sqlite rpm <sqlite3+sqlite.info-fetched - sudo dnf install --quiet --assumeno sqlite.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly sqlite.x86_64 + sudo dnf install --quiet --assumeno sqlite-3.36.0-3.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly sqlite-3.36.0-3.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet sqlite rpm <sqlite.info-installed EOE sqlite3 3.36.0 (sqlite 3.36.0-3.fc35) not installed @@ -1131,8 +1131,8 @@ LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" ncurses-devel-6.2-8.20210508.fc35.x86_64 <ncurses-devel.requires-fetched LC_ALL=C dnf list --all --cacheonly --quiet ncurses-libs rpm <ncurses-libs.info-fetched LC_ALL=C dnf list --all --cacheonly --quiet ncurses-c++-libs ncurses-devel rpm <ncurses-c++-libs+ncurses-devel.info-fetched - sudo dnf install --quiet --assumeno ncurses-libs.x86_64 ncurses-devel.x86_64 ncurses-c++-libs.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly ncurses-libs.x86_64 ncurses-devel.x86_64 ncurses-c++-libs.x86_64 + sudo dnf install --quiet --assumeno ncurses-libs-6.2-8.20210508.fc35.x86_64 ncurses-devel-6.2-8.20210508.fc35.x86_64 ncurses-c++-libs-6.2-8.20210508.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly ncurses-libs-6.2-8.20210508.fc35.x86_64 ncurses-devel-6.2-8.20210508.fc35.x86_64 ncurses-c++-libs-6.2-8.20210508.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet ncurses-libs ncurses-c++-libs rpm <ncurses-libs+ncurses-c++-libs.info-installed EOE libncurses 6.2.0 (ncurses-libs 6.2-8.20210508.fc35) part installed @@ -1215,8 +1215,8 @@ LC_ALL=C dnf repoquery --requires --quiet --cacheonly --resolve --qf "%{name} %{arch} %{epoch}:%{version}-%{release}" ncurses-devel-6.2-8.20210508.fc35.x86_64 <ncurses-devel.requires-fetched LC_ALL=C dnf list --all --cacheonly --quiet ncurses-libs rpm <ncurses-libs.info-fetched LC_ALL=C dnf list --all --cacheonly --quiet ncurses-c++-libs ncurses-devel rpm <ncurses-c++-libs+ncurses-devel.info-fetched - sudo dnf install --quiet --assumeno ncurses-libs.x86_64 ncurses-devel.x86_64 ncurses-c++-libs.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly ncurses-libs.x86_64 ncurses-devel.x86_64 ncurses-c++-libs.x86_64 + sudo dnf install --quiet --assumeno ncurses-libs-6.2-8.20210508.fc35.x86_64 ncurses-devel-6.2-8.20210508.fc35.x86_64 ncurses-c++-libs-6.2-8.20210508.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly ncurses-libs-6.2-8.20210508.fc35.x86_64 ncurses-devel-6.2-8.20210508.fc35.x86_64 ncurses-c++-libs-6.2-8.20210508.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet ncurses-libs ncurses-c++-libs rpm <ncurses-libs+ncurses-c++-libs.info-installed EOE libncurses 6.2.0 (ncurses-libs 6.2-8.20210508.fc35) not installed @@ -1318,8 +1318,8 @@ sudo dnf makecache --quiet --assumeno --refresh LC_ALL=C dnf list --all --cacheonly --quiet libsigc++30 libsigc++30-devel rpm <libsigc++30+libsigc++30-devel.info LC_ALL=C dnf list --all --cacheonly --quiet libsigc++20 libsigc++20-devel rpm <libsigc++20+libsigc++20-devel.info - sudo dnf install --quiet --assumeno libsigc++20.x86_64 libsigc++20-devel.x86_64 - sudo dnf mark --quiet --assumeno install --cacheonly libsigc++20.x86_64 libsigc++20-devel.x86_64 + sudo dnf install --quiet --assumeno libsigc++20-2.10.7-3.fc35.x86_64 libsigc++20-devel-2.10.7-3.fc35.x86_64 + sudo dnf mark --quiet --assumeno install --cacheonly libsigc++20-2.10.7-3.fc35.x86_64 libsigc++20-devel-2.10.7-3.fc35.x86_64 LC_ALL=C dnf list --all --cacheonly --quiet libsigc++20 rpm <libsigc++20.info-installed EOE libsigc++ 2.10.7 (libsigc++20 2.10.7-3.fc35) part installed @@ -1,6 +1,6 @@ #! /usr/bin/env bash -version=0.17.0-a.0.z +version=0.18.0-a.0.z trap 'exit 1' ERR set -o errtrace # Trap in functions. @@ -1,6 +1,6 @@ : 1 name: bpkg -version: 0.17.0-a.0.z +version: 0.18.0-a.0.z project: build2 summary: build2 package dependency manager license: MIT @@ -14,10 +14,10 @@ email: users@build2.org build-warning-email: builds@build2.org builds: all : &host requires: c++14 -depends: * build2 >= 0.16.0- -depends: * bpkg >= 0.16.0- +depends: * build2 >= 0.16.0 +depends: * bpkg >= 0.16.0 # @@ DEP Should probably become conditional dependency. #requires: ? cli ; Only required if changing .cli files. -depends: libbutl [0.17.0-a.0.1 0.17.0-a.1) -depends: libbpkg [0.17.0-a.0.1 0.17.0-a.1) -depends: build2 [0.17.0-a.0.1 0.17.0-a.1) +depends: libbutl [0.18.0-a.0.1 0.18.0-a.1) +depends: libbpkg [0.18.0-a.0.1 0.18.0-a.1) +depends: build2 [0.18.0-a.0.1 0.18.0-a.1) |