Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index f7f0b885c4d71227c7fe4b47bcdf3ca62cd5daff..e7c7aa56b08005aee5842274f05a4e1c17984ffb 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -78,18 +78,6 @@ class GitDiffFilterer(DiffFiltererWrapper): |
return re.sub("[a|b]/" + self._current_file, self._replacement_file, line) |
-def ask_for_data(prompt, options): |
- if options.jobs > 1: |
- raise gclient_utils.Error("Background task requires input. Rerun " |
- "gclient with --jobs=1 so that\n" |
- "interaction is possible.") |
- try: |
- return raw_input(prompt) |
- except KeyboardInterrupt: |
- # Hide the exception. |
- sys.exit(1) |
- |
- |
### SCM abstraction layer |
# Factory Method for SCM wrapper creation |
@@ -473,7 +461,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 +472,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 +499,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) |
+ action = self._AskForData( |
+ '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): |
@@ -883,20 +878,40 @@ class GitWrapper(SCMWrapper): |
'an existing branch or use \'git checkout %s -b <branch>\' to\n' |
'create a new branch for your work.') % (revision, self.remote)) |
+ @staticmethod |
+ def _AskForData(prompt, options): |
+ if options.jobs > 1: |
+ raise gclient_utils.Error("Background task requires input. Rerun " |
+ "gclient with --jobs=1 so that\n" |
+ "interaction is possible.") |
+ try: |
+ return raw_input(prompt) |
+ except KeyboardInterrupt: |
+ # Hide the exception. |
+ sys.exit(1) |
+ |
+ |
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>] |
@@ -916,7 +931,7 @@ class GitWrapper(SCMWrapper): |
re.match(r'cannot rebase: your index contains uncommitted changes', |
e.stderr)): |
while True: |
- rebase_action = ask_for_data( |
+ rebase_action = self._AskForData( |
'Cannot rebase because of unstaged changes.\n' |
'\'git reset --hard HEAD\' ?\n' |
'WARNING: destroys any uncommitted work in your current branch!' |