aboutsummaryrefslogtreecommitdiffstats
path: root/library/kzykhys/git/src/PHPGit/Command/RebaseCommand.php
blob: 7516b360c2461488c94e329eafd492735638f0f3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php

namespace PHPGit\Command;

use PHPGit\Command;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * Forward-port local commits to the updated upstream head - `git rebase`
 *
 * @author Kazuyuki Hayashi <hayashi@valnur.net>
 */
class RebaseCommand extends Command
{

    /**
     * Forward-port local commits to the updated upstream head
     *
     * ``` php
     * $git = new PHPGit\Git();
     * $git->setRepository('/path/to/repo');
     * $git->fetch('origin');
     * $git->rebase('origin/master');
     * ```
     *
     * ##### Options
     *
     * - **onto**          (_string_)  Starting point at which to create the new commits
     * - **no-verify**     (_boolean_) Bypasses the pre-rebase hook
     * - **force-rebase**  (_boolean_) Force the rebase even if the current branch is a descendant of the commit you are rebasing onto
     *
     * @param string $upstream [optional] Upstream branch to compare against
     * @param string $branch   [optional] Working branch; defaults to HEAD
     * @param array  $options  [optional] An array of options {@see RebaseCommand::setDefaultOptions}
     *
     * @return bool
     */
    public function __invoke($upstream = null, $branch = null, array $options = array())
    {
        $options = $this->resolve($options);
        $builder = $this->git->getProcessBuilder()
            ->add('rebase');

        if ($options['onto']) {
            $builder->add('--onto')->add($options['onto']);
        }

        if ($upstream) {
            $builder->add($upstream);
        }

        if ($branch) {
            $builder->add($branch);
        }

        $this->git->run($builder->getProcess());

        return true;
    }

    /**
     * Restart the rebasing process after having resolved a merge conflict
     *
     * @return bool
     */
    public function continues()
    {
        $builder = $this->git->getProcessBuilder()
            ->add('rebase')
            ->add('--continue');

        $this->git->run($builder->getProcess());

        return true;
    }

    /**
     * Abort the rebase operation and reset HEAD to the original branch
     *
     * @return bool
     */
    public function abort()
    {
        $builder = $this->git->getProcessBuilder()
            ->add('rebase')
            ->add('--abort');

        $this->git->run($builder->getProcess());

        return true;
    }

    /**
     * Restart the rebasing process by skipping the current patch
     *
     * @return bool
     */
    public function skip()
    {
        $builder = $this->git->getProcessBuilder()
            ->add('rebase')
            ->add('--skip');

        $this->git->run($builder->getProcess());

        return true;
    }

    /**
     * {@inheritdoc}
     *
     * - **onto**          (_string_)  Starting point at which to create the new commits
     * - **no-verify**     (_boolean_) Bypasses the pre-rebase hook
     * - **force-rebase**  (_boolean_) Force the rebase even if the current branch is a descendant of the commit you are rebasing onto
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'onto'         => null,
            'no-verify'    => false,
            'force-rebase' => false
        ));

        $resolver->setAllowedTypes(array(
            'onto' => array('null', 'string')
        ));
    }

}