diff options
-rw-r--r-- | libbpkg/manifest.cxx | 21 | ||||
-rw-r--r-- | tests/repository-location/driver.cxx | 12 |
2 files changed, 29 insertions, 4 deletions
diff --git a/libbpkg/manifest.cxx b/libbpkg/manifest.cxx index 016e88c..210aa3b 100644 --- a/libbpkg/manifest.cxx +++ b/libbpkg/manifest.cxx @@ -3766,6 +3766,19 @@ namespace bpkg // path sp; + // Convert the local repository location path to lower case on Windows. + // + // Note that we need to do that prior to stripping the special path + // components to match them case-insensitively, so, for example, the + // c:\pkg\1\stable and c:\Pkg\1\stable (or c:\repo.git and c:\repo.Git) + // repository locations end up with the same canonical name. + // + #ifdef _WIN32 + const path& p (local () ? path (lcase (up.string ())) : up); + #else + const path& p (up); + #endif + switch (type_) { case repository_type::pkg: @@ -3773,7 +3786,7 @@ namespace bpkg // Produce the pkg repository canonical name <prefix>/<path> part (see // the Repository Chaining documentation for more details). // - sp = strip_path (up, + sp = strip_path (p, remote () ? strip_mode::component : strip_mode::path); @@ -3783,7 +3796,7 @@ namespace bpkg // stripping just the version component. // if (absolute () && sp.empty ()) - sp = strip_path (up, strip_mode::version); + sp = strip_path (p, strip_mode::version); break; } @@ -3791,7 +3804,7 @@ namespace bpkg { // For dir repository we use the absolute (normalized) path. // - sp = up; + sp = p; break; } case repository_type::git: @@ -3799,7 +3812,7 @@ namespace bpkg // For git repository we use the absolute (normalized) path, stripping // the .git extension if present. // - sp = strip_path (up, strip_mode::extension); + sp = strip_path (p, strip_mode::extension); break; } } diff --git a/tests/repository-location/driver.cxx b/tests/repository-location/driver.cxx index 32f5b8e..3eb8101 100644 --- a/tests/repository-location/driver.cxx +++ b/tests/repository-location/driver.cxx @@ -765,6 +765,18 @@ namespace bpkg assert (l1.string () == l2.string ()); assert (l1.canonical_name () == l2.canonical_name ()); } + { + repository_location l1 (loc ("c:/var/pkg/1/misc")); + repository_location l2 (loc ("c:/var/Pkg/1/Misc")); + assert (l1.canonical_name () == "pkg:misc"); + assert (l2.canonical_name () == l1.canonical_name ()); + } + { + repository_location l1 (loc ("c:\\repo.git", repository_type::git)); + repository_location l2 (loc ("C:/Repo.Git", repository_type::git)); + assert (l1.canonical_name () == "git:c:\\repo"); + assert (l2.canonical_name () == l1.canonical_name ()); + } #endif { repository_location l1 (loc ("http://www.cppget.org/1/stable")); |