magallanes/Mage/Task/BuiltIn/Deployment/Strategy/GitRebaseTask.php
2015-04-12 16:15:46 -03:00

99 lines
3.1 KiB
PHP

<?php
/*
* This file is part of the Magallanes package.
*
* (c) Andrés Montañez <andres@andresmontanez.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Mage\Task\BuiltIn\Deployment\Strategy;
use Mage\Task\Releases\IsReleaseAware;
/**
* Task for using Git Working Copy as the Deployed Code
*
* @author Oscar Reales <oreales@gmail.com>
*/
class GitRebaseTask extends BaseStrategyTaskAbstract implements IsReleaseAware
{
/**
* (non-PHPdoc)
* @see \Mage\Task\AbstractTask::getName()
*/
public function getName()
{
return 'Deploy via Git Rebase [built-in]';
}
/**
* Rebases the Git Working Copy as the Deployed Code
* @see \Mage\Task\AbstractTask::run()
*/
public function run()
{
$this->checkOverrideRelease();
if ($this->getConfig()->release('enabled', false) === true) {
$releasesDirectory = $this->getConfig()->release('directory', 'releases');
$deployToDirectory = rtrim($this->getConfig()->deployment('to'), '/')
. '/' . $releasesDirectory
. '/' . $this->getConfig()->getReleaseId();
$this->runCommandRemote('mkdir -p ' . $deployToDirectory);
}
$branch = $this->getParameter('branch', 'master');
$remote = $this->getParameter('remote', 'origin');
// Fetch Remote
$command = $this->getReleasesAwareCommand('git fetch ' . $remote);
$result = $this->runCommandRemote($command);
if ($result === false) {
$repository = $this->getConfig()->deployment('repository');
if ($repository) {
$command = $this->getReleasesAwareCommand('git clone ' . $repository . ' .');
$result = $this->runCommandRemote($command);
$command = $this->getReleasesAwareCommand('git fetch ' . $remote);
$result = $this->runCommandRemote($command);
}
}
// Checkout
$command = $this->getReleasesAwareCommand('git checkout ' . $branch);
$result = $this->runCommandRemote($command) && $result;
// Check Working Copy status
$stashed = false;
$status = '';
$command = $this->getReleasesAwareCommand('git checkout ' . $branch);
$result = $this->runCommandRemote($command) && $result;
// Stash if Working Copy is not clean
if (!$status) {
$stashResult = '';
$command = $this->getReleasesAwareCommand('git stash');
$result = $this->runCommandRemote($command, $stashResult) && $result;
if ($stashResult != "No local changes to save") {
$stashed = true;
}
}
// Rebase
$command = $this->getReleasesAwareCommand('git rebase ' . $remote . '/' . $branch);
$result = $this->runCommandRemote($command) && $result;
// If Stashed, restore.
if ($stashed) {
$command = $this->getReleasesAwareCommand('git stash pop');
$result = $this->runCommandRemote($command) && $result;
}
return $result;
}
}