diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2018-12-21 20:14:19 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2019-01-15 13:01:04 +0300 |
commit | e13873e57383a617da352b38af016fed62eda5e9 (patch) | |
tree | b5592ccb783650bb2113d4effe0effa6a32a79f1 /tests/manifest | |
parent | b2f240870b4f759a7cf6eaf4d4409d2f6b9af5e1 (diff) |
Add support for $ in package manifest dependency constraint
Diffstat (limited to 'tests/manifest')
-rw-r--r-- | tests/manifest/driver.cxx | 87 | ||||
-rw-r--r-- | tests/manifest/testscript | 134 |
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 + } + } + } +} |