aboutsummaryrefslogtreecommitdiff
path: root/bpkg/manifest-utility.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-11-14 16:12:25 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-11-16 14:43:20 +0300
commit5d69b98c5d62b05d1d6d6fd24aeac468af509365 (patch)
treea7d24e3b785e266fece5ff1fa66e691a4846ca75 /bpkg/manifest-utility.cxx
parentdfd879004b1a66ff197c4d41d9fb2e0839781a38 (diff)
Add support for repository typed URLs (git+https://..., etc)
Diffstat (limited to 'bpkg/manifest-utility.cxx')
-rw-r--r--bpkg/manifest-utility.cxx27
1 files changed, 20 insertions, 7 deletions
diff --git a/bpkg/manifest-utility.cxx b/bpkg/manifest-utility.cxx
index c329108..79c131b 100644
--- a/bpkg/manifest-utility.cxx
+++ b/bpkg/manifest-utility.cxx
@@ -92,7 +92,9 @@ namespace bpkg
parse_location (const string& s, optional<repository_type> ot)
try
{
- repository_url u (s);
+ typed_repository_url tu (s);
+
+ repository_url& u (tu.url);
assert (u.path);
// Make the relative path absolute using the current directory.
@@ -102,13 +104,24 @@ namespace bpkg
// Guess the repository type to construct the repository location:
//
- // 1. If type is specified as an option use that (but validate
- // incompatible scheme/type e.g., git/pkg).
+ // 1. If the type is specified in the URL scheme, then use that (but
+ // validate that it matches the --type option, if present).
+ //
+ // 2. If the type is specified as an option, then use that.
//
- // 2. See guess_type() function description in libbpkg/manifest.hxx for
- // the algorithm details.
+ // Validate the protocol/type compatibility (e.g. git:// vs pkg) for both
+ // cases.
//
- repository_type t (ot ? *ot : guess_type (u, true));
+ // 3. See the guess_type() function description in <libbpkg/manifest.hxx>
+ // for the algorithm details.
+ //
+ if (tu.type && ot && tu.type != ot)
+ fail << to_string (*ot) << " repository type mismatch for location '"
+ << s << "'";
+
+ repository_type t (tu.type ? *tu.type :
+ ot ? *ot :
+ guess_type (tu.url, true /* local */));
try
{
@@ -125,7 +138,7 @@ namespace bpkg
// If the pkg repository type was guessed, then suggest the user to
// specify the type explicitly.
//
- if (!ot && t == repository_type::pkg)
+ if (!tu.type && !ot && t == repository_type::pkg)
dr << info << "consider using --type to specify repository type";
dr << endf;