| Index: gclient_scm.py
|
| diff --git a/gclient_scm.py b/gclient_scm.py
|
| index f7f0b885c4d71227c7fe4b47bcdf3ca62cd5daff..66a7c48db95a134def4db5164d778b0315d10993 100644
|
| --- a/gclient_scm.py
|
| +++ b/gclient_scm.py
|
| @@ -473,7 +473,8 @@ class GitWrapper(SCMWrapper):
|
| if scm.GIT.IsGitSvn(self.checkout_path) and upstream_branch is not None:
|
| # Our git-svn branch (upstream_branch) is our upstream
|
| self._AttemptRebase(upstream_branch, files, options,
|
| - newbase=revision, printed_path=printed_path)
|
| + newbase=revision, printed_path=printed_path,
|
| + merge=options.merge)
|
| printed_path = True
|
| else:
|
| # Can't find a merge-base since we don't know our upstream. That makes
|
| @@ -483,12 +484,13 @@ class GitWrapper(SCMWrapper):
|
| if options.revision or deps_revision:
|
| upstream_branch = revision
|
| self._AttemptRebase(upstream_branch, files, options,
|
| - printed_path=printed_path)
|
| + printed_path=printed_path, merge=options.merge)
|
| printed_path = True
|
| elif rev_type == 'hash':
|
| # case 2
|
| self._AttemptRebase(upstream_branch, files, options,
|
| - newbase=revision, printed_path=printed_path)
|
| + newbase=revision, printed_path=printed_path,
|
| + merge=options.merge)
|
| printed_path = True
|
| elif revision.replace('heads', 'remotes/' + self.remote) != upstream_branch:
|
| # case 4
|
| @@ -509,25 +511,30 @@ class GitWrapper(SCMWrapper):
|
| print('Trying fast-forward merge to branch : %s' % upstream_branch)
|
| try:
|
| merge_args = ['merge']
|
| - if not options.merge:
|
| + if options.merge:
|
| + merge_args.append('--ff')
|
| + else:
|
| merge_args.append('--ff-only')
|
| merge_args.append(upstream_branch)
|
| merge_output = scm.GIT.Capture(merge_args, cwd=self.checkout_path)
|
| except subprocess2.CalledProcessError as e:
|
| if re.match('fatal: Not possible to fast-forward, aborting.', e.stderr):
|
| + files = []
|
| if not printed_path:
|
| print('\n_____ %s%s' % (self.relpath, rev_str))
|
| printed_path = True
|
| while True:
|
| try:
|
| action = ask_for_data(
|
| - 'Cannot fast-forward merge, attempt to rebase? '
|
| - '(y)es / (q)uit / (s)kip : ', options)
|
| + 'Cannot %s, attempt to rebase? '
|
| + '(y)es / (q)uit / (s)kip : ' %
|
| + ('merge' if options.merge else 'fast-forward merge'),
|
| + options)
|
| except ValueError:
|
| raise gclient_utils.Error('Invalid Character')
|
| if re.match(r'yes|y', action, re.I):
|
| self._AttemptRebase(upstream_branch, files, options,
|
| - printed_path=printed_path)
|
| + printed_path=printed_path, merge=False)
|
| printed_path = True
|
| break
|
| elif re.match(r'quit|q', action, re.I):
|
| @@ -884,19 +891,26 @@ class GitWrapper(SCMWrapper):
|
| 'create a new branch for your work.') % (revision, self.remote))
|
|
|
| def _AttemptRebase(self, upstream, files, options, newbase=None,
|
| - branch=None, printed_path=False):
|
| + branch=None, printed_path=False, merge=False):
|
| """Attempt to rebase onto either upstream or, if specified, newbase."""
|
| if files is not None:
|
| files.extend(self._Capture(['diff', upstream, '--name-only']).split())
|
| revision = upstream
|
| if newbase:
|
| revision = newbase
|
| + action = 'merge' if merge else 'rebase'
|
| if not printed_path:
|
| - print('\n_____ %s : Attempting rebase onto %s...' % (
|
| - self.relpath, revision))
|
| + print('\n_____ %s : Attempting %s onto %s...' % (
|
| + self.relpath, action, revision))
|
| printed_path = True
|
| else:
|
| - print('Attempting rebase onto %s...' % revision)
|
| + print('Attempting %s onto %s...' % (action, revision))
|
| +
|
| + if merge:
|
| + merge_output = self._Capture(['merge', revision])
|
| + if options.verbose:
|
| + print(merge_output)
|
| + return
|
|
|
| # Build the rebase command here using the args
|
| # git rebase [options] [--onto <newbase>] <upstream> [<branch>]
|
|
|