aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bpkg/manifest-utility.cxx14
-rw-r--r--bpkg/manifest-utility.hxx19
-rw-r--r--bpkg/package.hxx19
-rw-r--r--bpkg/pkg-build.cxx6
-rw-r--r--bpkg/pkg-unpack.cxx6
-rw-r--r--bpkg/rep-fetch.cxx9
-rw-r--r--tests/common/git/README2
-rw-r--r--tests/pkg-checkout.testscript9
8 files changed, 54 insertions, 30 deletions
diff --git a/bpkg/manifest-utility.cxx b/bpkg/manifest-utility.cxx
index 7a431b3..76db3a7 100644
--- a/bpkg/manifest-utility.cxx
+++ b/bpkg/manifest-utility.cxx
@@ -24,7 +24,9 @@ namespace bpkg
const path manifest_file ("manifest");
vector<package_info>
- package_b_info (const common_options& o, const dir_paths& ds, bool ext_mods)
+ package_b_info (const common_options& o,
+ const dir_paths& ds,
+ b_info_flags fl)
{
path b (name_b (o));
@@ -33,7 +35,7 @@ namespace bpkg
{
b_info (r,
ds,
- ext_mods,
+ fl,
verb,
[] (const char* const args[], size_t n)
{
@@ -309,9 +311,11 @@ namespace bpkg
}
package_version_infos
- package_versions (const common_options& o, const dir_paths& ds)
+ package_versions (const common_options& o,
+ const dir_paths& ds,
+ b_info_flags fl)
{
- vector<b_project_info> pis (package_b_info (o, ds, false /* ext_mods */));
+ vector<b_project_info> pis (package_b_info (o, ds, fl));
package_version_infos r;
r.reserve (pis.size ());
@@ -346,7 +350,7 @@ namespace bpkg
const vector<package_info::subproject>& sps (
pi != nullptr
? pi->subprojects
- : package_b_info (o, d, false /* ext_mods */).subprojects);
+ : package_b_info (o, d, b_info_flags::subprojects).subprojects);
for (const package_info::subproject& sp: sps)
cs.append (sp.path.string ());
diff --git a/bpkg/manifest-utility.hxx b/bpkg/manifest-utility.hxx
index 85fbaee..a5ea962 100644
--- a/bpkg/manifest-utility.hxx
+++ b/bpkg/manifest-utility.hxx
@@ -7,6 +7,8 @@
#include <libbpkg/manifest.hxx>
#include <libbpkg/package-name.hxx>
+#include <libbutl/b.hxx> // b_info_flags
+
#include <bpkg/types.hxx>
#include <bpkg/utility.hxx>
@@ -17,17 +19,19 @@ namespace bpkg
extern const path signature_file; // signature.manifest
extern const path manifest_file; // manifest
+ using butl::b_info_flags;
+
// Obtain build2 projects info for package source or output directories.
//
vector<package_info>
- package_b_info (const common_options&, const dir_paths&, bool ext_mods);
+ package_b_info (const common_options&, const dir_paths&, b_info_flags);
// As above but return the info for a single package directory.
//
inline package_info
- package_b_info (const common_options& o, const dir_path& d, bool ext_mods)
+ package_b_info (const common_options& o, const dir_path& d, b_info_flags fl)
{
- vector<package_info> r (package_b_info (o, dir_paths ({d}), ext_mods));
+ vector<package_info> r (package_b_info (o, dir_paths ({d}), fl));
return move (r[0]);
}
@@ -131,14 +135,14 @@ namespace bpkg
using package_version_infos = vector<package_version_info>;
package_version_infos
- package_versions (const common_options&, const dir_paths&);
+ package_versions (const common_options&, const dir_paths&, b_info_flags);
// As above but return the version of a single package.
//
inline package_version_info
- package_version (const common_options& o, const dir_path& d)
+ package_version (const common_options& o, const dir_path& d, b_info_flags fl)
{
- package_version_infos r (package_versions (o, dir_paths ({d})));
+ package_version_infos r (package_versions (o, dir_paths ({d}), fl));
return move (r[0]);
}
@@ -147,7 +151,8 @@ namespace bpkg
//
// Pass the build2 project info for the package, if available, to speed up
// the call and NULL otherwise (in which case it will be queried by the
- // implementation).
+ // implementation). In the former case it is assumed that the package info
+ // has been retrieved with the b_info_flags::subprojects flag.
//
string
package_checksum (const common_options&,
diff --git a/bpkg/package.hxx b/bpkg/package.hxx
index 51f7219..4f4f16b 100644
--- a/bpkg/package.hxx
+++ b/bpkg/package.hxx
@@ -1361,21 +1361,22 @@ namespace bpkg
//
// Pass the build2 project info for the package, if available, to speed up
// the call and NULL otherwise (in which case it will be queried by the
- // implementation).
+ // implementation). In the former case it is assumed that the package info
+ // has been retrieved with the b_info_flags::subprojects flag.
//
// Notes:
//
// - The package directory is considered an iteration of the package if this
// upstream version and revision is already present (selected) in the
// configuration and has a source directory. If that's the case, then the
- // specified directory path and the checksum of the manifest file it
- // contains are compared to the ones of the package present in the
- // configuration. If both match, then the present package version
- // (including its iteration, if any) is returned. Otherwise (the package
- // has moved and/or the packaging information has changed), the present
- // package version with the incremented iteration number is returned. Note
- // that the directory path is matched only for the external selected
- // packages.
+ // specified directory path and the package checksum (see
+ // package_checksum() for details) are compared to the ones of the package
+ // present in the configuration. If both match, then the present package
+ // version (including its iteration, if any) is returned. Otherwise (the
+ // package has moved and/or the package information has changed), the
+ // present package version with the incremented iteration number is
+ // returned. Note that the directory path is matched only for the external
+ // selected packages.
//
// - Only a single package iteration is valid per version in the
// configuration. This, in particular, means that a package of the
diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx
index a5dd813..4e88fa1 100644
--- a/bpkg/pkg-build.cxx
+++ b/bpkg/pkg-build.cxx
@@ -2257,7 +2257,11 @@ namespace bpkg
true /* load_buildfiles */,
[&o, &d, &pvi] (version& v)
{
- pvi = package_version (o, d);
+ // Note that we also query subprojects since the package
+ // information will be used for the subsequent
+ // package_iteration() call.
+ //
+ pvi = package_version (o, d, b_info_flags::subprojects);
if (pvi.version)
v = move (*pvi.version);
diff --git a/bpkg/pkg-unpack.cxx b/bpkg/pkg-unpack.cxx
index 48a64ea..8f01a8a 100644
--- a/bpkg/pkg-unpack.cxx
+++ b/bpkg/pkg-unpack.cxx
@@ -221,7 +221,11 @@ namespace bpkg
false /* load_buildfiles */,
[&o, &d, &pvi] (version& v)
{
- pvi = package_version (o, d);
+ // Note that we also query subprojects since the package
+ // information will be used for the subsequent
+ // package_iteration() call.
+ //
+ pvi = package_version (o, d, b_info_flags::subprojects);
if (pvi.version)
v = move (*pvi.version);
diff --git a/bpkg/rep-fetch.cxx b/bpkg/rep-fetch.cxx
index 30c429f..17536da 100644
--- a/bpkg/rep-fetch.cxx
+++ b/bpkg/rep-fetch.cxx
@@ -331,8 +331,15 @@ namespace bpkg
pds.push_back (move (d));
}
+ // Note that for the directory-based repositories we also query
+ // subprojects since the package information will be used for the
+ // subsequent package_iteration() call (see below).
+ //
if (bs)
- pvs = package_versions (co, pds);
+ pvs = package_versions (co, pds,
+ (rl.directory_based ()
+ ? b_info_flags::subprojects
+ : b_info_flags::none));
}
// Parse package manifests, fixing up their versions.
diff --git a/tests/common/git/README b/tests/common/git/README
index 737cd83..5b4781b 100644
--- a/tests/common/git/README
+++ b/tests/common/git/README
@@ -8,7 +8,7 @@ before modification, and
$ ./pack
-afterwrds.
+afterwards.
Also note that config files under .git/ subdirectory refer to the submodule
repositories using absolute paths. So prior to pulling in subproject directory
diff --git a/tests/pkg-checkout.testscript b/tests/pkg-checkout.testscript
index 69e211c..1ec8b37 100644
--- a/tests/pkg-checkout.testscript
+++ b/tests/pkg-checkout.testscript
@@ -179,6 +179,7 @@ else
$* links/1.0.1 2>>~%EOE% != 0
checking out links/1.0.1
distributing links/1.0.1
+ %warning: skipping dangling symlink .+%
%error: unable to stat .+%
EOE
else
@@ -193,16 +194,14 @@ else
# Cyclic symlinks in the repository.
#
+ $rep_fetch "$rep/links.git#v1.0.2";
+
if $posix
- $rep_fetch "$rep/links.git#v1.0.2" 2>>~%EOE% != 0
+ $* links/1.0.2 2>>~%EOE% != 0
%.*
%error: unable to iterate over .+%
- warning: repository state is now broken and will be cleaned up
- info: run 'bpkg rep-fetch' to update
EOE
else
- $rep_fetch "$rep/links.git#v1.0.2"
-
$* links/1.0.2 2>>~%EOE% != 0
checking out links/1.0.2
%.*