diff options
Diffstat (limited to 'library/kzykhys/git/src/PHPGit/Command/StashCommand.php')
-rw-r--r-- | library/kzykhys/git/src/PHPGit/Command/StashCommand.php | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/library/kzykhys/git/src/PHPGit/Command/StashCommand.php b/library/kzykhys/git/src/PHPGit/Command/StashCommand.php new file mode 100644 index 000000000..52dceaa6b --- /dev/null +++ b/library/kzykhys/git/src/PHPGit/Command/StashCommand.php @@ -0,0 +1,309 @@ +<?php + +namespace PHPGit\Command; + +use PHPGit\Command; + +/** + * Stash the changes in a dirty working directory away - `git stash` + * + * @author Kazuyuki Hayashi + */ +class StashCommand extends Command +{ + + /** + * Save your local modifications to a new stash, and run git reset --hard to revert them + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash(); + * ``` + * + * @return bool + */ + public function __invoke() + { + $builder = $this->git->getProcessBuilder() + ->add('stash'); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Save your local modifications to a new stash, and run git reset --hard to revert them. + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->save('My stash'); + * ``` + * + * @param string $message [optional] The description along with the stashed state + * @param array $options [optional] An array of options {@see StashCommand::setDefaultOptions} + * + * @return bool + */ + public function save($message = null, array $options = array()) + { + $options = $this->resolve($options); + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('save'); + + $builder->add($message); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Returns the stashes that you currently have + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $stashes = $git->stash->lists(); + * ``` + * + * ##### Output Example + * + * ``` php + * [ + * 0 => ['branch' => 'master', 'message' => '0e2f473 Fixes README.md'], + * 1 => ['branch' => 'master', 'message' => 'ce1ddde Initial commit'], + * ] + * ``` + * + * @param array $options [optional] An array of options {@see StashCommand::setDefaultOptions} + * + * @return array + */ + public function lists(array $options = array()) + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('list'); + + $output = $this->git->run($builder->getProcess()); + $lines = $this->split($output); + $list = array(); + + foreach ($lines as $line) { + if (preg_match('/stash@{(\d+)}:.* [Oo]n (.*): (.*)/', $line, $matches)) { + $list[$matches[1]] = array( + 'branch' => $matches[2], + 'message' => $matches[3] + ); + } + } + + return $list; + } + + /** + * Show the changes recorded in the stash as a diff between the stashed state and its original parent + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * echo $git->stash->show('stash@{0}'); + * ``` + * + * ##### Output Example + * + * ``` + * REAMDE.md | 2 +- + * 1 files changed, 1 insertions(+), 1 deletions(-) + * ``` + * + * @param string $stash The stash to show + * + * @return string + */ + public function show($stash = null) + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('show'); + + if ($stash) { + $builder->add($stash); + } + + return $this->git->run($builder->getProcess()); + } + + /** + * Remove a single stashed state from the stash list + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->drop('stash@{0}'); + * ``` + * + * @param string $stash The stash to drop + * + * @return mixed + */ + public function drop($stash = null) + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('drop'); + + if ($stash) { + $builder->add($stash); + } + + return $this->git->run($builder->getProcess()); + } + + /** + * Remove a single stashed state from the stash list and apply it on top of the current working tree state + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->pop('stash@{0}'); + * ``` + * + * @param string $stash The stash to pop + * @param array $options [optional] An array of options {@see StashCommand::setDefaultOptions} + * + * @return bool + */ + public function pop($stash = null, array $options = array()) + { + $options = $this->resolve($options); + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('pop'); + + $this->addFlags($builder, $options, array('index')); + + if ($stash) { + $builder->add($stash); + } + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Like pop, but do not remove the state from the stash list + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->apply('stash@{0}'); + * ``` + * + * @param string $stash The stash to apply + * @param array $options [optional] An array of options {@see StashCommand::setDefaultOptions} + * + * @return bool + */ + public function apply($stash = null, array $options = array()) + { + $options = $this->resolve($options); + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('apply'); + + $this->addFlags($builder, $options, array('index')); + + if ($stash) { + $builder->add($stash); + } + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Creates and checks out a new branch named <branchname> starting from the commit at which the <stash> was originally created, applies the changes recorded in <stash> to the new working tree and index + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->branch('hotfix', 'stash@{0}'); + * ``` + * + * @param string $name The name of the branch + * @param string $stash The stash + * + * @return bool + */ + public function branch($name, $stash = null) + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('branch') + ->add($name); + + if ($stash) { + $builder->add($stash); + } + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Remove all the stashed states + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $git->stash->clear(); + * ``` + * + * @return bool + */ + public function clear() + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('clear'); + + $this->git->run($builder->getProcess()); + + return true; + } + + /** + * Create a stash (which is a regular commit object) and return its object name, without storing it anywhere in the ref namespace + * + * ``` php + * $git = new PHPGit\Git(); + * $git->setRepository('/path/to/repo'); + * $commit = $git->stash->create(); + * ``` + * + * ##### Output Example + * + * ``` + * 877316ea6f95c43b7ccc2c2a362eeedfa78b597d + * ``` + * + * @return string + */ + public function create() + { + $builder = $this->git->getProcessBuilder() + ->add('stash') + ->add('create'); + + return $this->git->run($builder->getProcess()); + } + +}
\ No newline at end of file |