Files
faveo/vendor/gitonomy/gitlib/src/Gitonomy/Git/PushReference.php
2019-04-19 14:37:37 +05:30

170 lines
3.1 KiB
PHP

<?php
/**
* This file is part of Gitonomy.
*
* (c) Alexandre Salomé <alexandre.salome@gmail.com>
* (c) Julien DIDIER <genzo.wm@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Gitonomy\Git;
use Gitonomy\Git\Exception\LogicException;
/**
* Push reference contains a commit interval. This object aggregates methods
* for this interval.
*
* @author Julien DIDIER <genzo.wm@gmail.com>
*/
class PushReference
{
const ZERO = '0000000000000000000000000000000000000000';
/**
* @var string
*/
protected $reference;
/**
* @var string
*/
protected $before;
/**
* @var string
*/
protected $after;
/**
* @var bool
*/
protected $isForce;
public function __construct(Repository $repository, $reference, $before, $after)
{
$this->repository = $repository;
$this->reference = $reference;
$this->before = $before;
$this->after = $after;
$this->isForce = $this->getForce();
}
/**
* @return Repository
*/
public function getRepository()
{
return $this->repository;
}
/**
* @return string
*/
public function getReference()
{
return $this->reference;
}
/**
* @return string
*/
public function getBefore()
{
return $this->before;
}
/**
* @return string
*/
public function getAfter()
{
return $this->after;
}
/**
* @return array
*/
public function getLog($excludes = array())
{
return $this->repository->getLog(array_merge(
array($this->getRevision()),
array_map(function ($e) {
return '^'.$e;
}, $excludes)
));
}
public function getRevision()
{
if ($this->isDelete()) {
throw new LogicException('No revision for deletion');
}
if ($this->isCreate()) {
return $this->getAfter();
}
return $this->getBefore().'..'.$this->getAfter();
}
/**
* @return bool
*/
public function isCreate()
{
return $this->isZero($this->before);
}
/**
* @return bool
*/
public function isDelete()
{
return $this->isZero($this->after);
}
/**
* @return bool
*/
public function isForce()
{
return $this->isForce;
}
/**
* @return bool
*/
public function isFastForward()
{
return !$this->isDelete() && !$this->isCreate() && !$this->isForce();
}
/**
* @return bool
*/
protected function isZero($reference)
{
return self::ZERO === $reference;
}
/**
* @return bool
*/
protected function getForce()
{
if ($this->isDelete() || $this->isCreate()) {
return false;
}
$result = $this->repository->run('merge-base', array(
$this->before,
$this->after,
));
return $this->before !== trim($result);
}
}