aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bpkg/manifest7
-rw-r--r--bpkg/manifest.cxx94
-rw-r--r--tests/manifest/repositories5
3 files changed, 105 insertions, 1 deletions
diff --git a/bpkg/manifest b/bpkg/manifest
index cc45bb4..106b6ca 100644
--- a/bpkg/manifest
+++ b/bpkg/manifest
@@ -469,6 +469,13 @@ namespace bpkg
repository_location location;
butl::optional<repository_role> role;
+ // The following values may only be present for the base repository.
+ //
+ butl::optional<std::string> url;
+ butl::optional<std::string> email;
+ butl::optional<std::string> summary;
+ butl::optional<std::string> description;
+
public:
repository_manifest (manifest_parser&);
repository_manifest (manifest_parser&, manifest_name_value start);
diff --git a/bpkg/manifest.cxx b/bpkg/manifest.cxx
index d421e7e..3857c28 100644
--- a/bpkg/manifest.cxx
+++ b/bpkg/manifest.cxx
@@ -1245,6 +1245,46 @@ namespace bpkg
role = static_cast<repository_role> (i - b);
}
+ else if (n == "url")
+ {
+ if (url)
+ bad_name ("url redefinition");
+
+ if (v.empty ())
+ bad_value ("empty url");
+
+ url = move (v);
+ }
+ else if (n == "email")
+ {
+ if (email)
+ bad_name ("email redefinition");
+
+ if (v.empty ())
+ bad_value ("empty email");
+
+ email = move (v);
+ }
+ else if (n == "summary")
+ {
+ if (summary)
+ bad_name ("summary redefinition");
+
+ if (v.empty ())
+ bad_value ("empty summary");
+
+ summary = move (v);
+ }
+ else if (n == "description")
+ {
+ if (description)
+ bad_name ("description redefinition");
+
+ if (v.empty ())
+ bad_value ("empty description");
+
+ description = move (v);
+ }
else
bad_name ("unknown name '" + n + "' in repository manifest");
}
@@ -1256,11 +1296,29 @@ namespace bpkg
//
if (role && location.empty () != (*role == repository_role::base))
bad_value ("invalid role");
+
+ if (effective_role () != repository_role::base)
+ {
+ if (url)
+ bad_value ("url not allowed");
+
+ if (email)
+ bad_value ("email not allowed");
+
+ if (summary)
+ bad_value ("summary not allowed");
+
+ if (description)
+ bad_value ("description not allowed");
+ }
}
void repository_manifest::
serialize (serializer& s) const
{
+ auto bad_value ([&s](const string& d) {
+ throw serialization (s.name (), d);});
+
s.next ("", "1"); // Start of manifest.
if (!location.empty ())
@@ -1269,13 +1327,47 @@ namespace bpkg
if (role)
{
if (location.empty () != (*role == repository_role::base))
- throw serialization (s.name (), "invalid role");
+ bad_value ("invalid role");
auto r (static_cast<size_t> (*role));
assert (r < repository_role_names.size ());
s.next ("role", repository_role_names[r]);
}
+ bool b (effective_role () == repository_role::base);
+
+ if (url)
+ {
+ if (!b)
+ bad_value ("url not allowed");
+
+ s.next ("url", *url);
+ }
+
+ if (email)
+ {
+ if (!b)
+ bad_value ("email not allowed");
+
+ s.next ("email", *email);
+ }
+
+ if (summary)
+ {
+ if (!b)
+ bad_value ("summary not allowed");
+
+ s.next ("summary", *summary);
+ }
+
+ if (description)
+ {
+ if (!b)
+ bad_value ("description not allowed");
+
+ s.next ("description", *description);
+ }
+
s.next ("", ""); // End of manifest.
}
diff --git a/tests/manifest/repositories b/tests/manifest/repositories
index 184a15f..8d67635 100644
--- a/tests/manifest/repositories
+++ b/tests/manifest/repositories
@@ -5,3 +5,8 @@ role: prerequisite
location: ../stable
role: complement
:
+url: http://cppget.org
+email: repoman@cppget.org
+summary: General C++ package repository
+description: This is the awesome C++ package repository full of exciting\
+ stuff.