aboutsummaryrefslogtreecommitdiffstats
path: root/library/kzykhys/git/src/PHPGit/Command/StashCommand.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/kzykhys/git/src/PHPGit/Command/StashCommand.php')
-rw-r--r--library/kzykhys/git/src/PHPGit/Command/StashCommand.php309
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