diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2018-09-04 14:02:11 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2018-09-04 14:02:11 +0300 |
commit | f8fdb500cc705e2b8b4a74166ceb2c6d8cee3fd3 (patch) | |
tree | 3f94b0b79ebad275904b9dc4a4165326ff598492 /tests/pkg-build.testscript | |
parent | f727c2b8fe273a12d059826291523060dab4b512 (diff) |
Rename .test/test{} to .testscript/testscript{}
Diffstat (limited to 'tests/pkg-build.testscript')
-rw-r--r-- | tests/pkg-build.testscript | 3473 |
1 files changed, 3473 insertions, 0 deletions
diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript new file mode 100644 index 0000000..f1bfd08 --- /dev/null +++ b/tests/pkg-build.testscript @@ -0,0 +1,3473 @@ +# file : tests/pkg-build.testscript +# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +.include common.testscript \ + config.testscript \ + remote.testscript \ + remote-git.testscript + +# Source repository: +# +# pkg-build +# |-- libbar-1.0.0.tar.gz +# |-- libbaz-1.1.0.tar.gz +# |-- libfix-0.0.1.tar.gz +# |-- libfoo-0.0.1.tar.gz -> libfix +# |-- libfoo-1.0.0.tar.gz +# | +# |-- libfoo-1.1.0 +# | |-- build +# | | `-- bootstrap.build +# | |-- buildfile +# | `-- manifest +# | +# |-- libfoo-1.1.0.tar.gz +# |-- libfoo-1.2.0.tar.gz +# | +# |-- t0a +# | |-- libbar-0.0.1.tar.gz -> libbaz == 0.0.1 +# | |-- libbaz-0.0.1.tar.gz -> libfox +# | |-- libbaz-0.0.3.tar.gz -> libfoo +# | |-- libbox-0.0.1.tar.gz -> libbaz +# | |-- libfix-0.0.1.tar.gz +# | |-- libfoo-0.0.1.tar.gz -> libfix +# | |-- libfox-0.0.1.tar.gz +# | `-- repositories.manifest +# | +# |-- t0b +# | |-- libbar-0.0.2.tar.gz -> libbaz <= 0.0.2 +# | |-- libbaz-0.0.2.tar.gz -> libfoo +# | |-- libbiz-0.0.2.tar.gz -> libbaz <= 0.0.3 +# | |-- libfoo-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t0c +# | |-- libbar-0.0.3.tar.gz -> libbaz +# | |-- libbar-1.0.0.tar.gz -> libfoo +# | |-- libbaz-0.0.3.tar.gz -> libfoo +# | |-- libbaz-0.0.4.tar.gz +# | |-- libbaz-0.1.0.tar.gz +# | |-- libbox-0.0.1.tar.gz -> libbaz +# | |-- libfix-0.0.3.tar.gz -> libbaz >= 0.0.3 +# | |-- libfoo-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t0d +# | |-- libbiz-0.0.1.tar.gz -> libbox, libfox +# | |-- libbox-0.0.2.tar.gz -> libfoo == 1.0.0 +# | |-- libfix-0.0.1.tar.gz +# | |-- libfox-0.0.2.tar.gz -> libfoo == 0.0.1 +# | |-- libfoo-0.0.1.tar.gz -> libfix +# | |-- libfoo-1.0.0.tar.gz +# | |-- libfox-0.0.1.tar.gz +# | `-- repositories.manifest +# | +# |-- t1 +# | |-- libfoo-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t2 +# | |-- libbar-1.0.0.tar.gz -> libfoo +# | |-- libfoo-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t3 -> t2 (prerequisite repository) +# | |-- libbaz-1.0.0.tar.gz -> libbar +# | |-- libfox-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t4a +# | |-- libfoo-1.1.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t4b -> t4a (prerequisite repository) +# | |-- libbar-1.1.0.tar.gz -> libfoo == 1.1.0 +# | `-- repositories.manifest +# | +# |-- t4c -> t4b (prerequisite repository) +# | |-- libbaz-1.1.0.tar.gz -> libfoo, libbar +# | |-- libfoo-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t4d -> t4c (complement repository) +# | |-- libbiz-1.0.0.tar.gz -> libfox, libfoo, libbaz +# | |-- libfox-1.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t5 +# | |-- libbar-1.2.0.tar.gz +# | `-- repositories.manifest +# | +# |-- t6 +# | |-- libBar-2.0.0.tar.gz +# | `-- repositories.manifest +# | +# |-- libhello-1.0.0 +# | |-- build +# | | |-- bootstrap.build +# | | |-- export.build +# | | `-- root.build +# | `-- * +# | +# `-- git +# |-- libbar.git -> style-basic.git (prerequisite repository) +# |-- libbaz.git +# `-- style-basic.git + +# Prepare repositories used by tests if running in the local mode. +# ++if ($remote != true) + rep_create += 2>! + + cp -r $src/t0a $out/t0a && $rep_create $out/t0a &$out/t0a/packages.manifest + cp -r $src/t0b $out/t0b && $rep_create $out/t0b &$out/t0b/packages.manifest + cp -r $src/t0c $out/t0c && $rep_create $out/t0c &$out/t0c/packages.manifest + cp -r $src/t0d $out/t0d && $rep_create $out/t0d &$out/t0d/packages.manifest + cp -r $src/t1 $out/t1 && $rep_create $out/t1 &$out/t1/packages.manifest + cp -r $src/t2 $out/t2 && $rep_create $out/t2 &$out/t2/packages.manifest + cp -r $src/t3 $out/t3 && $rep_create $out/t3 &$out/t3/packages.manifest + cp -r $src/t4a $out/t4a && $rep_create $out/t4a &$out/t4a/packages.manifest + cp -r $src/t4b $out/t4b && $rep_create $out/t4b &$out/t4b/packages.manifest + cp -r $src/t4c $out/t4c && $rep_create $out/t4c &$out/t4c/packages.manifest + cp -r $src/t4d $out/t4d && $rep_create $out/t4d &$out/t4d/packages.manifest + cp -r $src/t5 $out/t5 && $rep_create $out/t5 &$out/t5/packages.manifest + cp -r $src/t6 $out/t6 && $rep_create $out/t6 &$out/t6/packages.manifest + + # Create git repositories. + # + $git_extract $src/git/style-basic.tar + $git_extract $src/git/libbar.tar &$out_git/state0/*** + $git_extract $src/git/libbaz.tar &$out_git/state1/*** +end + +pkg_configure += -d cfg "config.cxx=$config.cxx" 2>! +pkg_disfigure += -d cfg +pkg_drop += -d cfg --yes 2>! +pkg_fetch += -d cfg 2>! +pkg_purge += -d cfg +pkg_status += -d cfg +pkg_unpack += -d cfg 2>! +rep_add += -d cfg 2>! +rep_remove += -d cfg 2>! +rep_fetch += -d cfg --auth all --trust-yes 2>! + +: libfoo +: +: Test building different versions of libfoo. +: +{ + test.arguments += --print-only + + : no-name + : + $clone_root_cfg; + $* 2>>EOE != 0 + error: package name argument expected + info: run 'bpkg help pkg-build' for more information + EOE + + : unknown-package + : + $clone_root_cfg; + $* libfoo 2>>/EOE != 0 + error: unknown package libfoo + info: configuration cfg/ has no repositories + info: use 'bpkg rep-add' to add a repository + EOE + + : unknown-package-ver + : + $clone_root_cfg; + $* libfoo/1.0.0 2>>/EOE != 0 + error: unknown package libfoo + info: configuration cfg/ has no repositories + info: use 'bpkg rep-add' to add a repository + EOE + + : archive + : + $clone_root_cfg; + $* $src/libfoo-1.1.0.tar.gz >'new libfoo/1.1.0' + + : dir + : + $clone_root_cfg; + $* $src/libfoo-1.1.0/ >'new libfoo/1.1.0' + + : unpacked-dir + : + { + $clone_root_cfg && $pkg_unpack -e $src/libfoo-1.1.0; + + $* libfoo >'update libfoo/1.1.0'; + $* libfoo/1.1.0 >'update libfoo/1.1.0'; + $* libfoo libfoo >'update libfoo/1.1.0'; + + $* libfoo libfoo/1.1.0 2>>EOE != 0; + error: duplicate package libfoo + info: first mentioned as libfoo + info: second mentioned as libfoo/1.1.0 + EOE + + $* libfoo/1.1.0 libfoo 2>>EOE != 0; + error: duplicate package libfoo + info: first mentioned as libfoo/1.1.0 + info: second mentioned as libfoo + EOE + + $* libfoo/1.1.0 libfoo/1.1.0 >'update libfoo/1.1.0'; + + $* libfoo/1.0.0 2>>/EOE != 0; + error: unknown package libfoo + info: configuration cfg/ has no repositories + info: use 'bpkg rep-add' to add a repository + EOE + + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : t1 + : + { + +$clone_root_cfg && $rep_add $rep/t1 && $rep_fetch + + : downgrade + : + { + $clone_cfg && $pkg_unpack -e $src/libfoo-1.1.0; + + $* libfoo >'update libfoo/1.1.0'; + $* libfoo/1.0.0 >'downgrade libfoo/1.0.0'; + + $* libfoo/0.0.1 2>>EOE != 0; + error: libfoo/0.0.1 is not available in source + info: specify sys:libfoo/0.0.1 if it is available from the system + EOE + + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : upgrade + : + { + $clone_cfg; + $pkg_fetch -e $src/libfoo-0.0.1.tar.gz && $pkg_unpack libfoo; + $pkg_fetch -e $src/libfix-0.0.1.tar.gz && $pkg_unpack libfix; + + $* libfoo >'upgrade libfoo/1.0.0'; + + $* libfoo/0.0.1 >>EOE; + update libfix/0.0.1 (required by libfoo) + update libfoo/0.0.1 + EOE + + $* libfoo/1.1.0 2>>EOE != 0; + error: libfoo/1.1.0 is not available in source + info: specify sys:libfoo/1.1.0 if it is available from the system + EOE + + $pkg_purge libfoo 2>'purged libfoo/0.0.1'; + $pkg_purge libfix 2>'purged libfix/0.0.1' + } + + : upgrade-failure + : + { + $clone_cfg; + + $* libfoo >'new libfoo/1.0.0'; + $* libfoo/1.0.0 >'new libfoo/1.0.0'; + + $* libfoo/1.1.0 2>>EOE != 0 + error: libfoo/1.1.0 is not available in source + info: specify sys:libfoo/1.1.0 if it is available from the system + EOE + } + } +} + +: libbar-libfoo +: +: Test building libbar that depends on libfoo. +: +{ + test.arguments += --print-only + + : unknown-dependency + : + $clone_root_cfg; + $* $src/libbar-1.0.0.tar.gz 2>>EOE != 0 + error: unknown dependency libfoo of package libbar + info: while satisfying libbar/1.0.0 + EOE + + : t2 + : + { + +$clone_root_cfg && $rep_add $rep/t2 && $rep_fetch + + : build-dependency + : + { + $clone_cfg; + + $* libbar >>EOO; + new libfoo/1.0.0 (required by libbar) + new libbar/1.0.0 + EOO + + $* libbar libfoo >>EOO; + new libfoo/1.0.0 + new libbar/1.0.0 + EOO + + $* libbar libfoo/1.0.0 >>EOO; + new libfoo/1.0.0 + new libbar/1.0.0 + EOO + + $* libbar libfoo libbar/1.0.0 2>>EOE != 0; + error: duplicate package libbar + info: first mentioned as libbar + info: second mentioned as libbar/1.0.0 + EOE + + $* libbar libfoo/1.1.0 2>>EOE != 0 + error: libfoo/1.1.0 is not available in source + info: specify sys:libfoo/1.1.0 if it is available from the system + EOE + } + + : upgrade-dependency + : + { + $clone_cfg; + $pkg_fetch -e $src/libfoo-0.0.1.tar.gz && $pkg_unpack libfoo; + $pkg_fetch -e $src/libfix-0.0.1.tar.gz && $pkg_unpack libfix; + + $* libbar >>EOO; + update libfix/0.0.1 (required by libfoo) + update libfoo/0.0.1 (required by libbar) + new libbar/1.0.0 + EOO + + $* libbar libfoo >>EOO; + upgrade libfoo/1.0.0 + new libbar/1.0.0 + EOO + + $* libbar libfoo/0.0.1 >>EOO; + update libfix/0.0.1 (required by libfoo) + update libfoo/0.0.1 + new libbar/1.0.0 + EOO + + $pkg_purge libfoo 2>'purged libfoo/0.0.1'; + $pkg_purge libfix 2>'purged libfix/0.0.1' + } + + : downgrade-dependency + : + { + $clone_cfg && $pkg_unpack -e $src/libfoo-1.1.0; + + $* libbar >>EOO; + update libfoo/1.1.0 (required by libbar) + new libbar/1.0.0 + EOO + + $* libbar libfoo >>EOO; + update libfoo/1.1.0 + new libbar/1.0.0 + EOO + + $* libbar libfoo/1.0.0 >>EOO; + downgrade libfoo/1.0.0 + new libbar/1.0.0 + EOO + + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + } +} + +: libbaz-libbar +: +: Test building libbaz that depends on libbar; libbar is in prerequisite +: repository. +: +{ + test.arguments += --print-only + + : t3 + : + { + +$clone_root_cfg && $rep_add $rep/t3 && $rep_fetch + + : prerequisites-build-failure + : + : Fail to build packages that are only in prerequisite repository. + : + { + $clone_cfg; + + $* libfoo 2>>EOE != 0; + error: unknown package libfoo + EOE + + $* libbar 2>>EOE != 0; + error: unknown package libbar + EOE + + $* libbaz libbar 2>>EOE != 0 + error: unknown package libbar + EOE + } + + : prerequisites-build + : + $clone_cfg; + $* libbaz >>EOO + new libfoo/1.0.0 (required by libbar) + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : different-build-order + : + { + +$clone_cfg && $rep_add $rep/t2 && $rep_fetch + + : fox-foo + : + $clone_cfg; + $* libfox libfoo >>EOO + new libfox/1.0.0 + new libfoo/1.0.0 + EOO + + : foo-fox + : + $clone_cfg; + $* libfoo libfox >>EOO + new libfoo/1.0.0 + new libfox/1.0.0 + EOO + + : baz-foo + : + $clone_cfg; + $* libbaz libfoo >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : foo-baz + : + $clone_cfg; + $* libfoo libbaz >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : baz-fox + : + $clone_cfg; + $* libbaz libfox >>EOO + new libfoo/1.0.0 (required by libbar) + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + new libfox/1.0.0 + EOO + + : fox-baz + : + $clone_cfg; + $* libfox libbaz >>EOO + new libfox/1.0.0 + new libfoo/1.0.0 (required by libbar) + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : fox-foo-baz + : + $clone_cfg; + $* libfox libfoo libbaz >>EOO + new libfox/1.0.0 + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : fox-baz-foo + : + $clone_cfg; + $* libfox libbaz libfoo >>EOO + new libfox/1.0.0 + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : foo-fox-baz + : + $clone_cfg; + $* libfoo libfox libbaz >>EOO + new libfoo/1.0.0 + new libfox/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : foo-baz-fox + : + $clone_cfg; + $* libfoo libbaz libfox >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + new libfox/1.0.0 + EOO + + : baz-fox-foo + : + : This one is contradictory: baz before fox but fox before foo. + : + $clone_cfg; + $* libbaz libfox libfoo >>EOO + new libfox/1.0.0 + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + EOO + + : baz-foo-fox + : + $clone_cfg; + $* libbaz libfoo libfox >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 (required by libbaz) + new libbaz/1.0.0 + new libfox/1.0.0 + EOO + + : baz-foo-bar + : + $clone_cfg; + $* libbaz libfoo libbar >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 + new libbaz/1.0.0 + EOO + + : baz-bar-foo + : + $clone_cfg; + $* libbaz libbar libfoo >>EOO + new libfoo/1.0.0 + new libbar/1.0.0 + new libbaz/1.0.0 + EOO + } + } +} + +: libbaz-libfoo-libbar +: +: Test building libbaz that depends on libfoo and libbar; libbar depends on +: libfoo == 1.1.0. +: +{ + test.arguments += --print-only + + : t4c + : + { + +$clone_root_cfg && $rep_add $rep/t4c && $rep_fetch + + : baz + : + $clone_cfg; + $* libbaz >>EOO + new libfoo/1.1.0 (required by libbar libbaz) + new libbar/1.1.0 (required by libbaz) + new libbaz/1.1.0 + EOO + + : foo-baz + : + $clone_cfg; + $* libfoo libbaz >>EOO + new libfoo/1.1.0 + new libbar/1.1.0 (required by libbaz) + new libbaz/1.1.0 + EOO + + : unable-satisfy + : + $clone_cfg; + $* libfoo/1.0.0 libbaz 2>>EOE != 0 + error: unable to satisfy constraints on package libfoo + info: libbar depends on (libfoo == 1.1.0) + info: command line depends on (libfoo == 1.0.0) + info: available libfoo/1.1.0 + info: available libfoo/1.0.0 + info: explicitly specify libfoo version to manually satisfy both constraints + info: while satisfying libbar/1.1.0 + info: while satisfying libbaz/1.1.0 + EOE + + : not-available + : + $clone_cfg; + $* libfoo/1.1.0 libbaz 2>>EOE != 0 + error: libfoo/1.1.0 is not available in source + info: specify sys:libfoo/1.1.0 if it is available from the system + EOE + + : upgrade-warning + : + { + $clone_cfg; + $pkg_fetch -e $src/libfoo-0.0.1.tar.gz && $pkg_unpack libfoo; + $pkg_fetch -e $src/libfix-0.0.1.tar.gz && $pkg_unpack libfix; + + $* libbaz >>EOO 2>>EOE; + upgrade libfoo/1.1.0 (required by libbar libbaz) + new libbar/1.1.0 (required by libbaz) + new libbaz/1.1.0 + EOO + warning: package libbar dependency on (libfoo == 1.1.0) is forcing upgrade of libfoo/0.0.1 to 1.1.0 + EOE + + $pkg_purge libfoo 2>'purged libfoo/0.0.1'; + $pkg_purge libfix 2>'purged libfix/0.0.1' + } + + : downgrade-error + : + { + $clone_cfg; + $pkg_fetch -e $src/libfoo-1.2.0.tar.gz && $pkg_unpack libfoo; + + $* libbaz 2>>EOE != 0; + error: package libbar dependency on (libfoo == 1.1.0) is forcing downgrade of libfoo/1.2.0 to 1.1.0 + info: explicitly request version downgrade to continue + info: while satisfying libbar/1.1.0 + info: while satisfying libbaz/1.1.0 + EOE + + $rep_add $rep/t4a && $rep_fetch; + + $* libfoo/1.1.0 libbaz >>EOO; + downgrade libfoo/1.1.0 + new libbar/1.1.0 (required by libbaz) + new libbaz/1.1.0 + EOO + + $pkg_purge libfoo 2>'purged libfoo/1.2.0' + } + + : unable-downgrade + : + : Test that dependent prevents up/downgrade that would break dependency + : constraints. + : + { + $clone_cfg; + $pkg_fetch libfoo/1.1.0 && $pkg_unpack libfoo && $pkg_configure libfoo; + $pkg_fetch libbar/1.1.0 && $pkg_unpack libbar && $pkg_configure libbar; + + $* libfoo-1.2.0.tar.gz 2>>EOE != 0; + error: unknown package libfoo-1.2.0.tar.gz + EOE + + $* libfoo/1.0.0 2>>EOE != 0; + error: unable to downgrade package libfoo/1.1.0 to 1.0.0 + info: because package libbar depends on (libfoo == 1.1.0) + info: explicitly request up/downgrade of package libbar + info: or explicitly specify package libfoo version to manually satisfy these constraints + EOE + + $* libfoo/1.1.0 --keep-unused >'update libfoo/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + } + + : dependent-reconfiguration + : + { + test.arguments += --keep-unused + + +$clone_root_cfg + + +$pkg_fetch -e $src/libfoo-1.0.0.tar.gz && $pkg_unpack libfoo + +$pkg_configure libfoo + + +$pkg_fetch -e $src/libbar-1.0.0.tar.gz && $pkg_unpack libbar + +$pkg_configure libbar + + +$pkg_fetch -e $src/libbaz-1.1.0.tar.gz && $pkg_unpack libbaz + +$pkg_configure libbaz + + +$rep_add $rep/t4a && $rep_add $rep/t4b && $rep_fetch + + : bar + : + : Only libbar/1.1.0 (that we are upgrading to) requires libfoo/1.1.0. + : libbaz, that depends on libfoo and libbar, is happy with any version of + : its dependencies. + : + $clone_cfg; + $* libbar >>EOO 2>>EOE + upgrade libfoo/1.1.0 (required by libbar) + upgrade libbar/1.1.0 + reconfigure libbaz (dependent of libbar libfoo) + EOO + warning: package libbar dependency on (libfoo == 1.1.0) is forcing upgrade of libfoo/1.0.0 to 1.1.0 + EOE + + : foo + : + $clone_cfg; + $* libfoo >>EOO + upgrade libfoo/1.1.0 + reconfigure libbar (dependent of libfoo) + reconfigure libbaz (dependent of libbar libfoo) + EOO + + : foo-bar + : + $clone_cfg; + $* libfoo libbar/1.0.0 >>EOO + upgrade libfoo/1.1.0 + reconfigure/update libbar/1.0.0 + reconfigure libbaz (dependent of libbar libfoo) + EOO + + : bar-foo + : + $clone_cfg; + $* libbar/1.0.0 libfoo >>EOO + upgrade libfoo/1.1.0 + reconfigure/update libbar/1.0.0 + reconfigure libbaz (dependent of libbar libfoo) + EOO + + : baz-foo + : + $clone_cfg; + $* libbaz libfoo >>EOO + upgrade libfoo/1.1.0 + reconfigure libbar (dependent of libfoo) + reconfigure/update libbaz/1.1.0 + EOO + + : baz-foo-1.0.0 + : + $clone_cfg; + $* libbaz libfoo/1.0.0 >>EOO + update libfoo/1.0.0 + update libbaz/1.1.0 + EOO + + -$pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0' + -$pkg_purge libbaz 2>'purged libbaz/1.1.0' + + -$pkg_disfigure libbar 2>'disfigured libbar/1.0.0' + -$pkg_purge libbar 2>'purged libbar/1.0.0' + + -$pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0' + -$pkg_purge libfoo 2>'purged libfoo/1.0.0' + } +} + +# Note that when we fetch a package from remote repository the bpkg stderr +# contains fetch program progress output, that comes prior the informational +# message. +# + +: actual-build +: +{ + test.arguments += --yes + + : with-dependencies + : + { + $clone_root_cfg && $rep_add $rep/t4c && $rep_fetch; + + $* libbaz 2>>~%EOE%; + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + %.* + %.*fetched libbar/1.1.0% + unpacked libbar/1.1.0 + configured libbar/1.1.0 + %.* + %.*fetched libbaz/1.1.0% + unpacked libbaz/1.1.0 + configured libbaz/1.1.0 + %info: .+ is up to date% + updated libbaz/1.1.0 + EOE + + $pkg_status libfoo/1.1.0 >'libfoo configured 1.1.0'; + $pkg_status libbar/1.1.0 >'libbar configured 1.1.0'; + $pkg_status libbaz/1.1.0 >'!libbaz configured 1.1.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : hold-fs-fetched + : + { + : direct + : + { + $clone_root_cfg; + + $* $src/libfoo-1.0.0.tar.gz 2>>~%EOE%; + fetched libfoo/1.0.0 + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured !1.0.0'; + + $* $src/libfoo-1.1.0/ 2>>~%EOE%; + disfigured libfoo/1.0.0 + using libfoo/1.1.0 (external) + configured libfoo/1.1.0 + %info: .+ is up to date% + updated libfoo/1.1.0 + EOE + + $pkg_status libfoo >'!libfoo configured !1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : pre-fetch + : + { + $clone_root_cfg; + $pkg_fetch -e $src/libfoo-1.0.0.tar.gz && $pkg_unpack libfoo; + $pkg_configure libfoo; + + $pkg_status libfoo >'libfoo configured 1.0.0'; + + $* libfoo 2>>~%EOE%; + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.0.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + } + + : hold-repo-fetched + : + { + +$clone_root_cfg && $rep_add $rep/t4c && $rep_fetch + + : package-version + : + { + $clone_cfg; + + $* libfoo 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.0.0 available [1.1.0]'; + + $* libfoo/1.0.0 2>>~%EOE%; + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured !1.0.0 available [1.1.0]'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + + : version + : + { + $clone_cfg; + + $* libfoo/1.0.0 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured !1.0.0 available [1.1.0]'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + + : not-held + : + { + $clone_cfg; + + $* libbaz 2>>~%EOE%; + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + %.* + %.*fetched libbar/1.1.0% + unpacked libbar/1.1.0 + configured libbar/1.1.0 + %.* + %.*fetched libbaz/1.1.0% + unpacked libbaz/1.1.0 + configured libbaz/1.1.0 + %info: .+ is up to date% + updated libbaz/1.1.0 + EOE + + $pkg_status libfoo >'libfoo configured 1.1.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : forcing-upgrade-unheld + : + { + $clone_cfg; + + $* libfoo 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.0.0 available [1.1.0]'; + + $* libbaz 2>>~%EOE%; + warning: package libbar dependency on (libfoo == 1.1.0) is forcing upgrade of libfoo/1.0.0 to 1.1.0 + disfigured libfoo/1.0.0 + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + %.* + %.*fetched libbar/1.1.0% + unpacked libbar/1.1.0 + configured libbar/1.1.0 + %.* + %.*fetched libbaz/1.1.0% + unpacked libbaz/1.1.0 + configured libbaz/1.1.0 + %info: .+ is up to date% + updated libbaz/1.1.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.1.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : forcing-upgrade-held + : + { + $clone_cfg; + + $* libfoo/1.0.0 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured !1.0.0 available [1.1.0]'; + + $* libbaz 2>>EOE != 0; + error: package libbar dependency on (libfoo == 1.1.0) is forcing upgrade of libfoo/1.0.0 to 1.1.0 + info: package version libfoo/1.0.0 is held + info: explicitly request version upgrade to continue + info: while satisfying libbar/1.1.0 + info: while satisfying libbaz/1.1.0 + EOE + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + } + + : drop-dependencies + : + { + $clone_root_cfg && $rep_add $rep/t2 && $rep_fetch; + + $* libbar 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + %info: .+ is up to date% + updated libbar/1.0.0 + EOE + + $pkg_status libfoo >'libfoo configured 1.0.0'; + $pkg_status libbar >'!libbar configured 1.0.0'; + + $rep_add $rep/t5 && $rep_fetch; + + $* libbar 2>>~%EOE%; + disfigured libbar/1.0.0 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + %info: .+ is up to date% + updated libbar/1.2.0 + EOE + + $pkg_status libfoo >'libfoo available 1.0.0'; + $pkg_status libbar >'!libbar configured 1.2.0'; + + $* libbar/1.0.0 libfoo 2>>~%EOE%; + disfigured libbar/1.2.0 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + %info: .+ is up to date%{2} + updated libfoo/1.0.0 + updated libbar/1.0.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.0.0'; + $pkg_status libbar >'!libbar configured !1.0.0 available 1.2.0'; + + $* libbar 2>>~%EOE%; + disfigured libbar/1.0.0 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + %info: .+ is up to date% + updated libbar/1.2.0 + EOE + + $pkg_status libfoo >'!libfoo configured 1.0.0'; + $pkg_status libbar >'!libbar configured 1.2.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.2.0'; + $pkg_purge libbar 2>'purged libbar/1.2.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + + : local-dependency + : + : Test that the local package can be built against the local dependency + : package. + : + { + # Prepare libbar and libbaz (libbaz->libbar) local packages using the + # temporary configuration. + # + $clone_root_cfg; + + $pkg_fetch -e $src/t4b/libbar-1.1.0.tar.gz; + $pkg_unpack libbar &cfg/libbar-1.1.0/***; + + $pkg_fetch -e $src/t4c/libbaz-1.1.0.tar.gz; + $pkg_unpack libbaz &cfg/libbaz-1.1.0/***; + + mv cfg/libbar-1.1.0 libbar; + mv cfg/libbaz-1.1.0 libbaz; + + rm -r cfg && $clone_root_cfg; # Re-clone. + $rep_add $rep/t4a && $rep_fetch; + + $* ./libbar/ 2>>~%EOE%; + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + using libbar/1.1.0 (external) + configured libbar/1.1.0 + %info: .+ is up to date% + updated libbar/1.1.0 + EOE + + $* ./libbaz/ 2>>~%EOE%; + using libbaz/1.1.0 (external) + configured libbaz/1.1.0 + %info: .+ is up to date% + updated libbaz/1.1.0 + EOE + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : upgrade-all-held + : + { + $clone_root_cfg && $rep_fetch $rep/t2 $rep/t5; + + $* libbar/1.0 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + %info: .+ is up to date% + updated libbar/1.0.0 + EOE + + $* --upgrade 2>>~%EOE%; + disfigured libbar/1.0.0 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + %info: .+ is up to date% + updated libbar/1.2.0 + EOE + + $pkg_status libbar >'!libbar configured 1.2.0'; + + $rep_remove $rep/t2 $rep/t5; + + $* --upgrade 2>>/EOE != 0; + error: libbar is not available + info: configuration cfg/ has no repositories + info: use 'bpkg rep-add' to add a repository + EOE + + $pkg_drop libbar + } +} + +: dependency +: +{ + : unknown + : + { + $clone_root_cfg; + $rep_fetch $rep/t0c; + + $* '?libbux' 2>'error: unknown package libbux' != 0; + $* '?sys:libbux' 2>'error: unknown package sys:libbux' != 0; + $* '?libbar/1.3' 2>'error: unknown package libbar/1.3' != 0 + } + + : unused + : + { + test.arguments += --configure-only + + +$clone_root_cfg + +$rep_fetch $rep/t2 $rep/t5 + + : drop + : + : Test dropping of unused dependencies (default behavior). + : + { + $clone_cfg; + + $* --yes libbar/1.0.0 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* libbar/1.2.0 <'y' 2>>~%EOE%; + drop libfoo/1.0.0 (unused) + upgrade libbar/1.2.0 + continue? [Y/n] disfigured libbar/1.0.0 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + EOE + + $pkg_status libfoo >'libfoo available 1.0.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.2.0'; + $pkg_purge libbar 2>'purged libbar/1.2.0' + } + + : keep + : + : Test keeping of unused dependencies (--keep-unused option). + : + { + $clone_cfg; + + $* --yes libbar/1.0.0 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* --keep-unused libbar/1.2.0 <'y' 2>>~%EOE%; + upgrade libbar/1.2.0 + continue? [Y/n] disfigured libbar/1.0.0 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + EOE + + $pkg_status libfoo >'libfoo configured 1.0.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.2.0'; + $pkg_purge libbar 2>'purged libbar/1.2.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + + : drop-recursive + : + { + test.arguments += --yes + + $clone_root_cfg; + $rep_fetch $rep/t0a $rep/t0c; + + $* libbar/0.0.1 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.1.0 0.0.4 0.0.3'; + $pkg_status libfox >'libfox configured 0.0.1'; + + $* libbar 2>>~%EOE%; + disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + purged libfox/0.0.1 + purged libbaz/0.0.1 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $pkg_status libbaz >'libbaz available 0.1.0 0.0.4 0.0.3 0.0.1'; + $pkg_status libfox >'libfox available 0.0.1'; + + $pkg_drop libbar + } + + : drop-unsatisfactory + : + : Test that a dependency (libbaz/0.0.3) that doesn't satisfy its dependent + : (libbar/0.0.1) but get dropped during the plan refinement, doesn't + : prevent the command to succeed. + : + { + test.arguments += --yes + + $clone_root_cfg; + $rep_fetch $rep/t0a $rep/t0c; + + $* libbar/0.0.1 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.1.0 0.0.4 0.0.3'; + $pkg_status libfox >'libfox configured 0.0.1'; + + $* ?libbar ?libbaz/0.0.3 2>>~%EOE%; + disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + purged libfox/0.0.1 + purged libbaz/0.0.1 + purged libbar/0.0.1 + EOE + + $pkg_status libbar >'libbar available 1.0.0 0.0.3 0.0.1'; + $pkg_status libbaz >'libbaz available 0.1.0 0.0.4 0.0.3 0.0.1'; + $pkg_status libfox >'libfox available 0.0.1' + } + } + + : apply-constraints + : + : Test that the desired dependency version imposes constraint that is taken + : into account during prerequisites collection (see collect_prerequisites() + : for more details). + : + { + test.arguments += --yes --configure-only + + : unable-satisfy + : + { + $clone_root_cfg; + $rep_fetch $rep/t0a $rep/t0b; + + $* libbar/0.0.1 ?libbaz/0.0.2 2>>EOE != 0 + error: unable to satisfy constraints on package libbaz + info: libbar depends on (libbaz == 0.0.1) + info: command line depends on (libbaz == 0.0.2) + info: specify libbaz version to satisfy libbar constraint + info: while satisfying libbar/0.0.1 + EOE + } + + : resolve-conflict + : + { + : satisfy-dependents + : + : Test resolving a conflict when libfix and libbiz have selected such + : versions of their dependency libbaz. that do not satisfy each other + : constraints. We resolve the conflict explicitly specifying + : ?libbaz/0.0.3 on the command line, which satisfies both constraints. + : + { + $clone_root_cfg; + $rep_fetch $rep/t0b $rep/t0c; + + $* libfix libbiz 2>>EOE != 0; + error: unable to satisfy constraints on package libbaz + info: libfix depends on (libbaz >= 0.0.3) + info: libbiz depends on (libbaz <= 0.0.3) + info: available libbaz/0.1.0 + info: available libbaz/0.0.2 + info: explicitly specify libbaz version to manually satisfy both constraints + info: while satisfying libbiz/0.0.2 + EOE + + $* libfix libbiz ?libbaz/0.0.3 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + %.* + %.*fetched libfix/0.0.3% + unpacked libfix/0.0.3 + configured libfix/0.0.3 + %.* + %.*fetched libbiz/0.0.2% + unpacked libbiz/0.0.2 + configured libbiz/0.0.2 + EOE + + $pkg_status libbaz >'libbaz configured !0.0.3 available 0.1.0 0.0.4'; + + $pkg_drop libbiz libfix + } + + : postpone + : + : Same as above but with an opposite order of dependents on the command + : line. This would normally fail due the inability to find libbaz/0.0.3 + : in repositories available to libbiz, unless libbaz dependencies + : collection were not postponed (see collect_build_prerequisites() + : function for more details). + : + { + $clone_root_cfg; + $rep_fetch $rep/t0b $rep/t0c; + + $* libbiz libfix ?libbaz/0.0.3 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + %.* + %.*fetched libbiz/0.0.2% + unpacked libbiz/0.0.2 + configured libbiz/0.0.2 + %.* + %.*fetched libfix/0.0.3% + unpacked libfix/0.0.3 + configured libfix/0.0.3 + EOE + + $pkg_status libbaz >'libbaz configured !0.0.3 available 0.1.0 0.0.4'; + + $pkg_drop libbiz libfix + } + + : replace-dependent + : + : Test resolving a conflict when libbox and libfox have selected such + : versions of their dependency libfoo, that do not satisfy each other + : constraints. Note that these constraints are incompatible, so we + : resolve the conflict explicitly specifying ?libfox/0.0.1 on the + : command line, to replace one of the conflicting dependents. + : + { + $clone_root_cfg; + $rep_fetch $rep/t0d; + + $* libbiz 2>>EOE != 0; + error: unable to satisfy constraints on package libfoo + info: libbox depends on (libfoo == 1.0.0) + info: libfox depends on (libfoo == 0.0.1) + info: available libfoo/1.0.0 + info: available libfoo/0.0.1 + info: explicitly specify libfoo version to manually satisfy both constraints + info: while satisfying libbox/0.0.2 + info: while satisfying libbiz/0.0.1 + EOE + + $* libbiz ?libfox/0.0.1 2>>~%EOE%; + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbox/0.0.2% + unpacked libbox/0.0.2 + configured libbox/0.0.2 + %.* + %.*fetched libbiz/0.0.1% + unpacked libbiz/0.0.1 + configured libbiz/0.0.1 + EOE + + $pkg_status libfox >'libfox configured !0.0.1 available 0.0.2'; + + $pkg_drop libbiz + } + } + + : selected + : + : Test cases when the selected package (partially) satisfies the + : user-imposed dependency constraint. + : + { + +$clone_root_cfg + +$rep_fetch $rep/t0a $rep/t0b $rep/t0c + + : same + : + { + $clone_cfg; + + $* libbar/0.0.1 2>!; + $* libbar/0.0.2 ?libbaz/0.0.1 2>!; + + $pkg_status libbaz >'libbaz configured !0.0.1 available 0.1.0 0.0.4 0.0.3 0.0.2'; + $pkg_status libfox >'libfox configured 0.0.1'; + + $pkg_drop libbar + } + + : src-to-sys + : + { + $clone_cfg; + + $* libbar/0.0.1 2>!; + $* libbar/0.0.2 '?sys:libbaz/0.0.1' 2>!; + + $pkg_status libbaz >'libbaz configured,system !0.0.1 available 0.1.0 0.0.4 0.0.3 0.0.2'; + $pkg_status libfox >'libfox available 0.0.1'; + + $pkg_drop libbar + } + + : sysver-to-wildcard + : + { + $clone_cfg; + + $* libbar/0.0.1 '?sys:libbaz/0.0.1' 2>!; + $* libbar/0.0.2 '?sys:libbaz' 2>!; + + $pkg_status libbaz >'libbaz configured,system !* available 0.1.0 0.0.4 0.0.3 0.0.2 0.0.1'; + + $pkg_drop libbar + } + + : wildcard-to-sysver + : + { + $clone_cfg; + + $* libbar/0.0.1 '?sys:libbaz' 2>!; + $* libbar/0.0.2 '?sys:libbaz/0.0.1' 2>!; + + $pkg_status libbaz >'libbaz configured,system !0.0.1 available 0.1.0 0.0.4 0.0.3 0.0.2'; + + $pkg_drop libbar + } + } + + : unknown + : + { + $clone_root_cfg; + $rep_fetch $rep/t0a $rep/t0c; + + $* libbar/1.0.0 ?libfoo/0.0.1 2>>EOE != 0 + error: unknown dependency libfoo == 0.0.1 of package libbar + info: while satisfying libbar/1.0.0 + EOE + } + } + + : refine + : + { + test.arguments += --yes --configure-only + + +$clone_root_cfg + +$rep_fetch $rep/t0a $rep/t0c + + : system + : + { + +$clone_cfg + + : wildcard-to-version + : + { + $clone_cfg; + + $* libbar '?sys:libfoo' 2>>~%EOE%; + configured sys:libfoo/* + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* '?sys:libfoo/0.1' 2>>~%EOE%; + disfigured libbar/1.0.0 + purged libfoo/* + configured sys:libfoo/0.1 + configured libbar/1.0.0 + EOE + + $pkg_drop libbar + } + + : wildcard-to-itself + : + { + $clone_cfg; + + $* libbar '?sys:libfoo' 2>>~%EOE%; + configured sys:libfoo/* + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* '?sys:libfoo'; + + $pkg_drop libbar + } + + : wildcard-to-src + : + { + $clone_cfg; + + $* libbar/0.0.1 '?sys:libbaz' 2>>~%EOE%; + configured sys:libbaz/* + %.* + %.*fetched libbar/0.0.1% + unpacked libbar/0.0.1 + configured libbar/0.0.1 + EOE + + $* '?libbaz' 2>>~%EOE%; + disfigured libbar/0.0.1 + purged libbaz/* + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + configured libbar/0.0.1 + EOE + + $pkg_drop libbar + } + + : version-to-wildcard + : + { + $clone_cfg; + + $* libbar '?sys:libfoo/0.1' 2>>~%EOE%; + configured sys:libfoo/0.1 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* '?sys:libfoo' 2>>~%EOE%; + disfigured libbar/1.0.0 + purged libfoo/0.1 + configured sys:libfoo/* + configured libbar/1.0.0 + EOE + + $pkg_drop libbar + } + + : version-to-itself + : + { + $clone_cfg; + + $* libbar '?sys:libfoo/0.1' 2>>~%EOE%; + configured sys:libfoo/0.1 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* '?sys:libfoo/0.1'; + + $pkg_drop libbar + } + + : version-to-version + : + { + $clone_cfg; + + $* libbar '?sys:libfoo/0.2' 2>>~%EOE%; + configured sys:libfoo/0.2 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $* '?sys:libfoo/0.1' 2>>~%EOE%; + disfigured libbar/1.0.0 + purged libfoo/0.2 + configured sys:libfoo/0.1 + configured libbar/1.0.0 + EOE + + $pkg_drop libbar + } + + : version-to-src + : + { + $clone_cfg; + + $* libbar/0.0.1 '?sys:libbaz/0.0.1' 2>>~%EOE%; + configured sys:libbaz/0.0.1 + %.* + %.*fetched libbar/0.0.1% + unpacked libbar/0.0.1 + configured libbar/0.0.1 + EOE + + $* '?libbaz/0.0.1' 2>>~%EOE%; + disfigured libbar/0.0.1 + purged libbaz/0.0.1 + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + configured libbar/0.0.1 + EOE + + $pkg_drop libbar + } + + : src-to-wildcard + : + { + $clone_cfg; + + $* libbar/0.0.1 '?libbaz' 2>>~%EOE%; + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + %.* + %.*fetched libbar/0.0.1% + unpacked libbar/0.0.1 + configured libbar/0.0.1 + EOE + + $* '?sys:libbaz' 2>>~%EOE%; + disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + purged libfox/0.0.1 + purged libbaz/0.0.1 + configured sys:libbaz/* + configured libbar/0.0.1 + EOE + + $pkg_drop libbar + } + + : src-to-version + : + { + $clone_cfg; + + $* libbar/0.0.1 '?libbaz/0.0.1' 2>>~%EOE%; + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + %.* + %.*fetched libbar/0.0.1% + unpacked libbar/0.0.1 + configured libbar/0.0.1 + EOE + + $* '?sys:libbaz/0.0.1' 2>>~%EOE%; + disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + purged libfox/0.0.1 + purged libbaz/0.0.1 + configured sys:libbaz/0.0.1 + configured libbar/0.0.1 + EOE + + $pkg_drop libbar + } + } + + : source + : + { + +$clone_cfg + + : unavailable + : + { + $clone_cfg; + + $* libbar/1.0.0 2>!; + + $* ?libfoo/0.0.1 2>>EOE != 0; + error: libfoo/0.0.1 is not available from its dependents' repositories + EOE + + $pkg_drop libbar + } + + : satisfy + : + { + $clone_cfg; + $rep_fetch $rep/t0b; + + $* libbar/0.0.1 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.1.0 0.0.4 0.0.3 0.0.2'; + + $* libbar/0.0.2 ?libbaz 2>>~%EOE%; + disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + purged libfox/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.2% + unpacked libbaz/0.0.2 + configured libbaz/0.0.2 + %.* + %.*fetched libbar/0.0.2% + unpacked libbar/0.0.2 + configured libbar/0.0.2 + EOE + + $pkg_status libbaz >'libbaz configured 0.0.2 available 0.1.0 0.0.4 0.0.3'; + + $rep_remove $rep/t0b && $rep_fetch; + + # Test that the selected package, that is "better" than the available + # one, is left. + # + $* libbox ?libbaz 2>>~%EOE%; + %.* + %.*fetched libbox/0.0.1% + unpacked libbox/0.0.1 + configured libbox/0.0.1 + EOE + + $pkg_status libbaz >'libbaz configured 0.0.2 available 0.1.0 0.0.4 0.0.3'; + + $rep_remove $rep/t0a && $rep_fetch; + + # Test that the selected package is left as there is no satisfactory + # available package. + # + $* ?libbaz; + + # Test that the above behavior is not triggered for the system package. + # + $* '?sys:libbaz' 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbox/0.0.1 + disfigured libbaz/0.0.2 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + purged libbaz/0.0.2 + configured sys:libbaz/* + configured libbox/0.0.1 + configured libbar/0.0.2 + EOE + + $pkg_status libbaz >'libbaz configured,system !* available 0.1.0 0.0.4 0.0.3'; + + $pkg_drop libbar libbox + } + + : unsatisfied + : + { + $clone_cfg; + + $* libbar/0.0.1 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.1.0 0.0.4 0.0.3'; + + $* ?libbaz/0.0.3 2>>EOE != 0; + error: package libbaz doesn't satisfy its dependents + info: libbaz/0.0.3 doesn't satisfy libbar/0.0.1 + EOE + + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.1.0 0.0.4 0.0.3'; + + $pkg_drop libbar + } + } + + : scratch + : + { + $clone_cfg; + + $* libbox 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.3 available 0.1.0 0.0.4'; + $pkg_status libfoo >'libfoo configured 0.0.1 available 1.0.0'; + $pkg_status libfox >'libfox available 0.0.1'; + + # After the first simulation it is discovered that libfoo needs to be + # upgraded to 1.0.0. But after the second simulation, that upgrades + # libfoo, it is discovered that it is now unused (libbaz doesn't need it + # anymore). So we replace libfoo upgrade with drop and start from + # scratch. + # + $* ?libfoo/1.0.0 ?libbaz/0.0.1 2>>~%EOE%; + disfigured libbox/0.0.1 + disfigured libbaz/0.0.3 + disfigured libfoo/0.0.1 + disfigured libfix/0.0.1 + purged libfix/0.0.1 + purged libfoo/0.0.1 + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + configured libbox/0.0.1 + EOE + + $pkg_status libbaz >'libbaz configured !0.0.1 available 0.1.0 0.0.4 0.0.3'; + $pkg_status libfoo >'libfoo available 1.0.0 0.0.1'; + $pkg_status libfox >'libfox configured 0.0.1'; + + $pkg_drop libbox + } + + : reconf-dependent + : + { + $clone_cfg; + $rep_fetch $rep/t0b; + + $* libbar/0.0.2 2>!; + + $pkg_status libbaz >'libbaz configured 0.0.2 available 0.1.0 0.0.4 0.0.3'; + $pkg_status libfoo >'libfoo configured 1.0.0'; + + $* '?sys:libfoo' ?libbaz/0.0.2 2>>EOE; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + configured sys:libfoo/* + configured libbaz/0.0.2 + configured libbar/0.0.2 + EOE + + $pkg_drop libbar + } + } + + : unhold + : + { + test.arguments += --configure-only + + +$clone_root_cfg + +$rep_fetch $rep/t0a + + : drop + : + { + $clone_cfg; + + $* libfox 2>!; + + $* ?libfox --yes 2>>EOE; + disfigured libfox/0.0.1 + purged libfox/0.0.1 + EOE + + $pkg_status libfox >'libfox available 0.0.1' + } + + : silent + : + { + $clone_cfg; + + $* libbar libbaz --yes 2>!; + $pkg_status libbaz >'!libbaz configured 0.0.1 available 0.0.3'; + + $* ?libbaz; + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.0.3'; + + $pkg_drop libbar + } + + : prompt + : + { + $clone_cfg; + + $* libbar libbaz --yes 2>!; + $pkg_status libbaz >'!libbaz configured 0.0.1 available 0.0.3'; + + $* '?sys:libbaz' < 'y' 2>>EOE; + drop libfox/0.0.1 (unused) + reconfigure/unhold sys:libbaz/* + reconfigure libbar (dependent of libbaz) + continue? [Y/n] disfigured libbar/0.0.1 + disfigured libbaz/0.0.1 + disfigured libfox/0.0.1 + purged libfox/0.0.1 + purged libbaz/0.0.1 + configured sys:libbaz/* + configured libbar/0.0.1 + EOE + + $pkg_status libbaz >'libbaz configured,system !* available 0.0.3 0.0.1'; + + $pkg_drop libbar + } + + : unheld + : + { + $clone_cfg; + + $* libbar ?libbaz --yes 2>!; + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.0.3'; + + $* ?libbaz; + $pkg_status libbaz >'libbaz configured 0.0.1 available 0.0.3'; + + $pkg_drop libbar + } + } + + : options + : + { + : keep-out + : + : Test that --keep-out is properly propagated when building libhello + : as a dependency, so it is built incrementally. + : + { + $cfg_create cxx "config.cxx=$config.cxx" -d cfg 2>- &cfg/***; + + # Add libhello as the dir repository. + # + cp -r $src/libhello-1.0.0 ./libhello; + $rep_add libhello --type dir; + + # Add libfoo as the dir repository and make it a dependent of libhello. + # + cp -r $src/libfoo-1.1.0 libfoo; + echo 'depends: libhello' >+libfoo/manifest; + $rep_add libfoo --type dir; + + $rep_fetch; + + # Note that libfoo building doesn't trigger libhello building as it is a + # fake dependent, so build both explicitly. + # + $* libfoo ?libhello 2>!; + + # Move libhello version ahead. + # + sed -i -e 's/(version: 1.0).0/\1.1/' libhello/manifest; + $rep_fetch; + + # Upgrade libhello as a dependency. + # + # Note that despite the fact that we have modified the libhello's + # manifest file after the build, libhello may still be considered up to + # date on filesystems with a low file timestamps resolution (for example + # HFS+). + # + # @@ By some reason the following build occasionally re-links, so the + # test fails (most often reproduced on Windows). We will copy the + # configuration directory preserving file timestamps to research the + # issue when it get reproduced. + # + cp -r cfg cfg-backup; + + $* ?libhello --yes --keep-out 2>>~%EOE% + disfigured libfoo/1.1.0 + disfigured libhello/1.0.0 + using libhello/1.0.1 (external) + configured libhello/1.0.1 + configured libfoo/1.1.0 + %info: .+ is up to date%{1,2} + updated libhello/1.0.1 + updated libfoo/1.1.0 + EOE + } + } + + : dependents + : + { + test.arguments += --yes --configure-only + + : order + : + : Test that libbar that is built but isn't upgraded (and so doesn't order + : itself against dependencies) is still properly reconfigured being + : ordered as (an indirect) dependent of libfoo. + : + { + $clone_root_cfg; + $rep_fetch $rep/t0a $rep/t0b; + + $* libbar libfoo/0.0.1 2>>~%EOE%; + %.* + %.*fetched libfoo/0.0.1% + unpacked libfoo/0.0.1 + configured libfoo/0.0.1 + %.* + %.*fetched libbaz/0.0.2% + unpacked libbaz/0.0.2 + configured libbaz/0.0.2 + %.* + %.*fetched libbar/0.0.2% + unpacked libbar/0.0.2 + configured libbar/0.0.2 + EOE + + $* libbar libfoo 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + configured libbaz/0.0.2 + configured libbar/0.0.2 + EOE + + $pkg_drop libbaz libbar libfoo + } + + : adjust-merge-build + : + : Test that the registered in the map but not ordered package build + : (libfoo) is properly merged into the reconfigure adjustment as a + : dependent of the reconfigured dependency (see collect_order_dependents() + : for more details). + : + { + $clone_root_cfg; + $rep_fetch $rep/t0a; + + $* libfoo 2>>~%EOE%; + %.* + %.*fetched libfix/0.0.1% + unpacked libfix/0.0.1 + configured libfix/0.0.1 + %.* + %.*fetched libfoo/0.0.1% + unpacked libfoo/0.0.1 + configured libfoo/0.0.1 + EOE + + $* libbaz libbar 'sys:libfix' 2>>~%EOE%; + disfigured libfoo/0.0.1 + disfigured libfix/0.0.1 + %.* + %.*fetched libfox/0.0.1% + unpacked libfox/0.0.1 + configured libfox/0.0.1 + %.* + %.*fetched libbaz/0.0.1% + unpacked libbaz/0.0.1 + configured libbaz/0.0.1 + %.* + %.*fetched libbar/0.0.1% + unpacked libbar/0.0.1 + configured libbar/0.0.1 + purged libfix/0.0.1 + configured sys:libfix/* + configured libfoo/0.0.1 + EOE + + $pkg_drop libbaz libbar libfoo + } + } + + : upgrade + : + : Test dependency upgrade using --immediate and --recursive options. + : + { + test.arguments += --configure-only --upgrade + + +$clone_root_cfg + +$rep_fetch $rep/t0a $rep/t0b $rep/t0c + + +$* libbar/0.0.2 libbaz/0.0.2 libfoo/0.0.1 --yes 2>>~%EOE% + %.* + %.*fetched libfix/0.0.1% + unpacked libfix/0.0.1 + configured libfix/0.0.1 + %.* + %.*fetched libfoo/0.0.1% + unpacked libfoo/0.0.1 + configured libfoo/0.0.1 + %.* + %.*fetched libbaz/0.0.2% + unpacked libbaz/0.0.2 + configured libbaz/0.0.2 + %.* + %.*fetched libbar/0.0.2% + unpacked libbar/0.0.2 + configured libbar/0.0.2 + EOE + + clone_cfg = cp --no-cleanup -r ../cfg ./ &cfg/*** + + : immediate + : + { + $clone_cfg; + + $* libbar/0.0.3 --immediate --yes 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + %.* + %.*fetched libbaz/0.1.0% + unpacked libbaz/0.1.0 + configured libbaz/0.1.0 + %.* + %.*fetched libbar/0.0.3% + unpacked libbar/0.0.3 + configured libbar/0.0.3 + EOE + + $pkg_status libbar >'!libbar configured !0.0.3 available 1.0.0'; + $pkg_status libbaz >'!libbaz configured !0.1.0'; + $pkg_status libfoo >'!libfoo configured !0.0.1 available 1.0.0' + } + + : recursive + : + { + $clone_cfg; + + $* libbar/0.0.3 --recursive --yes 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.1.0% + unpacked libbaz/0.1.0 + configured libbaz/0.1.0 + %.* + %.*fetched libbar/0.0.3% + unpacked libbar/0.0.3 + configured libbar/0.0.3 + EOE + + $pkg_status libbar >'!libbar configured !0.0.3 available 1.0.0'; + $pkg_status libbaz >'!libbaz configured !0.1.0'; + $pkg_status libfoo >'!libfoo configured !1.0.0' + } + + : all-held + : + { + $clone_cfg; + + $* ?libfoo/0.0.1 ?libbaz/0.0.2; # Unhold. + + $* --upgrade --recursive <'y' 2>>~%EOE% + drop libfix/0.0.1 (unused) + upgrade libfoo/1.0.0 + drop libbaz/0.0.2 (unused) + upgrade libbar/1.0.0 + continue? [Y/n] disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + disfigured libfix/0.0.1 + purged libfix/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + purged libbaz/0.0.2 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + } + + : prompt + : + { + $clone_cfg; + + $* libbaz/0.0.2 --recursive <'y' 2>>~%EOE% + drop libfix/0.0.1 (unused) + upgrade libfoo/1.0.0 + reconfigure libbaz/0.0.2 + reconfigure libbar (dependent of libbaz) + continue? [Y/n] disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + disfigured libfix/0.0.1 + purged libfix/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + configured libbaz/0.0.2 + configured libbar/0.0.2 + EOE + } + + : override + : + { + $clone_cfg; + + $* libbar/0.0.3 ?libbaz/0.0.3 --recursive --yes 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + %.* + %.*fetched libbar/0.0.3% + unpacked libbar/0.0.3 + configured libbar/0.0.3 + EOE + + $pkg_status libbaz >'libbaz configured !0.0.3 available 0.1.0 0.0.4' + } + + : unhold + : + { + $clone_cfg; + + $* libbar/0.0.3 ?libbaz/0.0.3 ?libfoo --recursive --yes 2>>~%EOE%; + disfigured libbar/0.0.2 + disfigured libbaz/0.0.2 + disfigured libfoo/0.0.1 + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + %.* + %.*fetched libbar/0.0.3% + unpacked libbar/0.0.3 + configured libbar/0.0.3 + EOE + + $pkg_status libbar >'!libbar configured !0.0.3 available 1.0.0'; + $pkg_status libbaz >'libbaz configured !0.0.3 available 0.1.0 0.0.4'; + $pkg_status libfoo >'libfoo configured 1.0.0' + } + + : unavailable + : + : Test that the selected dependency (libfix/0.0.1) is silently left + : unchanged if there is no package available from the dependents + : repositories. + : + { + $clone_cfg; + $rep_remove $rep/t0a $rep/t0b $rep/t0c; + + $* libbar --recursive --yes + } + + -$pkg_drop libbar libbaz libfoo + } +} + +: dependent +: +{ + +$clone_cfg + +$rep_add $rep/t2 && $rep_fetch + + : update + : + : Test --update-dependent option. + : + { + $clone_cfg; + + $* --yes libbar 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + %info: .+ is up to date% + updated libbar/1.0.0 + EOE + + $rep_add $rep/t4a && $rep_fetch; + + $* --update-dependent libfoo/1.1.0 <'y' 2>>~%EOE%; + upgrade libfoo/1.1.0 + reconfigure libbar (dependent of libfoo) + continue? [Y/n] disfigured libbar/1.0.0 + disfigured libfoo/1.0.0 + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + configured libbar/1.0.0 + %info: .+ is up to date%{2} + updated libfoo/1.1.0 + updated libbar/1.0.0 + EOE + + $pkg_disfigure libbar 2>'disfigured libbar/1.0.0'; + $pkg_purge libbar 2>'purged libbar/1.0.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : leave + : + : Test --leave-dependent option. + : + { + $clone_cfg; + + $* --yes libbar 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + %info: .+ is up to date% + updated libbar/1.0.0 + EOE + + $rep_add $rep/t4a && $rep_fetch; + + $* --leave-dependent libfoo/1.1.0 <'y' 2>>~%EOE%; + upgrade libfoo/1.1.0 + reconfigure libbar (dependent of libfoo) + continue? [Y/n] disfigured libbar/1.0.0 + disfigured libfoo/1.0.0 + %.* + %.*fetched libfoo/1.1.0% + unpacked libfoo/1.1.0 + configured libfoo/1.1.0 + configured libbar/1.0.0 + %info: .+ is up to date% + updated libfoo/1.1.0 + EOE + + $pkg_disfigure libbar 2>'disfigured libbar/1.0.0'; + $pkg_purge libbar 2>'purged libbar/1.0.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } +} + +: patch +: +{ + test.arguments += --configure-only --yes + + +$clone_root_cfg + + : held + : + { + +$clone_cfg + +$rep_fetch $rep/t0c + + : success + : + { + $clone_cfg; + + $* libbaz/0.0.3 2>!; + + $* libbaz --patch 2>>~%EOE%; + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.4% + unpacked libbaz/0.0.4 + configured libbaz/0.0.4 + EOE + + $pkg_drop libbaz + } + + : ignore + : + { + $clone_cfg; + + $* libbaz/0.0.3 --patch 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + EOE + + $* libbaz/0.1.0 --patch 2>>~%EOE%; + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.1.0% + unpacked libbaz/0.1.0 + configured libbaz/0.1.0 + EOE + + $pkg_drop libbaz + } + + : warn + : + { + $clone_cfg; + + $* 'sys:libbaz/0.0.3-alpha' 2>!; + + $* libbaz --patch 2>>~%EOE%; + warning: unable to patch libbaz/0.0.3-alpha + info: package is not using semantic/standard version + info: nothing to build + EOE + + $pkg_drop libbaz + } + } + + : dependency + : + { + +$clone_cfg + +$rep_fetch $rep/t0c + + +$* libbox libfix ?libbaz/0.0.3 2>>~%EOE% + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + %.* + %.*fetched libbox/0.0.1% + unpacked libbox/0.0.1 + configured libbox/0.0.1 + %.* + %.*fetched libfix/0.0.3% + unpacked libfix/0.0.3 + configured libfix/0.0.3 + EOE + + clone_cfg = cp --no-cleanup -r ../cfg ./ &cfg/*** + + : explicitly + : + : Here we also test that the package --path option overrides the global + : --upgrade option. + : + { + $clone_cfg; + + $* ?libbaz +{ --patch } --upgrade 2>>~%EOE% + disfigured libbox/0.0.1 + disfigured libfix/0.0.3 + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.4% + unpacked libbaz/0.0.4 + configured libbaz/0.0.4 + configured libfix/0.0.3 + configured libbox/0.0.1 + EOE + } + + : warn + : + { + $clone_cfg; + + $* '?sys:libbaz/0.0.4-alpha' 2>!; + + $* ?libbaz --patch 2>>~%EOE% + warning: unable to patch libbaz/0.0.4-alpha + info: package is not using semantic/standard version + EOE + } + + : recursive + : + { + $clone_cfg; + + $* --patch --recursive 2>>~%EOE% + disfigured libfix/0.0.3 + disfigured libbox/0.0.1 + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.4% + unpacked libbaz/0.0.4 + configured libbaz/0.0.4 + configured libbox/0.0.1 + configured libfix/0.0.3 + EOE + } + + : upgrade-wins-patch + : + : Test that --upgrade options wins --patch. + : + { + $clone_cfg; + + $* libbox +{ --upgrade-immediate } libfix +{ --patch-immediate } 2>>~%EOE% + disfigured libfix/0.0.3 + disfigured libbox/0.0.1 + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.1.0% + unpacked libbaz/0.1.0 + configured libbaz/0.1.0 + configured libbox/0.0.1 + configured libfix/0.0.3 + EOE + } + + : unavailable + : + { + $clone_cfg; + + $* '?sys:libbaz/0.0.3' 2>>EOE; + disfigured libbox/0.0.1 + disfigured libfix/0.0.3 + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + purged libbaz/0.0.3 + configured sys:libbaz/0.0.3 + configured libfix/0.0.3 + configured libbox/0.0.1 + EOE + + $rep_remove $rep/t0c; + $rep_fetch $rep/t0b; + + $* ?libbaz --patch --yes 2>>EOE != 0 + error: patch version for sys:libbaz/0.0.3 is not available from its dependents' repositories + EOE + } + + -$pkg_drop libbox libfix libbaz libfoo + } + + : from-repository + : + { + test.arguments += --patch --auth all --trust-yes + + +$clone_cfg + + +$* "libbaz/0.0.3@$rep/t0c" 2>>~%EOE% + added pkg:build2.org/pkg-build/t0c + %.* + %.*fetching pkg:build2.org/pkg-build/t0c% + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.3% + unpacked libbaz/0.0.3 + configured libbaz/0.0.3 + EOE + + clone_cfg = cp --no-cleanup -r ../cfg ./ &cfg/*** + + : explicit + : + { + $clone_cfg; + + $* "libbaz@$rep/t0c" 2>>~%EOE% + fetching pkg:build2.org/pkg-build/t0c + disfigured libbaz/0.0.3 + disfigured libfoo/1.0.0 + purged libfoo/1.0.0 + %.* + %.*fetched libbaz/0.0.4% + unpacked libbaz/0.0.4 + configured libbaz/0.0.4 + EOE + } + + : implicit + : + : Note that libfoo also becomes held. + : + { + $clone_cfg; + + $* "@$rep/t0c" 2>>~%EOE%; + fetching pkg:build2.org/pkg-build/t0c + info: package libbar is not present in configuration + info: package libbox is not present in configuration + info: package libfix is not present in configuration + disfigured libbaz/0.0.3 + %.* + %.*fetched libbaz/0.0.4% + unpacked libbaz/0.0.4 + configured libbaz/0.0.4 + EOE + + $pkg_status libfoo >'!libfoo configured !1.0.0' + } + + -$pkg_drop libbaz libfoo + } +} + +: configure-only +: +: Test --configure-only option. +: +{ + $clone_cfg; + $rep_add $rep/t2 && $rep_fetch; + + $* --configure-only --yes libbar 2>>~%EOE%; + %.* + %.*fetched libfoo/1.0.0% + unpacked libfoo/1.0.0 + configured libfoo/1.0.0 + %.* + %.*fetched libbar/1.0.0% + unpacked libbar/1.0.0 + configured libbar/1.0.0 + EOE + + $pkg_disfigure libbar 2>'disfigured libbar/1.0.0'; + $pkg_purge libbar 2>'purged libbar/1.0.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' +} + +: repository-location +: +{ + test.arguments += --yes --auth all --trust-yes + + : all-packages + : + { + : explicit + : + { + $clone_root_cfg; + + $* "@$rep/t4d" 2>>~%EOE%; + %.+ + %info: .+ is up to date%{2} + updated libfox/1.0.0 + updated libbiz/1.0.0 + EOE + + $pkg_disfigure libbiz 2>'disfigured libbiz/1.0.0'; + $pkg_purge libbiz 2>'purged libbiz/1.0.0'; + + $pkg_disfigure libfox 2>'disfigured libfox/1.0.0'; + $pkg_purge libfox 2>'purged libfox/1.0.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : url-detection + : + { + $clone_root_cfg; + + if ($remote != true) + rep = ($cxx.target.class != 'windows' \ + ? "file:$rep" \ + : "file:/$regex.replace($rep, '\\', '/')") + end; + + $* "$rep/t4d" 2>>~%EOE%; + %.+ + %info: .+ is up to date%{2} + updated libfox/1.0.0 + updated libbiz/1.0.0 + EOE + + $pkg_disfigure libbiz 2>'disfigured libbiz/1.0.0'; + $pkg_purge libbiz 2>'purged libbiz/1.0.0'; + + $pkg_disfigure libfox 2>'disfigured libfox/1.0.0'; + $pkg_purge libfox 2>'purged libfox/1.0.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + } + + : multiple-packages + : + { + $clone_root_cfg; + + $* "libfox,libbiz/1.0.0@$rep/t4d" 2>>~%EOE%; + %.+ + %info: .+ is up to date%{2} + updated libfox/1.0.0 + updated libbiz/1.0.0 + EOE + + $pkg_disfigure libbiz 2>'disfigured libbiz/1.0.0'; + $pkg_purge libbiz 2>'purged libbiz/1.0.0'; + + $pkg_disfigure libfox 2>'disfigured libfox/1.0.0'; + $pkg_purge libfox 2>'purged libfox/1.0.0'; + + $pkg_disfigure libbaz 2>'disfigured libbaz/1.1.0'; + $pkg_purge libbaz 2>'purged libbaz/1.1.0'; + + $pkg_disfigure libbar 2>'disfigured libbar/1.1.0'; + $pkg_purge libbar 2>'purged libbar/1.1.0'; + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } + + : version + : + : Test that libfoo/0.0.1 package version is built (repository t0a), rather + : than libfoo/1.0.0 (repository t4a). + : + { + $clone_root_cfg; + + $rep_fetch $rep/t4c 2>!; + + $* "libfoo@$rep/t0a" 2>>~%EOE%; + %.+ + configured libfoo/0.0.1 + %info: .+ is up to date% + updated libfoo/0.0.1 + EOE + + $pkg_drop libfoo + } + + : no-patch + : + : Here we also test that --patch options is ignored if there is no selected + : package in the configuration. + : + { + $clone_root_cfg; + + $* "libfoo@$rep/t1" --patch 2>>~%EOE%; + %.+ + configured libfoo/1.0.0 + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $* "libfoo@$rep/t3" --patch 2>>~%EOE% != 0; + %.+ + error: patch version for libfoo/1.0.0 is not found in pkg:build2.org/pkg-build/t3 + EOE + + $pkg_drop libfoo + } + + : package-in-complement + : + { + $clone_root_cfg; + + $* "libfoo@$rep/t4d" 2>>~%EOE%; + %.+ + %info: .+ is up to date% + updated libfoo/1.0.0 + EOE + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.0.0'; + $pkg_purge libfoo 2>'purged libfoo/1.0.0' + } + + : system + : + { + $clone_root_cfg; + + $* "sys:libbiz/2.0.0@$rep/t4d" 2>>~%EOE%; + %.+ + configured sys:libbiz/2.0.0 + EOE + + $pkg_disfigure libbiz 2>'purged libbiz/2.0.0' + } + + : non-existent-package + : + { + $clone_root_cfg; + + $* "libbar@$rep/t4d" 2>>~%EOE% != 0 + %.+ + error: package libbar is not found in pkg:build2.org/pkg-build/t4d or its complements + EOE + } + + : location-search + : + : Test that the repository location is searched in the database before being + : parsed. The latest would fail as the repository type would be misguessed. + : + { + $clone_root_cfg; + $rep_add $src/libfoo-1.1.0 --type dir && $rep_fetch; + + d = $canonicalize([dir_path] $src/libfoo-1.1.0); + + $* "libfoo@$d" 2>>~"%EOE%"; + fetching dir:$d + using libfoo/1.1.0 \(external\) + configured libfoo/1.1.0 + %info: .+ is up to date% + updated libfoo/1.1.0 + EOE + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } +} + +: dir-rep +: +{ + : preferred + : + : Test that dir (local) repository is preferred over non-dir local repository + : that comes first. + : + { + $clone_root_cfg; + $rep_fetch $rep/t4a; + $rep_add $src/libfoo-1.1.0 --type dir; + $rep_fetch "dir:$canonicalize([dir_path] $src/libfoo-1.1.0)"; + + $* libfoo 2>>~%EOE%; + using libfoo/1.1.0 (external) + configured libfoo/1.1.0 + %info: .+ is up to date% + updated libfoo/1.1.0 + EOE + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0'; + $pkg_purge libfoo 2>'purged libfoo/1.1.0' + } +} + +: keep-out +: +{ + +$cfg_create cxx "config.cxx=$config.cxx" -d cfg 2>- &cfg/*** + + # Build libhello as an external package. + # + +cp -r $src/libhello-1.0.0 ./libhello + +$rep_add libhello --type dir + +$rep_fetch + +$* libhello 2>! + + # Move libhello version ahead. + # + +sed -i -e 's/(version: 1.0).0/\1.1/' libhello/manifest + +$rep_fetch + + test.arguments += --yes # Is a command-specific option. + + : unspecified + : + : Test that libhello is fully rebuilt. + : + { + $clone_cfg; + $rep_fetch; + + $* libhello 2>>~%EOE% + disfigured libhello/1.0.0 + using libhello/1.0.1 (external) + configured libhello/1.0.1 + %(mkdir|c\+\+|ld|ar) .+%{8} + updated libhello/1.0.1 + EOE + } + + : specified + : + { + test.arguments += --keep-out + + +$clone_cfg + + : dir-repo + : + : Test that libhello is built incrementally. May re-link due to the + : configuration copying. + : + { + $clone_cfg; + + $* libhello 2>>~%EOE%; + disfigured libhello/1.0.0 + using libhello/1.0.1 (external) + configured libhello/1.0.1 + %ld .+%? + updated libhello/1.0.1 + EOE + + test -d cfg/libhello/; + test -d cfg/libhello-1.0.1/ == 1 + } + + : directory + : + : Test that libhello is built incrementally. May re-link due to the + : configuration copying. + : + { + +$clone_cfg + + # To avoid 'external package is already available' failure for the + # nested tests. + # + +$rep_remove --all + + : arg + : + { + $clone_cfg; + + $* ../../../libhello/ 2>>~%EOE%; + disfigured libhello/1.0.0 + using libhello/1.0.1 (external) + configured libhello/1.0.1 + %ld .+%? + updated libhello/1.0.1 + EOE + + test -d cfg/libhello/; + test -d cfg/libhello-1.0.1/ == 1 + } + + : unpacked + : + { + $clone_cfg; + $pkg_disfigure libhello --keep-out 2>!; + $pkg_unpack -r -e ../../../libhello; + + $* libhello 2>>~%EOE%; + configured libhello/1.0.1 + %ld .+%? + updated libhello/1.0.1 + EOE + + test -d cfg/libhello/; + test -d cfg/libhello-1.0.1/ == 1 + } + } + + : archive + : + : Test that libhello is fully rebuilt, as the resulted package is not + : external. + { + clone_cfg = cp -p --no-cleanup -r ../../cfg ./ + + +$build 'dist(../../libhello/@./out/)' \ + "config.cxx=$config.cxx" config.dist.root=./ \ + config.dist.archives=tar.gz 2>! \ + &libhello-1.0.1/*** &libhello-1.0.1.tar.gz + + : arg + : + { + $clone_cfg; + + $* ../libhello-1.0.1.tar.gz 2>>~%EOE%; + disfigured libhello/1.0.0 + fetched libhello/1.0.1 + unpacked libhello/1.0.1 + configured libhello/1.0.1 + %(c\+\+|ld|ar) .+%{6} + updated libhello/1.0.1 + EOE + + test -d cfg/libhello-1.0.1/; + test -d cfg/libhello/ == 1; + + $pkg_disfigure libhello 2>'disfigured libhello/1.0.1'; + $pkg_purge libhello 2>'purged libhello/1.0.1'; + + rm -r cfg/ + } + + : unpacked + : + { + $clone_cfg; + + $pkg_disfigure libhello 2>!; + $pkg_fetch -r -e ../libhello-1.0.1.tar.gz; + $pkg_unpack libhello; + + $* libhello 2>>~%EOE%; + configured libhello/1.0.1 + %(c\+\+|ld|ar) .+%{6} + updated libhello/1.0.1 + EOE + + test -d cfg/libhello-1.0.1/; + test -d cfg/libhello/ == 1; + + $pkg_disfigure libhello 2>'disfigured libhello/1.0.1'; + $pkg_purge libhello 2>'purged libhello/1.0.1'; + + rm -r cfg/ + } + } + } + + -$pkg_disfigure libhello 2>'disfigured libhello/1.0.0' + -$pkg_purge libhello 2>'purged libhello/1.0.0' +} + +: iter +: +{ + test.arguments += --yes # Is a command-specific option. + + : already-available + : + { + $clone_root_cfg; + $rep_add $src/libfoo-1.1.0 --type dir && $rep_fetch; + + $* $src/libfoo-1.1.0/ 2>>~%EOE% != 0 + %error: external package libfoo/1.1.0 is already available from dir:.+libfoo-1.1.0% + EOE + } + + : upgrade + : + { + $clone_root_cfg; + + $* $src/libfoo-1.1.0/ 2>>~%EOE%; + using libfoo/1.1.0 (external) + configured libfoo/1.1.0 + %info: .+ is up to date% + updated libfoo/1.1.0 + EOE + + cp -p -r $src/libfoo-1.1.0 libfoo; + + $* libfoo/ 2>>~%EOE%; + disfigured libfoo/1.1.0 + using libfoo/1.1.0#1 (external) + configured libfoo/1.1.0#1 + %info: .+ is up to date% + updated libfoo/1.1.0#1 + EOE + + $rep_add $src/libfoo-1.1.0 --type dir && $rep_fetch; + + $* libfoo 2>>~%EOE%; + disfigured libfoo/1.1.0#1 + using libfoo/1.1.0#2 (external) + configured libfoo/1.1.0#2 + %info: .+ is up to date% + updated libfoo/1.1.0#2 + EOE + + $pkg_disfigure libfoo 2>'disfigured libfoo/1.1.0#2' + } +} + +: ignore-case +: +{ + test.arguments += --yes --auth all --trust-yes + + $clone_cfg; + + $* "libbar@$rep/t5" 2>>~%EOE%; + added pkg:build2.org/pkg-build/t5 + fetching pkg:build2.org/pkg-build/t5 + %.* + %.*fetched libbar/1.2.0% + unpacked libbar/1.2.0 + configured libbar/1.2.0 + %info: .+ is up to date% + updated libbar/1.2.0 + EOE + + $* "libbar@$rep/t6" 2>>~%EOE%; + added pkg:build2.org/pkg-build/t6 + fetching pkg:build2.org/pkg-build/t6 + disfigured libbar/1.2.0 + %.* + %.*fetched libBar/2.0.0% + unpacked libBar/2.0.0 + configured libBar/2.0.0 + %info: .+ is up to date% + updated libBar/2.0.0 + EOE + + $pkg_status libbar >'!libBar configured !2.0.0'; + + test -d cfg/libBar-2.0.0; + + $pkg_drop libbar +} + +: git-rep +: +if ($git_supported != true) +{ + # Skip git repository tests. + # +} +else +{ + rep0 = "$rep_git/state0" + rep1 = "$rep_git/state1" + + test.arguments += --yes + + pkg_disfigure += 2>! + pkg_purge += 2>! + + : prerequisite-repo + : + : Dependency package of the dependent being built is in the prerequisite + : repository. + : + { + $clone_root_cfg; + $rep_add "$rep0/libbar.git#master"; + $rep_add "$rep0/style-basic.git#master"; + $rep_fetch &cfg/.bpkg/repos/*/***; + + $* libmbar 2>>~%EOE%; + %distributing style-basic/.+% + %checked out style-basic/.+% + %configured style-basic/.+% + distributing libmbar/1.0.0 + checked out libmbar/1.0.0 + configured libmbar/1.0.0 + %info: .+ is up to date% + updated libmbar/1.0.0 + EOE + + $pkg_disfigure libmbar; + $pkg_disfigure style-basic; + + $pkg_purge libmbar; + $pkg_purge style-basic + } + + : no-prerequisite-repos + : + : Dependent package repository has no prerequisites nor complements. Its + : dependency is picked up via the root repository that complements its + : repository (see rep_fetch() function implementation for details). + : + { + $clone_root_cfg; + $rep_add "$rep1/libbaz.git#master"; + $rep_add "$rep0/style-basic.git#master"; + $rep_fetch &cfg/.bpkg/repos/*/***; + + $* libbaz 2>>~%EOE%; + %distributing style-basic/.+% + %checked out style-basic/.+% + %configured style-basic/.+% + distributing libbaz/1.0.0 + checked out libbaz/1.0.0 + configured libbaz/1.0.0 + %info: .+ is up to date% + updated libbaz/1.0.0 + EOE + + $pkg_disfigure libbaz; + $pkg_disfigure style-basic; + + $pkg_purge libbaz; + $pkg_purge style-basic + } + + : build-unpacked + : + : Test that the unpacked external package is properly built for the first + : time and is not rebuilt afterwards via the directory argument. + : + if ($remote != true) + { + $clone_root_cfg; + + d = $canonicalize([dir_path] $out_git/state0/style-basic.git); + $pkg_unpack -e $d; + + $* style-basic 2>>~%EOE%; + %configured style-basic/1\.1\.0-a\.0\.\d+\..+% + %info: .+ is up to date% + %updated style-basic/1\.1\.0-a\.0\.\d+\..+% + EOE + + $* $d 2>>~%EOE%; + %info: .+ is up to date% + %updated style-basic/1\.1\.0-a\.0\.\d+\..+% + EOE + + $pkg_disfigure style-basic + } +} |