308 lines
9.8 KiB
PHP
308 lines
9.8 KiB
PHP
<?php
|
|
|
|
namespace PHPGit;
|
|
|
|
use PHPGit\Command;
|
|
use PHPGit\Exception\GitException;
|
|
use Symfony\Component\Process\Process;
|
|
use Symfony\Component\Process\ProcessBuilder;
|
|
|
|
/**
|
|
* PHPGit - A Git wrapper for PHP5.3+
|
|
* ==================================
|
|
*
|
|
* [](https://packagist.org/packages/kzykhys/git)
|
|
* [](https://travis-ci.org/kzykhys/PHPGit)
|
|
* [](https://coveralls.io/r/kzykhys/PHPGit)
|
|
* [](https://insight.sensiolabs.com/projects/04f10b57-a113-47ad-8dda-9a6dacbb079f)
|
|
*
|
|
* Requirements
|
|
* ------------
|
|
*
|
|
* * PHP5.3
|
|
* * Git
|
|
*
|
|
* Installation
|
|
* ------------
|
|
*
|
|
* Update your composer.json and run `composer update`
|
|
*
|
|
* ``` json
|
|
* {
|
|
* "require": {
|
|
* "kzykhys/git": "dev-master"
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* Basic Usage
|
|
* -----------
|
|
*
|
|
* ``` php
|
|
* <?php
|
|
*
|
|
* require __DIR__ . '/vendor/autoload.php';
|
|
*
|
|
* $git = new PHPGit\Git();
|
|
* $git->clone('https://github.com/kzykhys/PHPGit.git', '/path/to/repo');
|
|
* $git->setRepository('/path/to/repo');
|
|
* $git->remote->add('production', 'git://example.com/your/repo.git');
|
|
* $git->add('README.md');
|
|
* $git->commit('Adds README.md');
|
|
* $git->checkout('release');
|
|
* $git->merge('master');
|
|
* $git->push();
|
|
* $git->push('production', 'release');
|
|
* $git->tag->create('v1.0.1', 'release');
|
|
*
|
|
* foreach ($git->tree('release') as $object) {
|
|
* if ($object['type'] == 'blob') {
|
|
* echo $git->show($object['file']);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @author Kazuyuki Hayashi <hayashi@valnur.net>
|
|
* @license MIT
|
|
*
|
|
* @method add($file, $options = array()) Add file contents to the index
|
|
* @method archive($file, $tree = null, $path = null, $options = array()) Create an archive of files from a named tree
|
|
* @method branch($options = array()) List both remote-tracking branches and local branches
|
|
* @method checkout($branch, $options = array()) Checkout a branch or paths to the working tree
|
|
* @method clone($repository, $path = null, $options = array()) Clone a repository into a new directory
|
|
* @method commit($message = '', $options = array()) Record changes to the repository
|
|
* @method config($options = array()) List all variables set in config file
|
|
* @method describe($committish = null, $options = array()) Returns the most recent tag that is reachable from a commit
|
|
* @method fetch($repository, $refspec = null, $options = array()) Fetches named heads or tags from one or more other repositories
|
|
* @method init($path, $options = array()) Create an empty git repository or reinitialize an existing one
|
|
* @method log($path = null, $options = array()) Returns the commit logs
|
|
* @method merge($commit, $message = null, $options = array()) Incorporates changes from the named commits into the current branch
|
|
* @method mv($source, $destination, $options = array()) Move or rename a file, a directory, or a symlink
|
|
* @method pull($repository = null, $refspec = null, $options = array()) Fetch from and merge with another repository or a local branch
|
|
* @method push($repository = null, $refspec = null, $options = array()) Update remote refs along with associated objects
|
|
* @method rebase($upstream = null, $branch = null, $options = array()) Forward-port local commits to the updated upstream head
|
|
* @method remote() Returns an array of existing remotes
|
|
* @method reset($commit = null, $paths = array()) Resets the index entries for all <paths> to their state at <commit>
|
|
* @method rm($file, $options = array()) Remove files from the working tree and from the index
|
|
* @method shortlog($commits = array()) Summarize 'git log' output
|
|
* @method show($object, $options = array()) Shows one or more objects (blobs, trees, tags and commits)
|
|
* @method stash() Save your local modifications to a new stash, and run git reset --hard to revert them
|
|
* @method status($options = array()) Show the working tree status
|
|
* @method tag() Returns an array of tags
|
|
* @method tree($branch = 'master', $path = '') List the contents of a tree object
|
|
*/
|
|
class Git
|
|
{
|
|
|
|
/** @var Command\AddCommand */
|
|
public $add;
|
|
|
|
/** @var Command\ArchiveCommand */
|
|
public $archive;
|
|
|
|
/** @var Command\BranchCommand */
|
|
public $branch;
|
|
|
|
/** @var Command\CatCommand */
|
|
public $cat;
|
|
|
|
/** @var Command\CheckoutCommand */
|
|
public $checkout;
|
|
|
|
/** @var Command\CloneCommand */
|
|
public $clone;
|
|
|
|
/** @var Command\CommitCommand */
|
|
public $commit;
|
|
|
|
/** @var Command\ConfigCommand */
|
|
public $config;
|
|
|
|
/** @var Command\DescribeCommand */
|
|
public $describe;
|
|
|
|
// Not implemented yet
|
|
public $diff;
|
|
|
|
/** @var Command\FetchCommand */
|
|
public $fetch;
|
|
|
|
/** @var Command\InitCommand */
|
|
public $init;
|
|
|
|
/** @var Command\LogCommand */
|
|
public $log;
|
|
|
|
/** @var Command\MergeCommand */
|
|
public $merge;
|
|
|
|
/** @var Command\MvCommand */
|
|
public $mv;
|
|
|
|
/** @var Command\PullCommand */
|
|
public $pull;
|
|
|
|
/** @var Command\PushCommand */
|
|
public $push;
|
|
|
|
/** @var Command\RebaseCommand */
|
|
public $rebase;
|
|
|
|
/** @var Command\RemoteCommand */
|
|
public $remote;
|
|
|
|
/** @var Command\ResetCommand */
|
|
public $reset;
|
|
|
|
/** @var Command\RmCommand */
|
|
public $rm;
|
|
|
|
/** @var Command\ShortlogCommand */
|
|
public $shortlog;
|
|
|
|
/** @var Command\ShowCommand */
|
|
public $show;
|
|
|
|
/** @var Command\StashCommand */
|
|
public $stash;
|
|
|
|
/** @var Command\StatusCommand */
|
|
public $status;
|
|
|
|
/** @var Command\TagCommand */
|
|
public $tag;
|
|
|
|
/** @var Command\TreeCommand */
|
|
public $tree;
|
|
|
|
/** @var string */
|
|
private $bin = 'git';
|
|
|
|
/** @var string */
|
|
private $directory = '.';
|
|
|
|
/**
|
|
* Initializes sub-commands
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->add = new Command\AddCommand($this);
|
|
$this->archive = new Command\ArchiveCommand($this);
|
|
$this->branch = new Command\BranchCommand($this);
|
|
$this->cat = new Command\CatCommand($this);
|
|
$this->checkout = new Command\CheckoutCommand($this);
|
|
$this->clone = new Command\CloneCommand($this);
|
|
$this->commit = new Command\CommitCommand($this);
|
|
$this->config = new Command\ConfigCommand($this);
|
|
$this->describe = new Command\DescribeCommand($this);
|
|
$this->fetch = new Command\FetchCommand($this);
|
|
$this->init = new Command\InitCommand($this);
|
|
$this->log = new Command\LogCommand($this);
|
|
$this->merge = new Command\MergeCommand($this);
|
|
$this->mv = new Command\MvCommand($this);
|
|
$this->pull = new Command\PullCommand($this);
|
|
$this->push = new Command\PushCommand($this);
|
|
$this->rebase = new Command\RebaseCommand($this);
|
|
$this->remote = new Command\RemoteCommand($this);
|
|
$this->reset = new Command\ResetCommand($this);
|
|
$this->rm = new Command\RmCommand($this);
|
|
$this->shortlog = new Command\ShortlogCommand($this);
|
|
$this->show = new Command\ShowCommand($this);
|
|
$this->stash = new Command\StashCommand($this);
|
|
$this->status = new Command\StatusCommand($this);
|
|
$this->tag = new Command\TagCommand($this);
|
|
$this->tree = new Command\TreeCommand($this);
|
|
}
|
|
|
|
/**
|
|
* Calls sub-commands
|
|
*
|
|
* @param string $name The name of a property
|
|
* @param array $arguments An array of arguments
|
|
*
|
|
* @throws \BadMethodCallException
|
|
* @return mixed
|
|
*/
|
|
public function __call($name, $arguments)
|
|
{
|
|
if (isset($this->{$name}) && is_callable($this->{$name})) {
|
|
return call_user_func_array($this->{$name}, $arguments);
|
|
}
|
|
|
|
throw new \BadMethodCallException(sprintf('Call to undefined method PHPGit\Git::%s()', $name));
|
|
}
|
|
|
|
/**
|
|
* Sets the Git binary path
|
|
*
|
|
* @param string $bin
|
|
*
|
|
* @return Git
|
|
*/
|
|
public function setBin($bin)
|
|
{
|
|
$this->bin = $bin;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Sets the Git repository path
|
|
*
|
|
* @var string $directory
|
|
*
|
|
* @return Git
|
|
*/
|
|
public function setRepository($directory)
|
|
{
|
|
$this->directory = $directory;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Returns version number
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function getVersion()
|
|
{
|
|
$process = $this->getProcessBuilder()
|
|
->add('--version')
|
|
->getProcess();
|
|
|
|
return $this->run($process);
|
|
}
|
|
|
|
/**
|
|
* Returns an instance of ProcessBuilder
|
|
*
|
|
* @return ProcessBuilder
|
|
*/
|
|
public function getProcessBuilder()
|
|
{
|
|
return ProcessBuilder::create()
|
|
->setPrefix($this->bin)
|
|
->setWorkingDirectory($this->directory);
|
|
}
|
|
|
|
/**
|
|
* Executes a process
|
|
*
|
|
* @param Process $process The process to run
|
|
*
|
|
* @throws Exception\GitException
|
|
* @return mixed
|
|
*/
|
|
public function run(Process $process)
|
|
{
|
|
$process->run();
|
|
|
|
if (!$process->isSuccessful()) {
|
|
throw new GitException($process->getErrorOutput(), $process->getExitCode(), $process->getCommandLine());
|
|
}
|
|
|
|
return $process->getOutput();
|
|
}
|
|
|
|
}
|