aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-03-08 18:14:44 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-03-09 14:54:52 +0300
commit78229192fc54ec1822bb29146f08386e3c60f813 (patch)
tree4e994888280268b33daea557903c2510a0a39905
parentbf7f63e56640fa7756ebaacac36fcf23ce61afa3 (diff)
Fix repository_name() to always recognize names for local repositories
-rw-r--r--bpkg/manifest-utility.cxx18
-rw-r--r--tests/rep-fetch.test37
2 files changed, 42 insertions, 13 deletions
diff --git a/bpkg/manifest-utility.cxx b/bpkg/manifest-utility.cxx
index a2b817d..50ee4e8 100644
--- a/bpkg/manifest-utility.cxx
+++ b/bpkg/manifest-utility.cxx
@@ -155,19 +155,25 @@ namespace bpkg
{
size_t p (s.find (':'));
- // If it has no scheme or the scheme looks like that of a URL, then this
- // is not a canonical name.
+ // If it has no scheme, then this is not a canonical name.
//
- if (p == string::npos || butl::url::traits::find (s, p) != string::npos)
+ if (p == string::npos)
return false;
// This is a canonical name if the scheme is convertible to the repository
- // type.
+ // type and is followed by the colon and no more than one slash.
+ //
+ // Note that the approach is valid unless we invent the file scheme for the
+ // canonical name.
//
try
{
- to_repository_type (string (s, 0, p));
- return true;
+ string scheme (s, 0, p);
+ to_repository_type (scheme);
+ bool r (!(p + 2 < s.size () && s[p + 1] == '/' && s[p + 2] == '/'));
+
+ assert (!r || scheme != "file");
+ return r;
}
catch (const invalid_argument&)
{
diff --git a/tests/rep-fetch.test b/tests/rep-fetch.test
index f7be436..f0c0e2d 100644
--- a/tests/rep-fetch.test
+++ b/tests/rep-fetch.test
@@ -321,19 +321,21 @@ $* 2>>/EOE != 0
: dir-rep
:
+: For dir repository tests we will reuse local git repositories, that have the
+: same repository structure.
+:
+if ($remote != true)
{
rep_add += --type dir
+ rep = $canonicalize([dir_path] $out_git/state0)
+
+ +$clone_cfg && $rep_add $rep/libbar.git
+
: prerequisites
:
- if ($remote != true)
{
- # Let's reuse local git repositories that have the same repository
- # structure as for dir type.
- #
- rep = $canonicalize([dir_path] $out_git/state0)
-
- $clone_root_cfg && $rep_add $rep/libbar.git;
+ $clone_cfg;
$* 2>>"EOE";
fetching dir:($rep/libbar.git)
@@ -346,6 +348,27 @@ $* 2>>/EOE != 0
prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
EOO
}
+
+ : by-name
+ :
+ : Here we, in particular, test that the local repository canonical name
+ : (dir:/...) is not confused with the repository URL.
+ :
+ {
+ $clone_cfg;
+ $* 2>!;
+
+ $* "dir:($rep/libbar.git)" 2>>"EOE";
+ fetching dir:($rep/libbar.git)
+ fetching dir:($rep/style-basic.git) \(prerequisite of dir:($rep/libbar.git)\)
+ 3 package\(s\) in 2 repository\(s\)
+ EOE
+
+ $rep_list >>"EOO"
+ dir:($rep/libbar.git) ($rep/libbar.git)
+ prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
+ EOO
+ }
}
: git-rep