diff options
Diffstat (limited to 'tests/rep-fetch.testscript')
-rw-r--r-- | tests/rep-fetch.testscript | 981 |
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 + } + } + } +} |