From bc24eec7208187e171fd61ced7130fd8e2828257 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 14 Mar 2018 00:54:05 +0300 Subject: Add support for version iteration --- bpkg/package.cxx | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) (limited to 'bpkg/package.cxx') diff --git a/bpkg/package.cxx b/bpkg/package.cxx index 2e5bffe..966be72 100644 --- a/bpkg/package.cxx +++ b/bpkg/package.cxx @@ -8,12 +8,14 @@ #include // find_if() #include +#include +#include using namespace std; namespace bpkg { - const version wildcard_version (0, "0", nullopt, 0); + const version wildcard_version (0, "0", nullopt, 0, 0); // available_package_id // @@ -158,6 +160,79 @@ namespace bpkg return os; } + optional + package_iteration (const common_options& o, + const dir_path& c, + transaction& t, + const dir_path& d, + const string& n, + const version& v, + bool check_external) + { + tracer trace ("package_iteration"); + + database& db (t.database ()); + tracer_guard tg (db, trace); + + if (check_external) + { + using query = query; + + query q ( + query::package::id.name == n && + compare_version_eq (query::package::id.version, v, true, false)); + + for (const auto& pr: db.query (q)) + { + const shared_ptr& r (pr.repository); + + if (r->location.directory_based ()) + fail << "external package " << n << '/' << v + << " is already available from " + << r->location.canonical_name (); + } + } + + shared_ptr p (db.find (n)); + + if (p == nullptr || !p->src_root || + compare_version_ne (v, p->version, true, false)) + return nullopt; + + string mc (sha256 (o, d / manifest_file)); + + assert (p->manifest_checksum); + + bool changed (mc != *p->manifest_checksum); + + // If the manifest didn't changed but the selected package points to an + // external source directory, then we also check if the directory have + // moved. + // + if (!changed && p->external ()) + { + dir_path src_root (p->src_root->absolute () + ? *p->src_root + : c / *p->src_root); + + // We need to complete and normalize the source directory as it may + // generally be completed against the configuration directory (unlikely + // but possible), that can be relative and/or not normalized. + // + src_root.complete ().normalize (); + + changed = src_root != dir_path (d).complete ().normalize (); + } + + return !changed + ? p->version + : version (v.epoch, + v.upstream, + v.release, + v.revision, + p->version.iteration + 1); + } + // state // string -- cgit v1.1