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

.include common.testscript auth.testscript

# Source repository:
#
# rep-create
# |-- stable
# |   |-- foo-1.tar.gz
# |   `-- repositories.manifest
# `-- testing          -> stable (complement)
#     |-- foo-2.tar.gz (manifest with unknown name)
#     `-- repositories.manifest

: unsigned
:
{
  # Make sure the cloned repository has a valid location, so we can use
  # rep-info command to validate the repository info.
  #
  clone_rep = [cmdline] mkdir 1/ && cp -r $src/stable 1/

  : without-key
  :
  {
    $clone_rep;

    $* 1/stable/ 2>>/~%EOE% &1/stable/packages.manifest;
      added bar 1
      added foo 1
      %2 package\(s\) in .+/stable/%
      EOE

    $rep_info -p --manifest 1/stable/ >>EOO
      : 1
      name: bar
      version: 1
      summary: The "Bar" utility
      license: MIT
      url: http://www.example.org/bar
      email: bar-users@example.org
      depends: foo == 1
      bootstrap-build:\
      project = bar

      \
      location: bar-1.tar.gz
      sha256sum: 56528e387d1b8e18e3ee7e8510916afdb65f881acfd49d959fae6f434c3bab3c
      :
      name: foo
      version: 1
      summary: The "Foo" utility
      license: MIT
      url: http://www.example.org/foo
      email: foo-users@example.org
      bootstrap-build:\
      project = foo

      \
      location: foo-1.tar.gz
      sha256sum: 1d88df336611286cdbd84f5c1d87bedc774bc833e200de675e34d9b219c66cfc
      EOO
  }

  : with-key
  :
  {
    $clone_rep;

    $* --key $key 1/stable/ 2>>/~%EOE% &1/stable/packages.manifest;
      added bar 1
      added foo 1
      warning: --key option ignored
        info: repository manifest contains no certificate
        info: run 'bpkg help rep-create' for more information
      %2 package\(s\) in .+/stable/%
      EOE

    $rep_info -p --manifest 1/stable/ >>EOO
      : 1
      name: bar
      version: 1
      summary: The "Bar" utility
      license: MIT
      url: http://www.example.org/bar
      email: bar-users@example.org
      depends: foo == 1
      bootstrap-build:\
      project = bar

      \
      location: bar-1.tar.gz
      sha256sum: 56528e387d1b8e18e3ee7e8510916afdb65f881acfd49d959fae6f434c3bab3c
      :
      name: foo
      version: 1
      summary: The "Foo" utility
      license: MIT
      url: http://www.example.org/foo
      email: foo-users@example.org
      bootstrap-build:\
      project = foo

      \
      location: foo-1.tar.gz
      sha256sum: 1d88df336611286cdbd84f5c1d87bedc774bc833e200de675e34d9b219c66cfc
      EOO
  }
}

: signed
:
: Here we sign the 'stable' repository with the certificate prior to running
: tests.
:
{
  +cp -r $src/stable ./ && cat <<<$cert_manifest >+stable/repositories.manifest

  # Make sure the cloned repository has a valid location, so we can use
  # rep-info command to validate the repository info.
  #
  clone_rep = [cmdline] mkdir 1/ && cp -r ../stable 1/

  : with-key
  :
  : Note that as we re-create the repositories.manifest file on the fly (see
  : above) its sha256sum can vary due to CRs mix-in on Windows. That explains
  : why we do not match it exactly.
  :
  {
    $clone_rep;

    $* --key $key 1/stable/ 2>>/~%EOE% &1/stable/packages.manifest \
                                       &1/stable/signature.manifest;
      added bar 1
      added foo 1
      %2 package\(s\) in .+/stable/%
      EOE

    $rep_info --cert-fingerprint -p --manifest 1/stable/ >>~"%EOO%"
      $cert_fp
      : 1
      name: bar
      version: 1
      summary: The "Bar" utility
      license: MIT
      url: http://www.example.org/bar
      email: bar-users@example.org
      depends: foo == 1
      bootstrap-build:\\
      project = bar

      \\
      location: bar-1.tar.gz
      sha256sum: 56528e387d1b8e18e3ee7e8510916afdb65f881acfd49d959fae6f434c3bab3c
      :
      name: foo
      version: 1
      summary: The "Foo" utility
      license: MIT
      url: http://www.example.org/foo
      email: foo-users@example.org
      bootstrap-build:\\
      project = foo

      \\
      location: foo-1.tar.gz
      sha256sum: 1d88df336611286cdbd84f5c1d87bedc774bc833e200de675e34d9b219c66cfc
      EOO
  }

  : remote-key-option-failure
  :
  : Test that bpkg-rep-create fails for the remote --key option.
  :
  {
    $clone_rep;

    touch .git; # Pretend we are in the git repository.

    mkdir .build2;
    echo "--key $key" >=.build2/bpkg-rep-create.options;

    $* 1/stable/ 2>>/~%EOE% != 0
      %.+/bpkg-rep-create.options: error: --key <name> in remote default options file%
      EOE
  }

  : without-key
  :
  $clone_rep;
  $* 1/stable/ 2>>EOE &1/stable/packages.manifest != 0
    added bar 1
    added foo 1
    error: --key option required
      info: repository manifest contains a certificate
      info: run 'bpkg help rep-create' for more information
    EOE
}

: unknown-name
:
: Test that package manifest that contains an unknown name is properly handled.
:
{
  clone_rep = [cmdline] cp -r $src/testing ./

  : fail
  :
  $clone_rep;
  $* testing/ 2>>/EOE != 0
    foo-2/manifest:8:1: error: unknown name 'color' in package manifest
      info: package archive testing/foo-2.tar.gz
    EOE

  : ignore
  :
  $clone_rep;
  $* --ignore-unknown testing/ 2>>/~%EOE% &testing/packages.manifest
    added foo 2
    %1 package\(s\) in .+/testing/%
    EOE
}

: broken-repo
:
: Here we break the 'stable' repository prior to running a test.
:
{
  clone_rep = [cmdline] cp -r $src/stable ./

  : no-repositories-manifest
  :
  {
    $clone_rep &!stable/repositories.manifest;
    rm stable/repositories.manifest;

    $* stable/ 2>/'error: file stable/repositories.manifest does not exist' != 0
  }

  : unexpected-file
  :
  {
    $clone_rep;
    touch stable/foo;

    $* stable/ 2>>/EOE != 0
      error: unknown compression method in stable/foo
      EOE
  }
}
