aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS20
-rw-r--r--bpkg/pkg-build-collect.cxx42
-rw-r--r--bpkg/pkg-build-collect.hxx4
-rw-r--r--bpkg/pkg-build.cxx8
-rw-r--r--bpkg/system-package-manager-debian.cxx9
-rw-r--r--bpkg/system-package-manager-fedora.cxx58
-rw-r--r--bpkg/system-package-manager-fedora.test.testscript36
-rwxr-xr-xdoc/cli.sh2
-rw-r--r--manifest12
9 files changed, 142 insertions, 49 deletions
diff --git a/NEWS b/NEWS
index 24f2673..b83bfaa 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/doc/cli.sh b/doc/cli.sh
index 326d63c..825d84d 100755
--- a/doc/cli.sh
+++ b/doc/cli.sh
@@ -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.
diff --git a/manifest b/manifest
index 07e97ff..fb732ee 100644
--- a/manifest
+++ b/manifest
@@ -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)