# 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
# |
# |-- t15 (see pkg-build for details)
# |
# `-- 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 \
                   &$out/testing/signature.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 the compatibility repository.
  #
  cp -r $src/t15 $out/compatibility
  $rc $out/compatibility --ignore-unknown &$out/compatibility/packages.manifest \
                                          &$out/compatibility/signature.manifest

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

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" 2>!
    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" 2>!
    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)" 2>!

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

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

    foo/1
    EOO

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

    : basic
    :
    $* $rep/testing >>EOO 2>!
      : 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
      :
      {
        # Note that on Windows we still use tar rather than bsdtar here, since
        # the later fails for dangling symlinks and we have such symlinks in
        # this repository archive.
        #
        tar ($posix ? : --force-local) -xf $src/git/libbar.tar &state0/***

        $* --type dir "state0/libbar.git" >>~%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

          \
          %.+
          EOO

        rm state0/libbar.git/libbar/README

        $* --type dir "state0/libbar.git" 2>>/~%EOE% != 0
          %fetching .+libbar.git%
          %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 2>! &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" 2>!
    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 2>!
    : 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 2>! &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"        2>! : fingerprint
  $* --cert-name         >'name:build2.org' 2>! : name
  $* --cert-organization >'Code Synthesis'  2>! : organization
  $* --cert-email        >'info@build2.org' 2>! : 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
:
{{
  +export BPKG_FETCH_CACHE=0

  : 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" 2>!
      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" 2>!
      pkg:build2.org/rep-info/testing ($rep/testing)
      EOO
  }
}}

: compatibility
:
{{
  : packages
  :
  {
    $* --packages $rep/compatibility >>EOO 2>!

      libbar/1.0.0
      libbaz/1.0.0
      libbiz/1.0.0
      libfoo/1.0.0
      EOO
  }

  : package-manifests-ignore-toolchain
  :
  {
    $* --packages --manifest --ignore-unknown $rep/compatibility >>~%EOO% 2>!
      : 1
      name: libbar
      version: 1.0.0
      %.+
      depends: * build2 >= 0.16.0
      depends: * bpkg >= 0.16.0
      %.+
      :
      name: libbaz
      version: 1.0.0
      summary: libbaz
      %.+
      depends: * build2 >= 65536.0.0
      depends: * bpkg >= 65536.0.0
      %.+
      :
      name: libbiz
      version: 1.0.0
      summary: libbiz
      %.+
      :
      name: libfoo
      version: 1.0.0
      summary: libfoo
      %.+
      EOO
  }

  : package-manifests-fail
  :
  {
    $* --packages --manifest $rep/compatibility 2>>~%EOE% != 0
      %.*
      error: unable to satisfy constraint (build2 >= 65536.0.0) for package libbaz
      %  info: available build2 version is .+%
      EOE
  }
}}
