diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2021-08-18 08:35:18 +0200 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2021-08-18 11:54:44 +0300 |
commit | 4e9e142a6564b2a73848e735f9a1b5bb744d6a83 (patch) | |
tree | 940d36bf1136ddcecec7318032ae6d59b07e50f6 /bpkg/rep-fetch.cxx | |
parent | cd315fecaf4c7473950c1610e06417634b416954 (diff) |
Also consider subproject directory names when calculating manifest checksums
Diffstat (limited to 'bpkg/rep-fetch.cxx')
-rw-r--r-- | bpkg/rep-fetch.cxx | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/bpkg/rep-fetch.cxx b/bpkg/rep-fetch.cxx index 80598c5..de6e3b7 100644 --- a/bpkg/rep-fetch.cxx +++ b/bpkg/rep-fetch.cxx @@ -192,7 +192,7 @@ namespace bpkg // Parse package manifests referenced by the package directory manifests. // - static vector<package_manifest> + static pair<vector<package_manifest>, vector<package_info>> parse_package_manifests (const common_options& co, const dir_path& repo_dir, vector<package_manifest>&& pms, @@ -200,8 +200,8 @@ namespace bpkg const repository_location& rl, const optional<string>& fragment) // For diagnostics. { - auto package_info = [&rl, &fragment] (const package_manifest& pm, - diag_record& dr) + auto add_package_info = [&rl, &fragment] (const package_manifest& pm, + diag_record& dr) { dr << "package "; @@ -218,8 +218,8 @@ namespace bpkg // files and retrieve the package versions via the single `b info` call. // While at it cache the manifest paths for the future use. // - paths mfs; - vector<optional<version>> pvs; + paths mfs; + package_version_infos pvs; { mfs.reserve (pms.size ()); @@ -238,7 +238,7 @@ namespace bpkg { diag_record dr (fail); dr << "no manifest file for "; - package_info (pm, dr); + add_package_info (pm, dr); } mfs.push_back (move (f)); @@ -250,8 +250,9 @@ namespace bpkg // Parse package manifests, fixing up their versions. // - vector<package_manifest> r; - r.reserve (pms.size ()); + pair<vector<package_manifest>, vector<package_info>> r; + r.first.reserve (pms.size ()); + r.second.reserve (pms.size ()); for (size_t i (0); i != pms.size (); ++i) { @@ -266,7 +267,7 @@ namespace bpkg ifdstream ifs (f); manifest_parser mp (ifs, f.string ()); - optional<version>& pv (pvs[i]); + optional<version>& pv (pvs[i].version); package_manifest m ( mp, @@ -286,14 +287,15 @@ namespace bpkg { diag_record dr (fail (e.name, e.line, e.column)); dr << e.description << info; - package_info (pm, dr); + add_package_info (pm, dr); } catch (const io_error& e) { fail << "unable to read from " << f << ": " << e; } - r.emplace_back (move (pm)); + r.first.push_back (move (pm)); + r.second.push_back (move (pvs[i].info)); } return r; @@ -360,12 +362,16 @@ namespace bpkg rl, string () /* fragment */)); - fr.packages = parse_package_manifests (co, - rd, - move (pms), - iu, - rl, - empty_string /* fragment */); + pair<vector<package_manifest>, vector<package_info>> pmi ( + parse_package_manifests (co, + rd, + move (pms), + iu, + rl, + empty_string /* fragment */)); + + fr.packages = move (pmi.first); + fr.package_infos = move (pmi.second); // Expand file-referencing package manifest values. // @@ -520,12 +526,16 @@ namespace bpkg // Parse package manifests. // - fr.packages = parse_package_manifests (co, - td, - move (pms), - iu, - rl, - fr.friendly_name); + pair<vector<package_manifest>, vector<package_info>> pmi ( + parse_package_manifests (co, + td, + move (pms), + iu, + rl, + fr.friendly_name)); + + fr.packages = move (pmi.first); + fr.package_infos = move (pmi.second); // Expand file-referencing package manifest values checking out // submodules, if required. @@ -890,12 +900,19 @@ namespace bpkg if (exists && !full_fetch) rep_remove_package_locations (db, t, rf->name); - for (package_manifest& pm: fr.packages) + vector<package_manifest>& pms (fr.packages); + const vector<package_info>& pis (fr.package_infos); + + for (size_t i (0); i != pms.size (); ++i) { + package_manifest& pm (pms[i]); + // Fix-up the external package version iteration number. // if (rl.directory_based ()) { + assert (!pis.empty ()); + // Note that we can't check if the external package of this upstream // version and revision is already available in the configuration // until we fetch all the repositories, as some of the available @@ -909,7 +926,8 @@ namespace bpkg path_cast<dir_path> (rl.path () / *pm.location), pm.name, pm.version, - false /* check_external */)); + &pis[i], + false /* check_external */)); if (v) pm.version = move (*v); |