# file      : tests/pkg-checkout.testscript
# license   : MIT; see accompanying LICENSE file

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

# Source repository:
#
# pkg-checkout
# `-- git
#     |-- libbar.git      -> style-basic.git (prerequisite)
#     `-- style-basic.git

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

# Prepare repositories used by tests if running in the local mode.
#
+if! $remote
  # Create git repositories.
  #
  $git_extract $src/git/libbar.tar
  $git_extract $src/git/style-basic0.tar &$out_git/state0/***

  if $posix
    $git_extract $src/git/style.tar
    $git_extract $src/git/links.tar
  end
end

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

  rep_add       += -d cfg 2>!
  rep_fetch     += -d cfg 2>!
  pkg_configure += -d cfg 2>!
  pkg_disfigure += -d cfg 2>!
  pkg_purge     += -d cfg 2>!
  pkg_status    += -d cfg

  test.cleanups += &?cfg/.bpkg/repos/*/***

  : unconfigured-dependency
  :
  {
    $clone_root_cfg;
    $rep_add "$rep/libbar.git#master";
    $rep_fetch;

    $* libmbar/1.0.0 2>>~%EOE%;
      checking out libmbar/1.0.0
      %.+
      distributing libmbar/1.0.0
      checked out libmbar/1.0.0
      EOE

    $pkg_purge libmbar
  }

  : configured-dependency
  :
  {
    $clone_root_cfg;
    $rep_add "$rep/libbar.git#master" && $rep_add "$rep/style-basic.git#master";
    $rep_fetch;

    $pkg_status style-basic | sed -n -e 's/style-basic available \[.+\] ([^ ]+)/\1/p' | set v;

    $* "style-basic/$v" 2>>~"%EOE%";
      verifying symlinks...
      %fixing up symlinks...%?
      distributing style-basic/$v
      checked out style-basic/$v
      EOE

    $pkg_configure style-basic;

    $* libmbar/1.0.0 2>>~%EOE%;
      checking out libmbar/1.0.0
      %.+
      distributing libmbar/1.0.0
      checked out libmbar/1.0.0
      EOE

    $pkg_disfigure style-basic;

    $pkg_purge libmbar;
    $pkg_purge style-basic
  }

  : replacement
  :
  {
    $clone_root_cfg;
    $rep_add "$rep/style-basic.git#master,stable";
    $rep_fetch;

    $pkg_status style-basic | \
      sed -n -e 's/style-basic available ([^ ]+) +([^ ]+)/\1 \2/p' | set vs;

    echo "$vs" | sed -e 's/([^ ]+).+/\1/'        | set v0;
    echo "$vs" | sed -e 's/([^ ]+) +([^ ]+)/\2/' | set v1;

    $* "style-basic/$v0" 2>!;
    $pkg_status style-basic >~"/style-basic unpacked $v0/";

    $* --replace "style-basic/$v1" 2>!;
    $pkg_status style-basic >~"/style-basic unpacked $v1 .+/";

    $pkg_purge style-basic
  }

  : links
  :
  if ($remote || $posix)
  {
    $clone_root_cfg;

    $rep_fetch "$rep/links.git#v1.0.0-alpha";

    $pkg_status links | sed -n -e 's/links available (.+)/\1/p' | set v;

    $* "links/$v" 2>>~%EOE%;
      %.*
      %checking out links/1.0.0-a.0.[^.]+.[^.]+%d
      %.*
      %distributing links/1.0.0-a.0.[^.]+.[^.]+%d
      %checked out links/1.0.0-a.0.[^.]+.[^.]+%d
      EOE

    d = "cfg/links-$v";

    # See common/git/init script for the symlinks descriptions.
    #
    test -d $d/bs;
    test -d $d/ts;

    cat $d/pg          >'h1 {font-size: 3em;}';
    cat $d/bs/page.css >'h1 {font-size: 3em;}';
    cat $d/bf          >'./: file{manifest}';
    cat $d/td          >'@@';
    cat $d/tl          >'@@';
    cat $d/ts/TODO     >'@@';

    $pkg_purge links;
    $rep_fetch "$rep/links.git#v0.0.1";

    $* links/0.0.1 2>>~%EOE%;
      checking out links/0.0.1
      verifying symlinks...
      %fixing up symlinks...%?
      distributing links/0.0.1
      checked out links/0.0.1
      EOE

    d = cfg/links-0.0.1;

    test -d $d/bs == 1;
    test -d $d/ts == 1;
    test -f $d/pg == 1;
    test -f $d/bf == 1;
    test -f $d/td == 1;
    test -f $d/tl == 1;

    $pkg_purge links;

    # Dangling symlink in the repository.
    #
    $rep_fetch "$rep/links.git#v1.0.1";

    # Note that on POSIX the repository is restored in its permanent location,
    # since the operation fails in the distribution phase. This is in contrast
    # to Windows where the repository is lost, since the operation fails in
    # the fix-up phase.
    #
    if $posix
      $* links/1.0.1 2>>~%EOE% != 0
        checking out links/1.0.1
        verifying symlinks...
        %fixing up symlinks...%?
        distributing links/1.0.1
        %warning: skipping dangling symlink .+%
        %error: unable to stat .+%
        EOE
    else
      $* links/1.0.1 2>>~%EOE% != 0
        checking out links/1.0.1
        error: target 'bl' for symlink 'lc' does not exist
          info: re-run with -v for more information
        warning: repository state is now broken
          info: run 'bpkg rep-fetch' to repair
        EOE
    end;

    # Cyclic symlinks in the repository.
    #
    $rep_fetch "$rep/links.git#v1.0.2";

    if $posix
      $* links/1.0.2 2>>~%EOE% != 0
        %.*
        %error: unable to iterate over .+%
        EOE
    else
      $* links/1.0.2 2>>~%EOE% != 0
        checking out links/1.0.2
        %.*
        %error: target '..' for symlink '..' does not exist%
          info: re-run with -v for more information
        warning: repository state is now broken
          info: run 'bpkg rep-fetch' to repair
        EOE
    end
  }

  : output-root
  :
  {
    : no-purge
    :
    {
      $clone_root_cfg;
      $rep_add "$rep/libbar.git#master";
      $rep_fetch;

      $* --output-root $~ libmbar/1.0.0 &libmbar-1.0.0/*** 2>>~%EOE%;
        checking out libmbar/1.0.0
        %.+
        distributing libmbar/1.0.0
        checked out libmbar/1.0.0
        EOE

      test -f libmbar-1.0.0/manifest;

      # While at it, test that the package is buildable.
      #
      $pkg_build libmbar -d cfg/ --yes 2>!;
      $pkg_drop  libmbar -d cfg/ --yes 2>!
    }

    : purge
    :
    {
      $clone_root_cfg;
      $rep_add "$rep/libbar.git#master";
      $rep_fetch;

      $* --output-root $~ libmbar/1.0.0 --output-purge 2>>~%EOE%;
        checking out libmbar/1.0.0
        %.+
        distributing libmbar/1.0.0
        checked out libmbar/1.0.0
        EOE

      test -f libmbar-1.0.0/manifest;

      $pkg_purge libmbar
    }
  }
}
