2016-11-19 15:13:32 +07:00
< ? php
/* ( c ) Anton Medvedev < anton @ medv . io >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Deployer ;
2017-05-15 17:29:58 +02:00
use Deployer\Exception\RuntimeException ;
2017-08-12 11:56:35 +03:00
/**
* Get current git HEAD branch as default brunch to deploy .
*/
set ( 'branch' , function () {
try {
2017-08-12 18:06:21 +03:00
$branch = runLocally ( 'git rev-parse --abbrev-ref HEAD' );
2017-08-12 11:56:35 +03:00
} catch ( \Throwable $exception ) {
$branch = null ;
}
2017-08-12 16:52:29 +03:00
if ( $branch === 'HEAD' ) {
$branch = null ; // Travis-CI fix
}
2017-08-12 16:43:25 +03:00
2017-08-12 11:56:35 +03:00
if ( input () -> hasOption ( 'branch' ) && ! empty ( input () -> getOption ( 'branch' ))) {
$branch = input () -> getOption ( 'branch' );
}
return $branch ;
});
/**
* Whether to use git cache .
*
* Faster cloning by borrowing objects from existing clones .
*/
set ( 'git_cache' , function () {
$gitVersion = run ( '{{bin/git}} version' );
$regs = [];
if ( preg_match ( '/((\d+\.?)+)/' , $gitVersion , $regs )) {
$version = $regs [ 1 ];
} else {
$version = " 1.0.0 " ;
}
return version_compare ( $version , '2.3' , '>=' );
});
2016-11-19 15:13:32 +07:00
desc ( 'Update code' );
task ( 'deploy:update_code' , function () {
$repository = trim ( get ( 'repository' ));
$branch = get ( 'branch' );
$git = get ( 'bin/git' );
$gitCache = get ( 'git_cache' );
2017-08-10 10:22:57 +02:00
$recursive = get ( 'git_recursive' , true ) ? '--recursive' : '' ;
2016-11-19 15:13:32 +07:00
$depth = $gitCache ? '' : '--depth 1' ;
2017-03-12 23:04:48 +07:00
$options = [
'tty' => get ( 'git_tty' , false ),
];
2016-11-19 15:13:32 +07:00
$at = '' ;
if ( ! empty ( $branch )) {
$at = " -b $branch " ;
}
// If option `tag` is set
if ( input () -> hasOption ( 'tag' )) {
$tag = input () -> getOption ( 'tag' );
if ( ! empty ( $tag )) {
$at = " -b $tag " ;
}
}
// If option `tag` is not set and option `revision` is set
if ( empty ( $tag ) && input () -> hasOption ( 'revision' )) {
$revision = input () -> getOption ( 'revision' );
if ( ! empty ( $revision )) {
$depth = '' ;
}
}
2017-04-08 21:06:15 +07:00
if ( $gitCache && has ( 'previous_release' )) {
2016-11-19 15:13:32 +07:00
try {
2017-08-10 10:22:57 +02:00
run ( " $git clone $at $recursive -q --reference { { previous_release}} --dissociate $repository { { release_path}} 2>&1 " , $options );
2017-05-15 17:29:58 +02:00
} catch ( RuntimeException $exc ) {
2016-11-19 15:13:32 +07:00
// If {{deploy_path}}/releases/{$releases[1]} has a failed git clone, is empty, shallow etc, git would throw error and give up. So we're forcing it to act without reference in this situation
2017-08-10 10:22:57 +02:00
run ( " $git clone $at $recursive -q $repository { { release_path}} 2>&1 " , $options );
2016-11-19 15:13:32 +07:00
}
} else {
// if we're using git cache this would be identical to above code in catch - full clone. If not, it would create shallow clone.
2017-08-10 10:22:57 +02:00
run ( " $git clone $at $depth $recursive -q $repository { { release_path}} 2>&1 " , $options );
2016-11-19 15:13:32 +07:00
}
if ( ! empty ( $revision )) {
run ( " cd { { release_path}} && $git checkout $revision " );
}
});