From f0c4ddcc96ae4eea5e158359bc21f51c3261bdd2 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 16 Apr 2021 22:04:22 +0300 Subject: Match package spec local repository locations in pkg-build case-insensitively on Windows --- bpkg/database.cxx | 10 ++++++++-- bpkg/package.hxx | 10 +++++++++- bpkg/package.xml | 6 ++++++ bpkg/pkg-build.cxx | 29 +++++++++++++++++++++++++---- 4 files changed, 48 insertions(+), 7 deletions(-) (limited to 'bpkg') diff --git a/bpkg/database.cxx b/bpkg/database.cxx index 7ba19f0..e355860 100644 --- a/bpkg/database.cxx +++ b/bpkg/database.cxx @@ -41,15 +41,21 @@ namespace bpkg // Register the data migration functions. // -#if 0 template using migration_entry = odb::data_migration_entry; static const migration_entry<8> migrate_v8 ([] (odb::database& db) { + for (shared_ptr r: pointer_result (db.query ())) + { + if (!r->name.empty ()) // Non-root repository? + { + r->local = r->location.local (); + db.update (r); + } + } }); -#endif database open (const dir_path& d, tracer& tr, bool create) diff --git a/bpkg/package.hxx b/bpkg/package.hxx index e7379b3..ad45fa8 100644 --- a/bpkg/package.hxx +++ b/bpkg/package.hxx @@ -27,7 +27,7 @@ // #define DB_SCHEMA_VERSION_BASE 6 -#pragma db model version(DB_SCHEMA_VERSION_BASE, 7, closed) +#pragma db model version(DB_SCHEMA_VERSION_BASE, 8, closed) namespace bpkg { @@ -390,11 +390,19 @@ namespace bpkg optional certificate; // PEM representation. fragments_type fragments; + // While we could potentially calculate this flag on the fly, that would + // complicate the database queries significantly. + // + optional local; // nullopt for root repository. + public: explicit repository (repository_location l): location (move (l)) { name = location.canonical_name (); + + if (!name.empty ()) // Non-root? + local = location.local (); } // Database mapping. diff --git a/bpkg/package.xml b/bpkg/package.xml index 2b94c71..55e3a9a 100644 --- a/bpkg/package.xml +++ b/bpkg/package.xml @@ -1,4 +1,10 @@ + + + + + + diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 9d9b384..082696e 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -2620,17 +2620,38 @@ namespace bpkg { using query = query; - auto q (db.query (query::location.url == l)); - auto i (q.begin ()); + // For case-insensitive filesystems (Windows) we need to match the + // location case-insensitively against the local repository URLs + // and case-sensitively against the remote ones. + // + // Note that the root repository will never be matched, since its + // location is empty. + // + const auto& url (query::location.url); + +#ifndef _WIN32 + query q (url == l); +#else + string u (url.table ()); + u += '.'; + u += url.column (); + + query q ( + (!query::local && url == l) || + ( query::local && u + " COLLATE nocase = " + query::_val (l))); +#endif + + auto rs (db.query (q)); + auto i (rs.begin ()); - if (i != q.end ()) + if (i != rs.end ()) { r = i.load (); // Fallback to parsing the location if several repositories // match. // - if (++i != q.end ()) + if (++i != rs.end ()) r = nullptr; } } -- cgit v1.1