package Alien::Build::Plugin::Probe::OverrideCI;

use strict;
use warnings;
use Alien::Build::Plugin;
use Path::Tiny qw( path );
use File::chdir;

# ABSTRACT: Override logic for continuous integration
our $VERSION = '0.03'; # VERSION


sub init
{
  my($self, $meta) = @_;
  
  my $ci_build_root;

  if(defined $ENV{TRAVIS} && $ENV{TRAVIS} eq 'true' && defined $ENV{TRAVIS_BUILD_DIR})
  {
    $ci_build_root = path($ENV{TRAVIS_BUILD_DIR})->realpath;
  }
  elsif(defined $ENV{APPVEYOR} && $ENV{APPVEYOR} eq 'True' && $ENV{APPVEYOR_BUILD_FOLDER})
  {
    $ci_build_root = path($ENV{APPVEYOR_BUILD_FOLDER})->realpath;
  }
  elsif(defined $ENV{GITHUB_ACTIONS} && $ENV{GITHUB_ACTIONS} eq 'true' && $ENV{GITHUB_WORKSPACE})
  {
    $ci_build_root = path($ENV{GITHUB_WORKSPACE})->realpath;
  }
  else
  {
    # are you sure you are running under CI?
    die "unable to detect the type of CI";
  }

  my $override =
    $ci_build_root->subsumes(path($CWD)->realpath)
      ? $ENV{ALIEN_INSTALL_TYPE_CI} || ''
      : $ENV{ALIEN_INSTALL_TYPE}    || '';

  #Alien::Build->log("override = $override");
  
  $meta->register_hook(
    override => sub {
      $override;
    },
  );
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Alien::Build::Plugin::Probe::OverrideCI - Override logic for continuous integration

=head1 VERSION

version 0.03

=head1 SYNOPSIS

In your .travis.yml:

 language: perl
 
 install:
   - cpanm -n Alien::Build::Plugin::Probe::OverrideCI
   - cpanm -n --installdeps .
 
 env:
   global:
     - ALIEN_BUILD_PRELOAD=Probe::OverrideCI
   matrix:
     - ALIEN_INSTALL_TYPE_CI=share
     - ALIEN_INSTALL_TYPE_CI=system

In your appveyor.yml

 install:
   - ... # however you install/select which Perl to use
   - cpanm -n Alien::Build::Plugin::Probe::OverrideCI
   - cpanm -n --installdeps .
 
 environment:
   ALIEN_BUILD_PRELOAD: Probe::OverrideCI
   matrix:
     - ALIEN_INSTALL_TYPE_CI: share
       ALIEN_INSTALL_TYPE_CI: system

In your .github/workflows/main.yml

  jobs:
    perl:
      env:
        ALIEN_BUILD_PRELOAD: Probe::OverrideCI
      strategy:
        matrix:
          install_type:
            - share
            - system
          perl-version:
            - '5.30'
            - '5.16'
      steps:
        - uses: actions/checkout@v2
        - name: Install CI Dependencies
          run: cpanm -n -q Alien::Build::Plugin::Probe::OverrideCI
        - name: Install Project Dependencies
          run: cpanm -n -q --installdeps .
        - name: Configure Project
          run: perl Makefile.PL
          env:
            ALIEN_INSTALL_TYPE_CI: ${{ matrix.install_type }}

=head1 DESCRIPTION

This plugin provides an easy way to test both share and system installs using a
travis or appveyor environment matrix, without affecting the install type detection
of prereqs.  Thus if your library C<Alien::libfoo> depends on L<Alien::gmake> you
can test both a system and share install for C<Alien::libfoo> while building 
L<Alien::gmake> using the default (usually system) install and saving build time.

It does this using the appropriate environment variables from the CI tool to determine
if the L<alienfile> is in the build root.  If you are in the build root, then we use
the environment variable C<ALIEN_INSTALL_TYPE_CI>, if we are not in the build root,
then we fallback on the existing behavior (either C<ALIEN_INSTALL_TYPE>, or the default
for the L<alienfile> itself).

If you want to override the install type on a per-alien basis in a development or
production environment (not CI), then L<Alien::Build::Plugin::Probe::Override> may
be useful for you.

=head1 SEE ALSO

=over 4

=item L<alienfile>

=item L<Alien::Build>

=item L<Alien::Build::Plugin::Probe::Override>

=back

=head1 AUTHOR

Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>

Contributors:

Roy Storey (KIWIROY)

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by Graham Ollis.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut