# file      : tests/rep-list.testscript
# license   : MIT; see accompanying LICENSE file

.include common.testscript \
         config.testscript \
         remote.testscript \
         remote-git.testscript

# Source repository:
#
# rep-list
# |-- 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
# |
# `-- testing                   -> stable (complement), extra (prerequisite)
# |   |-- libbar-2.0.0.tar.gz
# |   `-- repositories.manifest
# |
# `-- git
#     |-- libbar.git            -> style-basic.git (prerequisite)
#     `-- style-basic.git

# Prepare repositories used by tests if running in the local mode.
#
+if! $remote
{
  cp -r $src/extra   $out/extra
  cp -r $src/math    $out/math
  cp -r $src/stable  $out/stable
  cp -r $src/testing $out/testing

  c = [cmdline] $rep_create 2>!

  $c $out/extra   &$out/extra/packages.manifest   &$out/extra/signature.manifest
  $c $out/math    &$out/math/packages.manifest    &$out/math/signature.manifest
  $c $out/stable  &$out/stable/packages.manifest  &$out/stable/signature.manifest
  $c $out/testing &$out/testing/packages.manifest &$out/testing/signature.manifest

  # Create git repositories.
  #
  $git_extract $src/git/libbar.tar
  $git_extract $src/git/style-basic.tar &$out_git/state0/***
}

rep_add   += -d cfg 2>!
rep_fetch += -d cfg --auth all --trust-yes 2>!

: unexpected-arg
:
{
  $clone_cfg

  $* unexpected 2>>EOE != 0
    error: unexpected argument 'unexpected'
      info: run 'bpkg help rep-list' for more information
    EOE
}

: top-level
:
{
  $clone_cfg
  $rep_add $rep/stable && $rep_add $rep/testing && $rep_fetch

  $* >>"EOO"
    pkg:build2.org/rep-list/stable ($rep/stable)
    pkg:build2.org/rep-list/testing ($rep/testing)
    EOO
}

: prerequisites
:
: Note that here we also test that the prerequisites cycle is handled properly.
:
{
  $clone_cfg
  $rep_add $rep/stable && $rep_fetch

  $* --prerequisites >>"EOO"
    pkg:build2.org/rep-list/stable ($rep/stable)
      prerequisite pkg:build2.org/rep-list/math ($rep/math)
        prerequisite pkg:build2.org/rep-list/extra ($rep/extra)
          prerequisite pkg:build2.org/rep-list/stable ($rep/stable)
    EOO
}

: complements
:
{
  $clone_cfg
  $rep_add $rep/testing && $rep_fetch

  $* --complements >>"EOO"
    pkg:build2.org/rep-list/testing ($rep/testing)
      complement pkg:build2.org/rep-list/stable ($rep/stable)
    EOO
}

: all
:
{
  $clone_cfg
  $rep_add $rep/testing && $rep_fetch

  $* --prerequisites --complements >>"EOO"
    pkg:build2.org/rep-list/testing ($rep/testing)
      complement pkg:build2.org/rep-list/stable ($rep/stable)
        prerequisite pkg:build2.org/rep-list/math ($rep/math)
          prerequisite pkg:build2.org/rep-list/extra ($rep/extra)
            prerequisite pkg:build2.org/rep-list/stable ($rep/stable)
      prerequisite pkg:build2.org/rep-list/extra ($rep/extra)
        prerequisite pkg:build2.org/rep-list/stable ($rep/stable)
          prerequisite pkg:build2.org/rep-list/math ($rep/math)
            prerequisite pkg:build2.org/rep-list/extra ($rep/extra)
    EOO
}

: git-rep
:
if! $git_supported
{{
  # Skip git repository tests.
  #
}}
else
{{
  rep = "$rep_git/state0"
  test.cleanups += &cfg/.bpkg/repos/*/***

  : root-complement
  :
  : Test that the root repository complement is handled properly.
  :
  $clone_root_cfg;
  $rep_add "$rep/libbar.git#master" && $rep_fetch;

  $* --complements --prerequisites >>~%EOO%
    %git:.+libbar#master .+libbar\.git#master%
    %  prerequisite git:.+style-basic#stable .+style-basic\.git#stable \(heads/master\)%
    EOO
}}
