aboutsummaryrefslogtreecommitdiff
path: root/tests/rep-fetch.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/rep-fetch.testscript
parentf727c2b8fe273a12d059826291523060dab4b512 (diff)
Rename .test/test{} to .testscript/testscript{}
Diffstat (limited to 'tests/rep-fetch.testscript')
-rw-r--r--tests/rep-fetch.testscript981
1 files changed, 981 insertions, 0 deletions
diff --git a/tests/rep-fetch.testscript b/tests/rep-fetch.testscript
new file mode 100644
index 0000000..c1828a8
--- /dev/null
+++ b/tests/rep-fetch.testscript
@@ -0,0 +1,981 @@
+# file : tests/rep-fetch.testscript
+# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+.include common.testscript \
+ auth.testscript \
+ config.testscript \
+ remote.testscript \
+ remote-git.testscript
+
+# Source repository:
+#
+# rep-fetch
+# |-- bar
+# | |-- stable -> ../foo/stable (prerequisite)
+# | | |-- libbar-1.0.0.tar.gz -> libfoo >= 1.0.0
+# | | `-- repositories.manifest
+# | |-- testing -> stable (complement),
+# | | | ../foo/testing (prerequisite)
+# | | |-- libbar-1.1.0.tar.gz -> libfoo >= 1.1.0
+# | | `-- repositories.manifest
+# | `-- unstable -> testing (complement),
+# | | ../foo/testing (prerequisite)
+# | |-- libbar-1.1.1.tar.gz -> libfoo >= 1.1.0
+# | `-- repositories.manifest
+# |
+# |-- foo
+# | |-- stable
+# | | |-- libfoo-1.0.0.tar.gz
+# | | `-- repositories.manifest
+# | `-- testing -> stable (complement)
+# | |-- libfoo-1.1.0.tar.gz
+# | `-- repositories.manifest
+# |
+# `-- hello
+# | |-- libhello-1.0.0.tar.gz
+# | `-- repositories.manifest
+# |
+# |-- libhello-1.0.0
+# | |-- build
+# | | |-- bootstrap.build
+# | | |-- export.build
+# | | `-- root.build
+# | `-- *
+# |
+# |-- cycle
+# | |-- extra -> stable (prerequisite)
+# | | |-- libbar-1.1.0+1.tar.gz
+# | | `-- repositories.manifest
+# | |-- math -> extra (prerequisite)
+# | | |-- libbar-1.0.0.tar.gz
+# | | `-- repositories.manifest
+# | `-- stable -> math (prerequisite)
+# | |-- libfoo-1.0.0.tar.gz
+# | `-- repositories.manifest
+# |
+# |-- no-cycle
+# | |-- extra
+# | | |-- libbar-1.1.0+1.tar.gz
+# | | `-- repositories.manifest
+# | |-- math
+# | | |-- libbar-1.0.0.tar.gz
+# | | `-- repositories.manifest
+# | `-- stable -> extra (prerequisite)
+# | |-- libfoo-1.0.0.tar.gz
+# | `-- repositories.manifest
+# |
+# `-- git/* (see rep-fetch-git.testscript)
+
+# Prepare repositories used by tests if running in the local mode.
+#
++if ($remote != true)
+ rep_create += 2>!
+
+ # Create the signed 'hello' repository.
+ #
+ cp -r $src/hello $out/hello
+ cat <<<$cert_manifest >+$out/hello/repositories.manifest
+
+ $rep_create --key $key $out/hello &$out/hello/packages.manifest \
+ &$out/hello/signature.manifest
+
+ # Create 'foo/*' repositories.
+ #
+ cp -r $src/foo $out/foo
+
+ # Sign foo/stable repository.
+ #
+ cat <<<$cert_manifest >+$out/foo/stable/repositories.manifest
+ $rep_create --key $key $out/foo/stable &$out/foo/stable/packages.manifest \
+ &$out/foo/stable/signature.manifest
+
+ # Add dependent trust to foo complement repository into the foo/testing
+ # repository manifest.
+ #
+ tv = "trust: $cert_fp
+:"
+
+ sed -i -e "s/^\(:\)\$/$tv/" $out/foo/testing/repositories.manifest
+
+ $rep_create $out/foo/testing &$out/foo/testing/packages.manifest
+
+ # Create 'bar/*' repositories.
+ #
+ cp -r $src/bar $out/bar
+ $rep_create $out/bar/stable &$out/bar/stable/packages.manifest
+ $rep_create $out/bar/testing &$out/bar/testing/packages.manifest
+ $rep_create $out/bar/unstable &$out/bar/unstable/packages.manifest
+
+ # Create 'cycle/*' repositories.
+ #
+ cp -r $src/cycle $out/cycle
+ $rep_create $out/cycle/extra &$out/cycle/extra/packages.manifest
+ $rep_create $out/cycle/math &$out/cycle/math/packages.manifest
+ $rep_create $out/cycle/stable &$out/cycle/stable/packages.manifest
+
+ # Create git repositories.
+ #
+ $git_extract $src/git/state0/libfoo.tar
+ $git_extract $src/git/state0/libfox.tar
+ $git_extract $src/git/state0/libbar.tar
+ $git_extract $src/git/state0/style.tar
+ $git_extract $src/git/state0/style-basic.tar &$out_git/state0/***
+
+ $git_extract $src/git/state1/libfoo.tar
+ $git_extract $src/git/state1/libbaz.tar
+ $git_extract $src/git/state1/style.tar
+ $git_extract $src/git/state1/style-basic.tar &$out_git/state1/***
+end
+
+rep_add += -d cfg 2>!
+rep_list += -d cfg --prerequisites --complements
+rep_remove += -d cfg 2>!
+pkg_status += -d cfg
+pkg_fetch += -d cfg 2>!
+pkg_unpack += -d cfg 2>!
+pkg_checkout += -d cfg
+pkg_purge += -d cfg
+pkg_drop += -d cfg --yes 2>!
+
+: no-repos
+:
+$clone_cfg;
+$* 2>>/EOE != 0
+ error: configuration cfg/ has no repositories
+ info: use 'bpkg rep-add' to add a repository
+ EOE
+
+: pkg-rep
+:
+{
+ test.options += --auth all
+
+ : hello
+ :
+ {
+ $clone_root_cfg && $rep_add $rep/hello;
+
+ $* --trust $cert_fp 2>>EOE &cfg/.bpkg/certs/**;
+ fetching pkg:build2.org/rep-fetch/hello
+ 1 package(s) in 1 repository(s)
+ EOE
+
+ $* 2>>EOE
+ fetching pkg:build2.org/rep-fetch/hello
+ 1 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : bar-unstable
+ :
+ {
+ $clone_root_cfg && $rep_add $rep/bar/unstable;
+
+ $* --trust-yes 2>>EOE &cfg/.bpkg/certs/**;
+ fetching pkg:build2.org/rep-fetch/bar/unstable
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ 5 package(s) in 5 repository(s)
+ EOE
+
+ $* 2>>EOE
+ fetching pkg:build2.org/rep-fetch/bar/unstable
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ 5 package(s) in 5 repository(s)
+ EOE
+ }
+
+ : both
+ :
+ {
+ $clone_root_cfg && $rep_add $rep/hello $rep/bar/unstable;
+
+ $* --trust-yes 2>>EOE &cfg/.bpkg/certs/**;
+ fetching pkg:build2.org/rep-fetch/bar/unstable
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/hello
+ 6 package(s) in 6 repository(s)
+ EOE
+
+ $* 2>>EOE
+ fetching pkg:build2.org/rep-fetch/bar/unstable
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/hello
+ 6 package(s) in 6 repository(s)
+ EOE
+ }
+
+ : location-args
+ :
+ {
+ $clone_root_cfg;
+
+ $* --trust-yes $rep/bar/unstable 2>>EOE &cfg/.bpkg/certs/**;
+ added pkg:build2.org/rep-fetch/bar/unstable
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ 5 package(s) in 5 repository(s)
+ EOE
+
+ $* 'pkg:build2.org/rep-fetch/bar/unstable' 2>>EOE;
+ fetching pkg:build2.org/rep-fetch/bar/testing (complements pkg:build2.org/rep-fetch/bar/unstable)
+ fetching pkg:build2.org/rep-fetch/bar/stable (complements pkg:build2.org/rep-fetch/bar/testing)
+ fetching pkg:build2.org/rep-fetch/foo/stable (prerequisite of pkg:build2.org/rep-fetch/bar/stable)
+ fetching pkg:build2.org/rep-fetch/foo/testing (prerequisite of pkg:build2.org/rep-fetch/bar/testing)
+ 5 package(s) in 5 repository(s)
+ EOE
+
+ $rep_list >>"EOO"
+ pkg:build2.org/rep-fetch/bar/unstable ($rep/bar/unstable)
+ complement pkg:build2.org/rep-fetch/bar/testing ($rep/bar/testing)
+ complement pkg:build2.org/rep-fetch/bar/stable ($rep/bar/stable)
+ prerequisite pkg:build2.org/rep-fetch/foo/stable ($rep/foo/stable)
+ prerequisite pkg:build2.org/rep-fetch/foo/testing ($rep/foo/testing)
+ complement pkg:build2.org/rep-fetch/foo/stable ($rep/foo/stable)
+ prerequisite pkg:build2.org/rep-fetch/foo/testing ($rep/foo/testing)
+ complement pkg:build2.org/rep-fetch/foo/stable ($rep/foo/stable)
+ EOO
+ }
+
+ : prerequisites-cycle
+ :
+ {
+ $clone_root_cfg;
+
+ $* --trust-yes $rep/cycle/stable 2>>EOE;
+ added pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/math (prerequisite of pkg:build2.org/rep-fetch/cycle/stable)
+ fetching pkg:build2.org/rep-fetch/cycle/extra (prerequisite of pkg:build2.org/rep-fetch/cycle/math)
+ 3 package(s) in 3 repository(s)
+ EOE
+
+ $rep_list >>"EOO"
+ pkg:build2.org/rep-fetch/cycle/stable ($rep/cycle/stable)
+ prerequisite pkg:build2.org/rep-fetch/cycle/math ($rep/cycle/math)
+ prerequisite pkg:build2.org/rep-fetch/cycle/extra ($rep/cycle/extra)
+ prerequisite pkg:build2.org/rep-fetch/cycle/stable ($rep/cycle/stable)
+ EOO
+ }
+
+ : unreferenced-prerequisite
+ :
+ {
+ +$clone_root_cfg
+
+ # Create the no-cycle repository as the new state of the cycle repository.
+ # The cycle dependency is now broken (extra/ doesn't depend on stable/
+ # anymore) and the extra/ prerequisite is moved from math/ to stable/.
+ #
+ nc_rep = [dir_path] $~/pkg/1/build2.org/rep-fetch/cycle/
+ +mkdir -p $path.directory($nc_rep)
+ +cp -r $src/no-cycle "$nc_rep" # Strip trailing slash.
+
+ +$rep_create $nc_rep/extra 2>! &$nc_rep/extra/packages.manifest
+ +$rep_create $nc_rep/math 2>! &$nc_rep/math/packages.manifest
+ +$rep_create $nc_rep/stable 2>! &$nc_rep/stable/packages.manifest
+
+ math_rep = $nc_rep/math
+ stable_rep = $nc_rep/stable
+
+ : remove
+ :
+ {
+ $clone_cfg;
+
+ $* --trust-yes $rep/cycle/stable 2>>EOE;
+ added pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/math (prerequisite of pkg:build2.org/rep-fetch/cycle/stable)
+ fetching pkg:build2.org/rep-fetch/cycle/extra (prerequisite of pkg:build2.org/rep-fetch/cycle/math)
+ 3 package(s) in 3 repository(s)
+ EOE
+
+ $* --trust-yes $stable_rep 2>>EOE;
+ updated pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/extra (prerequisite of pkg:build2.org/rep-fetch/cycle/stable)
+ 2 package(s) in 2 repository(s)
+ EOE
+
+ $rep_list >>"EOO"
+ pkg:build2.org/rep-fetch/cycle/stable ($nc_rep/stable)
+ prerequisite pkg:build2.org/rep-fetch/cycle/extra ($nc_rep/extra)
+ EOO
+ }
+
+ : no-remove
+ :
+ {
+ $clone_cfg;
+
+ $* --trust-yes $rep/cycle/stable 2>>EOE;
+ added pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/math (prerequisite of pkg:build2.org/rep-fetch/cycle/stable)
+ fetching pkg:build2.org/rep-fetch/cycle/extra (prerequisite of pkg:build2.org/rep-fetch/cycle/math)
+ 3 package(s) in 3 repository(s)
+ EOE
+
+ $* --trust-yes $math_rep $stable_rep 2>>EOE;
+ added pkg:build2.org/rep-fetch/cycle/math
+ updated pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/math
+ fetching pkg:build2.org/rep-fetch/cycle/stable
+ fetching pkg:build2.org/rep-fetch/cycle/extra (prerequisite of pkg:build2.org/rep-fetch/cycle/stable)
+ 3 package(s) in 3 repository(s)
+ EOE
+
+ $rep_list >>"EOO"
+ pkg:build2.org/rep-fetch/cycle/math ($nc_rep/math)
+ pkg:build2.org/rep-fetch/cycle/stable ($nc_rep/stable)
+ prerequisite pkg:build2.org/rep-fetch/cycle/extra ($nc_rep/extra)
+ EOO
+ }
+ }
+
+ : use-auth
+ :
+ {
+ : dependent-trust
+ :
+ : Test that the certificate of foo/stable complement repository is
+ : silently authenticated for use by the dependent foo/testing repository.
+ : In this case the certificate is not saved into the database (see the
+ : subsequent 'rep-fetch $rep/foo/stable' test) and certificate file is not
+ : persisted (otherwise cleanup of non-empty cfg/ directory would fail).
+ :
+ {
+ $clone_root_cfg;
+
+ $* --verbose 2 $rep/foo/testing <'y' 2>>~%EOE%;
+ added pkg:build2.org/rep-fetch/foo/testing
+ %.*
+ warning: repository pkg:build2.org/rep-fetch/foo/testing is unsigned
+ %continue without authenticating repositories at .+\? \[y/n\] .+%
+ %.+
+ info: certificate for repository pkg:build2.org/rep-fetch/foo/stable authenticated by dependent trust
+ %.+
+ 2 package(s) in 2 repository(s)
+ EOE
+
+ $* $rep/foo/stable 2>>~%EOE% != 0
+ %.+
+ warning: authenticity of the certificate for repository pkg:build2.org/rep-fetch/foo/stable cannot be established
+ %.+
+ EOE
+ }
+
+ : dependent-command-line
+ :
+ : Test that the certificate of foo/stable complement repository is
+ : authenticated for use by the command line (persisted into the database
+ : and the filesystem) rather than dependent trust.
+ :
+ {
+ $clone_root_cfg;
+
+ $* --trust $cert_fp --verbose 2 $rep/foo/testing <'y' 2>>~%EOE% &cfg/.bpkg/certs/**
+ added pkg:build2.org/rep-fetch/foo/testing
+ %.*
+ warning: repository pkg:build2.org/rep-fetch/foo/testing is unsigned
+ %continue without authenticating repositories at .+\? \[y/n\] .+%
+ %.+
+ info: certificate for repository pkg:build2.org/rep-fetch/foo/stable authenticated by command line
+ %.+
+ 2 package(s) in 2 repository(s)
+ EOE
+ }
+
+ : dependent-trust-prompt
+ :
+ : Test that the certificate of foo/stable repository is first authenticated
+ : for use by the dependent foo/test repository and then by the user (via
+ : the prompt) as a top-level repository during a single rep-fetch
+ : operation.
+ :
+ {
+ yy = 'y
+y'
+ $clone_root_cfg;
+
+ $* --verbose 2 $rep/foo/testing $rep/foo/stable <$yy 2>>~%EOE% &cfg/.bpkg/certs/**
+ added pkg:build2.org/rep-fetch/foo/testing
+ added pkg:build2.org/rep-fetch/foo/stable
+ fetching pkg:build2.org/rep-fetch/foo/testing
+ %.*
+ warning: repository pkg:build2.org/rep-fetch/foo/testing is unsigned
+ %continue without authenticating repositories at .+\? \[y/n\] .+%
+ %.+
+ info: certificate for repository pkg:build2.org/rep-fetch/foo/stable authenticated by dependent trust
+ %.+
+ warning: authenticity of the certificate for repository pkg:build2.org/rep-fetch/foo/stable cannot be established
+ certificate is for build2.org, "Code Synthesis" <info@build2.org>
+ %.+
+ %.+2 package\(s\) in 2 repository\(s\)%
+ EOE
+ }
+
+ : command-line-dependent-noop
+ :
+ : Test that the certificate of foo/stable repository is first authenticated
+ : by the user (via the command line) as a top-level repository and so
+ : authentication for use by the dependent foo/test is noop.
+ :
+ {
+ $clone_root_cfg;
+
+ $* --trust $cert_fp --verbose 2 $rep/foo/stable $rep/foo/testing <'y' 2>>~%EOE% &cfg/.bpkg/certs/**
+ added pkg:build2.org/rep-fetch/foo/stable
+ added pkg:build2.org/rep-fetch/foo/testing
+ fetching pkg:build2.org/rep-fetch/foo/stable
+ %.+
+ info: certificate for repository pkg:build2.org/rep-fetch/foo/stable authenticated by command line
+ %.+
+ fetching pkg:build2.org/rep-fetch/foo/testing
+ %.*
+ warning: repository pkg:build2.org/rep-fetch/foo/testing is unsigned
+ %continue without authenticating repositories at .+\? \[y/n\] .+%
+ %.*
+ 2 package(s) in 2 repository(s)
+ EOE
+ }
+ }
+}
+
+: dir-rep
+:
+: For dir repository tests we will reuse local git repositories, that have the
+: same repository structure.
+:
+if ($remote != true)
+{
+ rep_add += --type dir
+
+ +cp -r $out_git/state0 $~/state0
+
+ rep = $canonicalize([dir_path] $~/state0)
+
+ +cat <<EOI >= $rep/libbar.git/repositories.manifest
+ : 1
+ role: prerequisite
+ type: dir
+ location: ../style-basic.git
+ EOI
+
+ +$clone_cfg && $rep_add $rep/libbar.git
+
+ : prerequisites
+ :
+ {
+ $clone_cfg;
+
+ $* 2>>"EOE";
+ fetching dir:($rep/libbar.git)
+ fetching dir:($rep/style-basic.git) \(prerequisite of dir:($rep/libbar.git)\)
+ 3 package\(s\) in 2 repository\(s\)
+ EOE
+
+ $rep_list >>"EOO"
+ dir:($rep/libbar.git) ($rep/libbar.git)
+ prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
+ EOO
+ }
+
+ : by-name
+ :
+ : Here we, in particular, test that the local repository canonical name
+ : (dir:/...) is not confused with the repository URL.
+ :
+ {
+ $clone_cfg;
+ $* 2>!;
+
+ $* "dir:($rep/libbar.git)" 2>>"EOE";
+ fetching dir:($rep/style-basic.git) \(prerequisite of dir:($rep/libbar.git)\)
+ 3 package\(s\) in 2 repository\(s\)
+ EOE
+
+ $rep_list >>"EOO"
+ dir:($rep/libbar.git) ($rep/libbar.git)
+ prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
+ EOO
+ }
+
+ : shallow
+ :
+ {
+ +$clone_cfg
+
+ : respected
+ :
+ {
+ $clone_cfg;
+ $* 2>!;
+
+ $* --shallow "dir:($rep/libbar.git)" 2>>"EOE";
+ 3 package\(s\) in 2 repository\(s\)
+ EOE
+
+ $rep_list >>"EOO"
+ dir:($rep/libbar.git) ($rep/libbar.git)
+ prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
+ EOO
+ }
+
+ : ignored
+ :
+ {
+ $clone_cfg;
+
+ $* --shallow 2>>"EOE";
+ fetching dir:($rep/libbar.git)
+ fetching dir:($rep/style-basic.git) \(prerequisite of dir:($rep/libbar.git)\)
+ 3 package\(s\) in 2 repository\(s\)
+ EOE
+
+ $rep_list >>"EOO"
+ dir:($rep/libbar.git) ($rep/libbar.git)
+ prerequisite dir:($rep/style-basic.git) ($rep/style-basic.git)
+ EOO
+ }
+ }
+}
+
+: iter
+:
+{
+ rep_add += --type dir
+
+ : multiple-repos
+ :
+ {
+ cp -r $src/libhello-1.0.0 libhello1;
+ cp -r $src/libhello-1.0.0 libhello2;
+
+ $clone_root_cfg && $rep_add libhello1 libhello2;
+
+ $* 2>>~%EOE% != 0
+ %fetching dir:.+libhello1%
+ %fetching dir:.+libhello2%
+ error: external package libhello/1.0.0 is available from two repositories
+ % info: repository .+libhello1%
+ % info: repository .+libhello2%
+ EOE
+ }
+
+ : inc
+ :
+ {
+ : path-changed
+ :
+ {
+ $clone_root_cfg && $rep_add $src/libhello-1.0.0;
+
+ $* 2>!;
+ $pkg_unpack libhello/1.0.0;
+
+ $rep_remove --all;
+
+ cp -r $src/libhello-1.0.0 libhello;
+ $rep_add libhello;
+
+ $* 2>!;
+
+ $pkg_status libhello >'libhello unpacked 1.0.0 available 1.0.0#1'
+ }
+
+ : manifest-changed
+ :
+ {
+ cp -r $src/libhello-1.0.0 libhello;
+
+ $clone_root_cfg && $rep_add libhello;
+
+ $* 2>!;
+ $pkg_unpack libhello/1.0.0;
+
+ echo "" >+ libhello/manifest;
+ $* 2>!;
+
+ $pkg_status libhello >'libhello unpacked 1.0.0 available 1.0.0#1'
+ }
+
+ : pkg-rep
+ {
+ +$clone_root_cfg
+
+ +$* --auth all --trust-yes $rep/hello &cfg/.bpkg/certs/** 2>!
+ +$pkg_fetch libhello/1.0.0
+ +$pkg_unpack libhello
+
+ : unchanged-external
+ :
+ {
+ $clone_cfg && $rep_add $src/libhello-1.0.0;
+ $* 2>!;
+
+ $pkg_status libhello >'libhello unpacked 1.0.0'
+ }
+
+ : changed-external
+ :
+ {
+ cp -r $src/libhello-1.0.0 libhello;
+ echo "" >+ libhello/manifest;
+
+ $clone_cfg && $rep_add libhello;
+ $* 2>!;
+
+ $pkg_status libhello >'libhello unpacked 1.0.0 available 1.0.0#1'
+ }
+
+ -$pkg_purge libhello 2>'purged libhello/1.0.0'
+ }
+
+ : git-rep
+ :
+ if ($git_supported == true && $remote != true)
+ {
+ rep = $canonicalize([dir_path] $out_git/state0);
+
+ $clone_root_cfg;
+
+ $* "$rep/style.git#master" 2>! &cfg/.bpkg/repos/*/***;
+
+ # Convert specific warnings to infos as we expect them to appear. This,
+ # in particular, prevents bbot workers to set task result status to
+ # warning.
+ #
+ $pkg_checkout "style/1.0.0" 2>&1 | \
+ sed -e 's/warning: (fetching (over|whole) .*)/info: \1/' >&2 2>!;
+
+ $rep_add $rep/style.git;
+ $* 2>!;
+
+ $pkg_status style >"style unpacked 1.0.0";
+
+ $pkg_purge style 2>"purged style/1.0.0"
+ }
+ }
+
+ : no-inc
+ :
+ {
+ $clone_root_cfg;
+
+ $pkg_unpack -e $src/libhello-1.0.0;
+
+ $rep_add $src/libhello-1.0.0;
+
+ $* 2>>~%EOE%;
+ %fetching dir:.+libhello-1.0.0%
+ 1 package(s) in 1 repository(s)
+ EOE
+
+ $pkg_status libhello >'libhello unpacked 1.0.0'
+ }
+}
+
+: git-rep
+:
+if ($git_supported != true)
+{
+ # Skip git repository tests.
+ #
+}
+else
+{
+ : proto
+ :
+ if ($remote != true)
+ {
+ git_protocol = 'local'
+ .include rep-fetch-git.testscript
+ }
+ else
+ {
+ : https-dumb
+ :
+ {
+ git_protocol = 'https-dumb'
+ .include rep-fetch-git.testscript
+ }
+
+ : https-smart
+ :
+ {
+ git_protocol = 'https-smart'
+ .include rep-fetch-git.testscript
+ }
+
+ : https-smart-unadv
+ :
+ {
+ git_protocol = 'https-smart-unadv'
+ .include rep-fetch-git.testscript
+ }
+
+ : git
+ :
+ {
+ git_protocol = 'git'
+ .include rep-fetch-git.testscript
+ }
+ }
+
+ : strip-ext
+ :
+ : Test that if the local prerequisite git repository having the .git
+ : extension does not exist but the one without the extension does, then
+ : it is picked up by rep-fetch.
+ :
+ if ($remote != true)
+ {
+ cp -r $out_git/state0/libbar.git libbar.git;
+ cp -r $out_git/state0/style-basic.git style-basic;
+
+ $clone_root_cfg;
+
+ rep = ($cxx.target.class != 'windows' \
+ ? "file:$~" \
+ : "file:/$regex.replace($~, '\\', '/')");
+
+ $* "$rep/libbar.git#master" 2>>~%EOE% &cfg/.bpkg/repos/*/***;
+ %added git:.+libbar#master%
+ %querying .+libbar\.git%
+ %fetching from .+libbar\.git%
+ %fetching git:.+style-basic#stable \(prerequisite of git:.+libbar#master\)%
+ %querying .+style-basic%
+ %fetching from .+style-basic%
+ 3 package(s) in 2 repository(s)
+ EOE
+
+ $rep_list >>~%EOO%
+ %git:.+libbar#master file:.+libbar\.git#master%
+ % prerequisite git:.+style-basic#stable file:.+style-basic#stable \(heads/master\)%
+ EOO
+ }
+
+ : checkout-submodules
+ :
+ : Test that if some of the packages are located in the repository
+ : submodules directory, then rep-fetch checks out submoodules.
+ :
+ {
+ $clone_root_cfg && $rep_add "$rep_git/state0/libfox.git#master";
+
+ $* 2>>~%EOE% &cfg/.bpkg/repos/*/***
+ %fetching git:.+libfox#master%
+ %querying .+libfox\.git%
+ %fetching from .+libfox\.git%
+ %warning: .+%{0,2}
+ %querying .+libbar\.git%?
+ %fetching submodule 'libbar' from .+libbar\.git%
+ %warning: .+%{0,2}
+ %submodule path 'libbar': checked out '.+'%
+ 2 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : re-fetching
+ :
+ : Test that repository is re-fetched on the location change. Here it happens
+ : due to the scheme change.
+ :
+ if ($remote == true)
+ {
+ $clone_root_cfg && $rep_add "$rep_git_git/state0/libfoo.git#master";
+ $* 2>! &cfg/.bpkg/repos/*/***;
+ $rep_add "$rep_git_https_smart_unadv/state0/libfoo.git#master";
+
+ $* 2>>~%EOE%
+ %fetching git:.+libfoo#master%
+ %info: location changed for git:.+libfoo#master%
+ % info: new location https://.+libfoo\.git#master%
+ % info: old location git://.+libfoo\.git#master%
+ %querying .+libfoo\.git%
+ 1 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : cleanup-failed
+ :
+ : Test that configuration is cleaned up if fetch fails after the repository
+ : filesystem state is changed.
+ :
+ {
+ $clone_root_cfg && $rep_add "$rep_git/state0/libfoo.git#master";
+
+ # Extract the repository path from the output line like this:
+ #
+ # fetching from <url> in 'cfg/.bpkg/tmp/4bde15f59461'...
+ #
+ $* --verbose 2 2>&1 | \
+ sed -n -e "s/fetching from .+ in '\(.+\)'/\$1/p" | \
+ sed -n -e 's%(.+[\\/])tmp([\\/].+)%$1repos$2%p' | \
+ set r;
+
+ # Break the repo (drop the remote repository URL) and try to re-fetch.
+ #
+ rm "$r/.git/config";
+
+ $* 2>>~%EOE% != 0;
+ %.+
+ warning: repository state is now broken and will be cleaned up
+ info: run 'bpkg rep-fetch' to update
+ EOE
+
+ $pkg_status libfoo >'libfoo unknown'
+ }
+
+ : ref-filters
+ :
+ {
+ test.cleanups += &?cfg/.bpkg/repos/*/***
+
+ : pattern
+ :
+ {
+ : matching
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#v**" 2>>~%EOE%
+ %added .+libfoo#v\*\*%
+ %querying .+libfoo\.git%
+ %fetching from .+libfoo\.git%
+ %warning: .+%{0,2}
+ 2 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : non-matching
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#tags/mast*" 2>>~%EOE%
+ %added .+libfoo#tags/mast\*%
+ %querying .+libfoo\.git%
+ 0 package(s) in 1 repository(s)
+ EOE
+ }
+ }
+
+ : name
+ :
+ {
+ : non-matching
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#foo" 2>>~%EOE% != 0
+ %added .+libfoo#foo%
+ %querying .+libfoo\.git%
+ error: reference 'foo' is not found
+ EOE
+ }
+ }
+
+ : commit
+ :
+ {
+ : non-matching-pattern
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#foo*@9ab039761936802d61b8e591d6812a4dd4605029" 2>>~%EOE% != 0
+ %added .+libfoo#foo\*@9ab039761936802d61b8e591d6812a4dd4605029%
+ %querying .+libfoo\.git%
+ error: no names match pattern 'foo*'
+ EOE
+ }
+
+ : unexisting
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#9ab039761936802d61b8e591d6812a4dd4605029" 2>>~%EOE% != 0
+ %added .+libfoo#9ab039761936802d61b8e591d6812a4dd4605029%
+ %querying .+libfoo\.git%
+ %fetching from .+libfoo\.git%
+ %warning: .+%{0,2}
+ error: unable to fetch commit 9ab039761936802d61b8e591d6812a4dd4605029
+ EOE
+ }
+ }
+
+ : exclusion
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#mast*,-master" 2>>~%EOE%
+ %added .+libfoo#mast\*,-master%
+ %querying .+libfoo\.git%
+ 0 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : inclusion
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git#tags/mast*,+master" 2>>~%EOE%
+ %added .+libfoo#tags/mast\*,\+master%
+ %querying .+libfoo\.git%
+ %fetching from .+libfoo\.git%
+ %warning: .+%{0,2}
+ 1 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : default
+ :
+ {
+ : no-fragment
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git" 2>>~%EOE%
+ %added .+libfoo%
+ %querying .+libfoo\.git%
+ %fetching from .+libfoo\.git%
+ %warning: .+%{0,2}
+ 2 package(s) in 1 repository(s)
+ EOE
+ }
+
+ : with-exclusion
+ :
+ {
+ $clone_root_cfg;
+
+ $* "$rep_git/state0/libfoo.git##-/tags/v1*" 2>>~%EOE%
+ %added .+libfoo##-/tags/v1\*%
+ %querying .+libfoo\.git%
+ %fetching from .+libfoo\.git%
+ %warning: .+%{0,2}
+ 1 package(s) in 1 repository(s)
+ EOE
+ }
+ }
+ }
+}