diff options
Diffstat (limited to 'library/kzykhys/git/src/PHPGit/Git.php')
-rw-r--r-- | library/kzykhys/git/src/PHPGit/Git.php | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/library/kzykhys/git/src/PHPGit/Git.php b/library/kzykhys/git/src/PHPGit/Git.php new file mode 100644 index 000000000..f952d6f1f --- /dev/null +++ b/library/kzykhys/git/src/PHPGit/Git.php @@ -0,0 +1,308 @@ +<?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+ + * ================================== + * + * [![Latest Unstable Version](https://poser.pugx.org/kzykhys/git/v/unstable.png)](https://packagist.org/packages/kzykhys/git) + * [![Build Status](https://travis-ci.org/kzykhys/PHPGit.png?branch=master)](https://travis-ci.org/kzykhys/PHPGit) + * [![Coverage Status](https://coveralls.io/repos/kzykhys/PHPGit/badge.png)](https://coveralls.io/r/kzykhys/PHPGit) + * [![SensioLabsInsight](https://insight.sensiolabs.com/projects/04f10b57-a113-47ad-8dda-9a6dacbb079f/mini.png)](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(); + } + +}
\ No newline at end of file |