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

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

# Source repository:
#
# rep-info
# |-- testing             -> stable (complement), ../foo/testing (prerequisite)
# |   |-- foo-1.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
  rc = [cmdline] $rep_create 2>!

  # Create the unsigned 'testing' repository.
  #
  cp -r $src/testing $out/testing
  $rc $out/testing &$out/testing/packages.manifest

  # Create the signed 'testing' repository.
  #
  cp -r $src/testing $out/signed
  cat <<<$cert_manifest >+$out/signed/repositories.manifest

  $rc --key $key $out/signed &$out/signed/packages.manifest \
                             &$out/signed/signature.manifest

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

test.options += --auth all --trust-yes

posix = ($cxx.target.class != 'windows')

: no-location
:
$* 2>>EOE != 0
  error: repository location argument expected
    info: run 'bpkg help rep-info' for more information
  EOE

: default
:
{
  : unsigned
  :
  $* $rep/testing >>"EOO"
    pkg:build2.org/rep-info/testing ($rep/testing)
    prerequisite pkg:build2.org/foo/testing ($rep_root/foo/testing)
    complement pkg:build2.org/rep-info/stable ($rep/stable)

    foo/1
    EOO

  : signed
  :
  $* $rep/signed >>"EOO"
    pkg:build2.org/rep-info/signed ($rep/signed)
    CN=build2.org/O=Code Synthesis/info@build2.org
    $cert_fp
    prerequisite pkg:build2.org/foo/testing ($rep_root/foo/testing)
    complement pkg:build2.org/rep-info/stable ($rep/stable)

    foo/1
    EOO
}

: name
:
$* --name $rep/testing >"pkg:build2.org/rep-info/testing ($rep/testing)"

