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/pkg-build.cxx | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'bpkg/pkg-build.cxx') 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