aboutsummaryrefslogtreecommitdiff
path: root/tests/pkg-build.testscript
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-09-04 14:02:11 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-09-04 14:02:11 +0300
commitf8fdb500cc705e2b8b4a74166ceb2c6d8cee3fd3 (patch)
tree3f94b0b79ebad275904b9dc4a4165326ff598492 /tests/pkg-build.testscript
parentf727c2b8fe273a12d059826291523060dab4b512 (diff)
Rename .test/test{} to .testscript/testscript{}
Diffstat (limited to 'tests/pkg-build.testscript')
-rw-r--r--tests/pkg-build.testscript3473
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
+ }
+}