aboutsummaryrefslogtreecommitdiff
path: root/tests/manifest
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-12-21 20:14:19 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-01-15 13:01:04 +0300
commite13873e57383a617da352b38af016fed62eda5e9 (patch)
treeb5592ccb783650bb2113d4effe0effa6a32a79f1 /tests/manifest
parentb2f240870b4f759a7cf6eaf4d4409d2f6b9af5e1 (diff)
Add support for $ in package manifest dependency constraint
Diffstat (limited to 'tests/manifest')
-rw-r--r--tests/manifest/driver.cxx87
-rw-r--r--tests/manifest/testscript134
2 files changed, 200 insertions, 21 deletions
diff --git a/tests/manifest/driver.cxx b/tests/manifest/driver.cxx
index 0f2262f..de03606 100644
--- a/tests/manifest/driver.cxx
+++ b/tests/manifest/driver.cxx
@@ -16,10 +16,14 @@ using namespace std;
using namespace butl;
using namespace bpkg;
-// Usage: argv[0] (-pp|-dp|-gp|-pr|-dr|-gr|-s)
+// Usages:
//
-// Read and parse manifest from STDIN and serialize it to STDOUT. The
-// following options specify the manifest type.
+// argv[0] (-pp|-dp|-gp|-pr|-dr|-gr|-s)
+// argv[0] [-c] -p
+// argv[0] -ec <version>
+//
+// In the first form read and parse manifest list from stdin and serialize it
+// to stdout. The following options specify the manifest type.
//
// -pp parse pkg package manifest list
// -dp parse dir package manifest list
@@ -29,13 +33,30 @@ using namespace bpkg;
// -gr parse git repository manifest list
// -s parse signature manifest
//
+// In the second form read and parse the package manifest from stdin and
+// serialize it to stdout. Complete the dependency constraints if -c is
+// specified. Note: -c, if specified, should go before -p on the command line.
+//
+// In the third form read and parse dependency constraints from stdin and
+// roundtrip them to stdout together with their effective constraints,
+// calculated using version passed as an argument.
+//
int
main (int argc, char* argv[])
{
- assert (argc == 2);
+ assert (argc <= 3);
string opt (argv[1]);
- cin.exceptions (ios_base::failbit | ios_base::badbit);
+ bool complete_depends (opt == "-c");
+
+ if (complete_depends)
+ {
+ opt = argv[2];
+ assert (opt == "-p");
+ }
+
+ assert ((opt == "-ec" || complete_depends) == (argc == 3));
+
cout.exceptions (ios_base::failbit | ios_base::badbit);
manifest_parser p (cin, "stdin");
@@ -43,22 +64,48 @@ main (int argc, char* argv[])
try
{
- if (opt == "-pp")
- pkg_package_manifests (p).serialize (s);
- else if (opt == "-dp")
- dir_package_manifests (p).serialize (s);
- else if (opt == "-gp")
- git_package_manifests (p).serialize (s);
- else if (opt == "-pr")
- pkg_repository_manifests (p).serialize (s);
- else if (opt == "-dr")
- dir_repository_manifests (p).serialize (s);
- else if (opt == "-gr")
- git_repository_manifests (p).serialize (s);
- else if (opt == "-s")
- signature_manifest (p).serialize (s);
+ if (opt == "-ec")
+ {
+ version v (argv[2]);
+
+ cin.exceptions (ios_base::badbit);
+
+ string s;
+ while (!eof (getline (cin, s)))
+ {
+ dependency_constraint c (s);
+ dependency_constraint ec (c.effective (v));
+
+ assert (c.complete () == (c == ec));
+
+ cout << c << " " << ec << endl;
+ }
+ }
else
- assert (false);
+ {
+ cin.exceptions (ios_base::failbit | ios_base::badbit);
+
+ if (opt == "-p")
+ pkg_package_manifest (p,
+ false /* ignore_unknown */,
+ complete_depends).serialize (s);
+ else if (opt == "-pp")
+ pkg_package_manifests (p).serialize (s);
+ else if (opt == "-dp")
+ dir_package_manifests (p).serialize (s);
+ else if (opt == "-gp")
+ git_package_manifests (p).serialize (s);
+ else if (opt == "-pr")
+ pkg_repository_manifests (p).serialize (s);
+ else if (opt == "-dr")
+ dir_repository_manifests (p).serialize (s);
+ else if (opt == "-gr")
+ git_repository_manifests (p).serialize (s);
+ else if (opt == "-s")
+ signature_manifest (p).serialize (s);
+ else
+ assert (false);
+ }
}
catch (const manifest_parsing& e)
{
diff --git a/tests/manifest/testscript b/tests/manifest/testscript
index b77740f..fa0de85 100644
--- a/tests/manifest/testscript
+++ b/tests/manifest/testscript
@@ -74,13 +74,40 @@
: dependency
:
- $* -pp <<EOI 2>'stdin:5:10: error: invalid prerequisite package name: length is less than two characters' != 0
+ $* -pp <<EOI 2>'stdin:8:10: error: invalid prerequisite package name: length is less than two characters' != 0
: 1
sha256sum: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
:
name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
depends: b
EOI
+
+ : dependency-constraint
+ :
+ $* -pp <<EOI 2>'stdin:8:10: error: $ not allowed' != 0
+ : 1
+ sha256sum: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ :
+ name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
+ depends: bar == $
+ EOI
+
+ : dependency-constraint-version
+ :
+ $* -c -p <<EOI 2>'stdin:6:10: error: invalid dependency constraint: min version is greater than max version' != 0
+ : 1
+ name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
+ depends: bar [$ 1.0.0]
+ EOI
}
}
@@ -89,6 +116,39 @@
{
: manifest
:
+ {
+ : complete
+ :
+ $* -c -p <<EOI >>EOO
+ : 1
+ name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
+ depends: bar == $ | libbaz ~$ | libbox ^$ | libfox [1.0 $)
+ EOI
+ : 1
+ name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
+ depends: bar == 2.0.0 | libbaz ~2.0.0 | libbox ^2.0.0 | libfox [1.0 2.0.0)
+ EOO
+
+ : incomplete
+ :
+ $* -p <<EOF >>EOF
+ : 1
+ name: foo
+ version: 2.0.0
+ summary: Modern C++ parser
+ license: LGPLv2
+ depends: bar == $ | libbaz ~$ | libbox ^$ | libfox [1.0 $)
+ EOF
+ }
+
+ : manifest-list
+ :
: Roundtrip the pkg package manifest list.
:
$* -pp <<EOF >>EOF
@@ -515,3 +575,75 @@
\
EOF
}
+
+: effective-constraints
+:
+{
+ : regular
+ :
+ $* -ec '1.2.3+1' <<EOI >>EOO
+ [1.0 $)
+ [1.0 $]
+ [$ 1.2.4)
+ [$ 1.2.4]
+ == $
+ >= $
+ EOI
+ [1.0 $) [1.0 1.2.3)
+ [1.0 $] [1.0 1.2.3]
+ [$ 1.2.4) [1.2.3 1.2.4)
+ [$ 1.2.4] [1.2.3 1.2.4]
+ == $ == 1.2.3
+ >= $ >= 1.2.3
+ EOO
+
+ : shortcut
+ :
+ {
+ : final
+ :
+ {
+ $* -ec '1.2.3+1' <'~$' >'~$ ~1.2.0' : tilda
+ $* -ec '1.2.3+1' <'^$' >'^$ ^1.0.0' : carrot
+ }
+
+ : pre-release
+ :
+ {
+ : tilda
+ :
+ {
+ $* -ec '1.2.0-b.2' <'~$' >'~$ ~1.2.0-a.1' : no-final
+ $* -ec '1.2.1-a.1' <'~$' >'~$ ~1.2.0' : final-patch
+ }
+
+ : carrot
+ :
+ {
+ $* -ec '1.0.0-b.2' <'^$' >'^$ ^1.0.0-a.1' : no-final
+ $* -ec '1.0.1-a.1' <'^$' >'^$ ^1.0.0' : final-patch
+ $* -ec '1.1.0-b.2' <'^$' >'^$ ^1.0.0' : final-minor
+ }
+ }
+
+ : snapshot
+ :
+ {
+ : tilda
+ :
+ {
+ $* -ec '1.2.1-a.2.345' <'~$' >'~$ ~1.2.0' : patch
+ $* -ec '1.2.0-a.0.345' <'~$' >'~$ [1.2.0-a.0.1 1.2.0-a.1)' : minor
+ $* -ec '1.0.0-a.0.345' <'~$' >'~$ [1.0.0-a.0.1 1.0.0-a.1)' : major
+ }
+
+ : carrot
+ :
+ {
+ $* -ec '1.2.1-a.2.345' <'^$' >'^$ ^1.0.0' : patch
+ $* -ec '1.2.0-a.0.345' <'^$' >'^$ [1.2.0-a.0.1 1.2.0-a.1)' : minor
+ $* -ec '1.0.0-a.0.345' <'^$' >'^$ [1.0.0-a.0.1 1.0.0-a.1)' : major
+ }
+ }
+ }
+}