: packages
:
{
  test.arguments += --packages # Should go after the rep-info command argument.

  : list
  :
    $* $rep/testing >>EOO

    foo/1
    EOO

  : manifest
  :
  {
    test.arguments += --manifest

    : basic
    :
    $* $rep/testing >>EOO
      : 1
      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

    : deep
    :
    {
      test.arguments += --deep

      : dir
      :
      {
        tar ($posix ? : --force-local) -xf $src/git/libbar.tar &state0/***;

        $* --type dir "state0/libbar.git" >>~%EOO%d;
          : 1
          name: libbar
          version: 1.0.0+1
          summary: libbar
          license: MIT
          description:\
          TODO

          \
          description-type: text/plain
          %.+
          bootstrap-build:\
          project = libbar

          using config
          using version
          using dist

          \
          %.+
          EOO

        rm state0/libbar.git/libbar/README;

        $* --type dir "state0/libbar.git" 2>>/~%EOE% != 0
          %error: unable to read from libbar/README referenced by description-file manifest value in libbar/manifest: .+%
          %  info: repository .+%
          EOE
      }

      : git
      :
      : Enable on Windows if/when we make *-file values expansion to properly
      : work for symlinks on Windows (see rep_fetch_git() for details).
      :
      if ($git_supported && $posix)
      {
        $* "$rep_git/state0/libbar.git#master" >>~%EOO%d 2>!
          : 1
          name: libbar
          version: 1.0.0+1
          summary: libbar
          license: MIT
          description:\
          TODO

          \
          description-type: text/plain
          %.+
          bootstrap-build:\
          project = libbar

          using config
          using version
          using dist

          \
          %.+
          :
          name: libmbar
          version: 1.0.0
          summary: libmbar
          license: MIT
          description:\
          TODO

          \
          description-type: text/plain
          %.+
          bootstrap-build:\
          project = libmbar

          using config
          using version
          using dist

          \
          %.+
          EOO
      }
    }
  }

  : to-file
  :
  {
    : no-manifest
    :
    $* --packages-file m $rep/testing 2>>EOE != 0
      error: --packages-file specified without --manifest
        info: run 'bpkg help rep-info' for more information
      EOE

    : manifest
    :
    {
      $* --manifest --packages-file m $rep/testing &m;

      cat m >>EOO
        : 1
        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
    }
  }
}

: repositories
:
{
  # Should go after the rep-info command argument.
  #
  test.arguments += --repositories

  : list
  :
  $* $rep/testing >>"EOO"
    prerequisite pkg:build2.org/foo/testing ($rep_root/foo/testing)
    complement pkg:build2.org/rep-info/stable ($rep/stable)
    EOO

  : manifest
  :
  $* --manifest $rep/testing >>EOO
    : 1
    location: ../../foo/testing
    type: pkg
    role: prerequisite
    :
    location: ../stable
    type: pkg
    role: complement
    :
    EOO

  : to-file
  :
  {
    : no-manifest
    :
    $* --repositories-file m $rep/testing 2>>EOE != 0
      error: --repositories-file specified without --manifest
        info: run 'bpkg help rep-info' for more information
      EOE

    : manifest
    :
    {
      $* --manifest --repositories-file m $rep/testing &m;

      cat m >>EOO
        : 1
        location: ../../foo/testing
        type: pkg
        role: prerequisite
        :
        location: ../stable
        type: pkg
        role: complement
        :
        EOO
    }
  }
}

: cert
:
{
  test.arguments += $rep/signed

  $* --cert-fingerprint  >"$cert_fp"        : fingerprint
  $* --cert-name         >'name:build2.org' : name
  $* --cert-organization >'Code Synthesis'  : organization
  $* --cert-email        >'info@build2.org' : email
}

: git-rep
:
if! $git_supported
{
  # Skip git repository tests.
  #
}
else
{
  rep = "$rep_git/state0"
  test.redirects += 2>!

  : version-module
  :
  : Version module is enabled for the project.
  :
  $* "$rep/style-basic.git#master" >>~%EOO%
    %git:.+style-basic#master .+style-basic.git#master%

    %style-basic/1\.1\.0-a\.0\.\d+\..+%
    EOO

  : manifest-lists
  :
  : The packages.manifest and repositories.manifest files are present in the
  : repository root.
  :
  $* "$rep/libbar.git#master" >>~%EOO%
    %git:.+libbar#master .+libbar.git#master%
    %prerequisite git:.+style-basic#stable .+style-basic.git#stable%

    libbar/1.0.0+1
    libmbar/1.0.0
    EOO

  : repository-manifests
  :
  : Here we test that the base repository manifest that comes from the stable
  : branch is printed because the stable head commit is newer that of the
  : master branch.
  :
  $* -r --manifest "$rep/style-basic.git#stable,master" >>~%EOO%
    : 1
    email: user@example.com
    EOO

  : complete-dependency
  :
  $* -p --manifest "$rep/libbar.git#master" >>~%EOO%d
    : 1
    name: libbar
    version: 1.0.0+1
    summary: libbar
    license: MIT
    description-file: README
    url: http://example.org/libbar
    email: pkg@example.org
    depends: style-basic >= 1.0.0
    location: libbar
    %fragment: \.+%
    :
    name: libmbar
    version: 1.0.0
    summary: libmbar
    license: MIT
    description-file: README
    url: http://example.org/libmbar
    email: pkg@example.org
    depends: style-basic >= 1.0.0
    location: libmbar
    %fragment: \.+%
    EOO
}

: default-options-files
:
{
  : specified-dir
  :
  {
    $cfg_create -d cfg 2>! &cfg/***;

    mkdir cfg/.build2;

    echo '--directory .' >= cfg/.build2/bpkg-rep-info.options;

    $* $rep/testing -d cfg 2>>/~%EOE%d != 0;
      %\.+/specified-dir/cfg/.build2/bpkg-rep-info.options: error: --directory\|-d in default options file%
      EOE

    # Disable default options files loading.
    #
    $* --no-default-options --name $rep/testing -d cfg >>"EOO"
      pkg:build2.org/rep-info/testing ($rep/testing)
      EOO
  }

  : current-dir
  :
  {
    mkdir .bpkg;   # Pretend we are in the configuration directory.
    mkdir .build2;

    echo '--directory .' >= .build2/bpkg-rep-info.options;

    # Load options from the current (configuration) directory.
    #
    $* $rep/testing 2>>/~%EOE%d != 0;
      %\.+/current-dir/.build2/bpkg-rep-info.options: error: --directory\|-d in default options file%
      EOE

    # Disable loading options from the current (configuration) directory.
    #
    $* --name  -d '' $rep/testing >>"EOO"
      pkg:build2.org/rep-info/testing ($rep/testing)
      EOO
  }
}
