diff options
Diffstat (limited to 'library/kzykhys/git/src/PHPGit/Command/RemoteCommand.php')
-rw-r--r-- | library/kzykhys/git/src/PHPGit/Command/RemoteCommand.php | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/library/kzykhys/git/src/PHPGit/Command/RemoteCommand.php b/library/kzykhys/git/src/PHPGit/Command/RemoteCommand.php new file mode 100644 index 000000000..08220a551 --- /dev/null +++ b/library/kzykhys/git/src/PHPGit/Command/RemoteCommand.php @@ -0,0 +1,278 @@ +<?php + +namespace PHPGit\Command; + +use PHPGit\Command; +use PHPGit\Git; +use Symfony\Component\OptionsResolver\OptionsResolverInterface; + +/** + * Manage set of tracked repositories - `git remote` + * + * @author Kazuyuki Hayashi <hayashi@valnur.net> + * + * @method head($name, $branch) Sets the default branch for the named remote + * @method branches($name, $branches) Changes the list of branches tracked by the named remote + * @method url($name, $newUrl, $oldUrl = null, $options = array()) Sets the URL remote to $newUrl + */ +class RemoteCommand extends Command +{ + + /** @var Remote\SetHeadCommand */ + public $head; + + /** @var Remote\SetBranchesCommand */ + public $branches; + + /** @var Remote\SetUrlCommand */ + public $url; + + /** + * @param Git $git + */ + public function __construct(Git $git) + { + parent::__construct($git); + + $this->head = new Remote\SetHeadCommand($git); + $this->branches = new Remote\SetBranchesCommand($git); + $this->url = new Remote\SetUrlCommand($git); + } + + /** + * 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 %s::%s()', __CLASS__, $name)); + } + + /** + * Returns an array of existing remotes + * + * ``` php + * $git = new PHPGit\Git(); + * $git->clone('https://github.com/kzykhys/Text.git', '/path/to/repo'); + * $git->setRepository('/path/to/repo'); + * $remotes = $git->remote(); + * ``` + * + * ##### Output Example + * + * ``` php + * [ + * 'origin' => [ + * 'fetch' => 'https://github.com/kzykhys/Text.git', + * 'push' => 'https://github.com/kzykhys/Text.git' + * ] + * ] + * ``` + * + * @return array + */ + public function __invoke() + { + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('-v'); + + $remotes = array(); + $output = $this->git->run($builder->getProcess()); + $lines = $this->split($output); + + foreach ($lines as $line) { + if (preg_match('/^(.*)\t(.*)\s\((.*)\)$/', $line, $matches)) { + if (!isset($remotes[$matches[1]])) { + $remotes[$matches[1]] = array(); + } + + $remotes[$matches[1]][$matches[3]] = $matches[2]; + } + } + + return $remotes; + } + + /** + * Adds a remote named **$name** for the repository at **$url** + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->remote->add('origin', 'https://github.com/kzykhys/Text.git'); + * $git->fetch('origin'); + * ``` + * + * ##### Options + * + * - **tags** (_boolean_) With this option, `git fetch <name>` imports every tag from the remote repository + * - **no-tags** (_boolean_) With this option, `git fetch <name>` does not import tags from the remote repository + * + * @param string $name The name of the remote + * @param string $url The url of the remote + * @param array $options [optional] An array of options {@see RemoteCommand::setDefaultOptions} + * + * @return bool + */ + public function add($name, $url, array $options = array()) + { + $options = $this->resolve($options); + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('add'); + + $this->addFlags($builder, $options, array('tags', 'no-tags')); + + $builder->add($name)->add($url); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Rename the remote named **$name** to **$newName** + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->remote->add('origin', 'https://github.com/kzykhys/Text.git'); + * $git->remote->rename('origin', 'upstream'); + * ``` + * + * @param string $name The remote name to rename + * @param string $newName The new remote name + * + * @return bool + */ + public function rename($name, $newName) + { + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('rename') + ->add($name) + ->add($newName); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Remove the remote named **$name** + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->remote->add('origin', 'https://github.com/kzykhys/Text.git'); + * $git->remote->rm('origin'); + * ``` + * + * @param string $name The remote name to remove + * + * @return bool + */ + public function rm($name) + { + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('rm') + ->add($name); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Gives some information about the remote **$name** + * + * ``` php + * $git = new PHPGit\Git(); + * $git->clone('https://github.com/kzykhys/Text.git', '/path/to/repo'); + * $git->setRepository('/path/to/repo'); + * echo $git->remote->show('origin'); + * ``` + * + * ##### Output Example + * + * ``` + * \* remote origin + * Fetch URL: https://github.com/kzykhys/Text.git + * Push URL: https://github.com/kzykhys/Text.git + * HEAD branch: master + * Remote branch: + * master tracked + * Local branch configured for 'git pull': + * master merges with remote master + * Local ref configured for 'git push': + * master pushes to master (up to date) + * ``` + * + * @param string $name The remote name to show + * + * @return string + */ + public function show($name) + { + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('show') + ->add($name); + + return $this->git->run($builder->getProcess()); + } + + /** + * Deletes all stale remote-tracking branches under **$name** + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->remote->prune('origin'); + * ``` + * + * @param string $name The remote name + * + * @return bool + */ + public function prune($name = null) + { + $builder = $this->git->getProcessBuilder() + ->add('remote') + ->add('prune'); + + if ($name) { + $builder->add($name); + } + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * {@inheritdoc} + * + * - **tags** (_boolean_) With this option, `git fetch <name>` imports every tag from the remote repository + * - **no-tags** (_boolean_) With this option, `git fetch <name>` does not import tags from the remote repository + */ + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'tags' => false, + 'no-tags' => false + )); + } + +}
\ No newline at end of file |