aboutsummaryrefslogtreecommitdiff
path: root/bpkg/manifest-utility.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'bpkg/manifest-utility.hxx')
-rw-r--r--bpkg/manifest-utility.hxx115
1 files changed, 97 insertions, 18 deletions
diff --git a/bpkg/manifest-utility.hxx b/bpkg/manifest-utility.hxx
index 29d548d..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,6 +19,22 @@ 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&, 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, b_info_flags fl)
+ {
+ vector<package_info> r (package_b_info (o, dir_paths ({d}), fl));
+ return move (r[0]);
+ }
+
// Package naming schemes.
//
enum class package_scheme
@@ -48,16 +66,14 @@ namespace bpkg
version
parse_package_version (const char*,
bool allow_wildcard = false,
- bool fold_zero_revision = true);
+ version::flags fl = version::fold_zero_revision);
inline version
parse_package_version (const string& s,
bool allow_wildcard = false,
- bool fold_zero_revision = true)
+ version::flags fl = version::fold_zero_revision)
{
- return parse_package_version (s.c_str (),
- allow_wildcard,
- fold_zero_revision);
+ return parse_package_version (s.c_str (), allow_wildcard, fl);
}
// Extract the package constraint from either <name>[/<version>] or
@@ -66,10 +82,11 @@ namespace bpkg
// the package name is specified.
//
optional<version_constraint>
- parse_package_version_constraint (const char*,
- bool allow_wildcard = false,
- bool fold_zero_revision = true,
- bool version_only = false);
+ parse_package_version_constraint (
+ const char*,
+ bool allow_wildcard = false,
+ version::flags = version::fold_zero_revision,
+ bool version_only = false);
// If the passed location is a relative local path, then assume this is a
// relative path to the repository directory and complete it based on the
@@ -95,20 +112,82 @@ namespace bpkg
bool
repository_name (const string&);
- // Return the version of a package as provided by the build2 version module.
- // Return nullopt if the version module is disabled for the package (or the
- // build2 project directory doesn't contain the manifest file). Fail if the
- // directory is not a build2 project.
+ // Return the versions of packages as provided by the build2 version module
+ // together with the build2 project info the versions originate from (in
+ // case the caller may want to reuse it). Return nullopt as a package
+ // version if the version module is disabled for the package (or the build2
+ // project directory doesn't contain the manifest file). Fail if any of the
+ // specified directories is not a build2 project.
//
- // Note that if the package directory is under the version control, then the
+ // Note that if a package directory is under the version control, then the
// resulting version may be populated with the snapshot information (see
- // libbutl/standard-version.mxx for more details). Thus, this function can
- // be used for fixing up the package manifest version.
+ // libbutl/standard-version.hxx for more details). Thus, this function can
+ // be used for fixing up the package manifest versions.
//
class common_options;
- optional<version>
- package_version (const common_options&, const dir_path&);
+ struct package_version_info
+ {
+ optional<bpkg::version> version;
+ package_info info;
+ };
+
+ using package_version_infos = vector<package_version_info>;
+
+ package_version_infos
+ 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, b_info_flags fl)
+ {
+ package_version_infos r (package_versions (o, dir_paths ({d}), fl));
+ return move (r[0]);
+ }
+
+ // Caclulate the checksum of the manifest file located in the package source
+ // directory and the subproject set (see package::manifest_checksum).
+ //
+ // 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). 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&,
+ const dir_path& src_dir,
+ const package_info*);
+
+ // Calculate the checksum of the buildfiles using the *-build manifest
+ // values and, if the package source directory is specified (not empty),
+ // build-file values. If the package source directory is specified, then
+ // also use the files it contains for unspecified values. If additionally
+ // the alt_naming flag is specified, then verify the package's buildfile
+ // naming scheme against its value and fail on mismatch.
+ //
+ string
+ package_buildfiles_checksum (const optional<string>& bootstrap_build,
+ const optional<string>& root_build,
+ const vector<buildfile>& buildfiles,
+ const dir_path& src_dir = {},
+ const vector<path>& buildfile_paths = {},
+ optional<bool> alt_naming = nullopt);
+
+ // Load the package's buildfiles for unspecified manifest values. Throw
+ // std::runtime_error for underlying errors (unable to find bootstrap.build,
+ // unable to read from file, etc). Optionally convert paths used in the
+ // potential error description to be relative to the package source
+ // directory.
+ //
+ // Note that before calling this function you need to expand the build-file
+ // manifest values into the respective *-build values, for example, by
+ // calling manifest::load_files().
+ //
+ void
+ load_package_buildfiles (package_manifest&,
+ const dir_path& src_dir,
+ bool err_path_relative = false);
}
#endif // BPKG_MANIFEST_UTILITY_HXX