aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bpkg/manifest.cxx10
-rw-r--r--tests/repository-location/driver.cxx29
2 files changed, 33 insertions, 6 deletions
diff --git a/bpkg/manifest.cxx b/bpkg/manifest.cxx
index 246251d..5569224 100644
--- a/bpkg/manifest.cxx
+++ b/bpkg/manifest.cxx
@@ -1675,9 +1675,8 @@ namespace bpkg
}
// Need to check path for emptiness before proceeding further as a valid
- // non empty location can not have an empty path_ member. Note that path
- // can become empty as a result of normalize () call. Example of such a
- // path is 'a/..'.
+ // non empty location can not have an empty path_ member (which can be the
+ // case for the remote location, but not for the relative or absolute).
//
if (path_.empty ())
throw invalid_argument ("empty path");
@@ -2017,13 +2016,14 @@ namespace bpkg
//
dir_path ipath (
strip_path (
- u.path, strip_p ? strip_mode::component : strip_mode::version) / rpath);
+ u.path,
+ strip_p ? strip_mode::component : strip_mode::version) / rpath);
static const char* invalid_location ("invalid repository location");
try
{
- ipath.normalize ();
+ ipath.normalize (false, true); // Current dir collapses to an empty one.
}
catch (const invalid_path&)
{
diff --git a/tests/repository-location/driver.cxx b/tests/repository-location/driver.cxx
index 441e295..6b4a1d7 100644
--- a/tests/repository-location/driver.cxx
+++ b/tests/repository-location/driver.cxx
@@ -133,7 +133,6 @@ main (int argc, char* argv[])
assert (bad_location ("1/.."));
assert (bad_location ("bbb"));
assert (bad_location ("aaa/bbb"));
- assert (bad_location ("/aaa/bbb"));
assert (bad_location ("http://aa"));
assert (bad_location ("https://aa"));
assert (bad_location ("http://aa/"));
@@ -143,6 +142,12 @@ main (int argc, char* argv[])
assert (bad_location ("http://a.com/../c/1/aa"));
assert (bad_location ("http://a.com/a/b/../../../c/1/aa"));
+#ifndef _WIN32
+ assert (bad_location ("/aaa/bbb"));
+#else
+ assert (bad_location ("c:\\aaa\\bbb"));
+#endif
+
// Invalid version.
//
assert (bad_location ("3/aaa/bbb"));
@@ -159,6 +164,11 @@ main (int argc, char* argv[])
repository_location (
"http://stable.cppget.org/1/misc")));
+
+ assert (bad_location ("../..",
+ repository_location (
+ "http://stable.cppget.org/1/misc")));
+
// Invalid web interface URL.
//
assert (bad_url (".a/..",
@@ -225,6 +235,11 @@ main (int argc, char* argv[])
assert (l.string () == "b/pkg/1/aa/bb");
assert (l.canonical_name ().empty ());
}
+ {
+ repository_location l ("aa/..", repository_location ());
+ assert (l.string () == ".");
+ assert (l.canonical_name ().empty ());
+ }
#ifndef _WIN32
{
repository_location l ("/1/aa/bb", repository_location ());
@@ -427,6 +442,18 @@ main (int argc, char* argv[])
assert (l2.canonical_name () == "stable.cppget.org/math");
}
{
+ repository_location l1 ("http://stable.cppget.org/1/misc");
+ repository_location l2 ("math/..", l1);
+ assert (l2.string () == "http://stable.cppget.org/1/misc");
+ assert (l2.canonical_name () == "stable.cppget.org/misc");
+ }
+ {
+ repository_location l1 ("http://stable.cppget.org/1/misc");
+ repository_location l2 (".", l1);
+ assert (l2.string () == "http://stable.cppget.org/1/misc");
+ assert (l2.canonical_name () == "stable.cppget.org/misc");
+ }
+ {
repository_location l1 ("http://www.stable.cppget.org:8080/1");
repository_location l2 ("../1/math", l1);
assert (l2.string () == "http://www.stable.cppget.org:8080/1/math");