| Index: gclient_scm.py
|
| diff --git a/gclient_scm.py b/gclient_scm.py
|
| index bbed0950e870850750beaf9ed98863cb3912cfde..066f5e79a179093a404eafea6b9b3d0630ab851c 100644
|
| --- a/gclient_scm.py
|
| +++ b/gclient_scm.py
|
| @@ -23,13 +23,12 @@ class DiffFilterer(object):
|
| original_prefix = "--- "
|
| working_prefix = "+++ "
|
|
|
| - def __init__(self, relpath, stdout):
|
| + def __init__(self, relpath):
|
| # Note that we always use '/' as the path separator to be
|
| # consistent with svn's cygwin-style output on Windows
|
| self._relpath = relpath.replace("\\", "/")
|
| self._current_file = ""
|
| self._replacement_file = ""
|
| - self._stdout = stdout
|
|
|
| def SetCurrentFile(self, current_file):
|
| self._current_file = current_file
|
| @@ -48,7 +47,7 @@ class DiffFilterer(object):
|
| if (line.startswith(self.original_prefix) or
|
| line.startswith(self.working_prefix)):
|
| line = self._Replace(line)
|
| - self._stdout.write(line + '\n')
|
| + print(line)
|
|
|
|
|
| ### SCM abstraction layer
|
| @@ -153,8 +152,7 @@ class GitWrapper(SCMWrapper):
|
| gclient_utils.CheckCallAndFilter(
|
| ['git', 'diff', merge_base],
|
| cwd=self.checkout_path,
|
| - filter_fn=DiffFilterer(self.relpath, options.stdout).Filter,
|
| - stdout=options.stdout)
|
| + filter_fn=DiffFilterer(self.relpath).Filter)
|
|
|
| def update(self, options, args, file_list):
|
| """Runs git to update or transparently checkout the working copy.
|
| @@ -185,7 +183,7 @@ class GitWrapper(SCMWrapper):
|
| printed_path = False
|
| verbose = []
|
| if options.verbose:
|
| - options.stdout.write("\n_____ %s%s\n" % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| verbose = ['--verbose']
|
| printed_path = True
|
|
|
| @@ -206,7 +204,7 @@ class GitWrapper(SCMWrapper):
|
| if not verbose:
|
| # Make the output a little prettier. It's nice to have some whitespace
|
| # between projects when cloning.
|
| - options.stdout.write('\n')
|
| + print('')
|
| return
|
|
|
| if not os.path.exists(os.path.join(self.checkout_path, '.git')):
|
| @@ -266,16 +264,15 @@ class GitWrapper(SCMWrapper):
|
| # Hackish but at that point, git is known to work so just checking for
|
| # 502 in stderr should be fine.
|
| if '502' in e.stderr:
|
| - options.stdout.write(str(e) + '\n')
|
| - options.stdout.write('Sleeping %.1f seconds and retrying...\n' %
|
| - backoff_time)
|
| + print(str(e))
|
| + print('Sleeping %.1f seconds and retrying...' % backoff_time)
|
| time.sleep(backoff_time)
|
| backoff_time *= 1.3
|
| continue
|
| raise
|
|
|
| if verbose:
|
| - options.stdout.write(remote_output)
|
| + print(remote_output.strip())
|
|
|
| # This is a big hammer, debatable if it should even be here...
|
| if options.force or options.reset:
|
| @@ -287,7 +284,7 @@ class GitWrapper(SCMWrapper):
|
| self._CheckDetachedHead(rev_str, options)
|
| self._Capture(['checkout', '--quiet', '%s^0' % revision])
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| elif current_type == 'hash':
|
| # case 1
|
| if scm.GIT.IsGitSvn(self.checkout_path) and upstream_branch is not None:
|
| @@ -314,7 +311,7 @@ class GitWrapper(SCMWrapper):
|
| # case 4
|
| new_base = revision.replace('heads', 'remotes/origin')
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| switch_error = ("Switching upstream branch from %s to %s\n"
|
| % (upstream_branch, new_base) +
|
| "Please merge or rebase manually:\n" +
|
| @@ -325,15 +322,14 @@ class GitWrapper(SCMWrapper):
|
| # case 3 - the default case
|
| files = self._Capture(['diff', upstream_branch, '--name-only']).split()
|
| if verbose:
|
| - options.stdout.write('Trying fast-forward merge to branch : %s\n' %
|
| - upstream_branch)
|
| + print('Trying fast-forward merge to branch : %s' % upstream_branch)
|
| try:
|
| merge_output = scm.GIT.Capture(['merge', '--ff-only', upstream_branch],
|
| cwd=self.checkout_path)
|
| except gclient_utils.CheckCallError, e:
|
| if re.match('fatal: Not possible to fast-forward, aborting.', e.stderr):
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| printed_path = True
|
| while True:
|
| try:
|
| @@ -354,34 +350,34 @@ class GitWrapper(SCMWrapper):
|
| "cd %s && git " % self.checkout_path
|
| + "rebase %s" % upstream_branch)
|
| elif re.match(r'skip|s', action, re.I):
|
| - options.stdout.write('Skipping %s\n' % self.relpath)
|
| + print('Skipping %s' % self.relpath)
|
| return
|
| else:
|
| - options.stdout.write('Input not recognized\n')
|
| + print('Input not recognized')
|
| elif re.match("error: Your local changes to '.*' would be "
|
| "overwritten by merge. Aborting.\nPlease, commit your "
|
| "changes or stash them before you can merge.\n",
|
| e.stderr):
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| printed_path = True
|
| raise gclient_utils.Error(e.stderr)
|
| else:
|
| # Some other problem happened with the merge
|
| logging.error("Error during fast-forward merge in %s!" % self.relpath)
|
| - options.stdout.write(e.stderr + '\n')
|
| + print(e.stderr)
|
| raise
|
| else:
|
| # Fast-forward merge was successful
|
| if not re.match('Already up-to-date.', merge_output) or verbose:
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| printed_path = True
|
| - options.stdout.write(merge_output)
|
| + print(merge_output.strip())
|
| if not verbose:
|
| # Make the output a little prettier. It's nice to have some
|
| # whitespace between projects when syncing.
|
| - options.stdout.write('\n')
|
| + print('')
|
|
|
| file_list.extend([os.path.join(self.checkout_path, f) for f in files])
|
|
|
| @@ -394,8 +390,7 @@ class GitWrapper(SCMWrapper):
|
| % (self.relpath, rev_str))
|
|
|
| if verbose:
|
| - options.stdout.write('Checked out revision %s\n' %
|
| - self.revinfo(options, (), None))
|
| + print('Checked out revision %s' % self.revinfo(options, (), None))
|
|
|
| def revert(self, options, args, file_list):
|
| """Reverts local modifications.
|
| @@ -405,8 +400,7 @@ class GitWrapper(SCMWrapper):
|
| if not os.path.isdir(self.checkout_path):
|
| # revert won't work if the directory doesn't exist. It needs to
|
| # checkout instead.
|
| - options.stdout.write('\n_____ %s is missing, synching instead\n' %
|
| - self.relpath)
|
| + print('\n_____ %s is missing, synching instead' % self.relpath)
|
| # Don't reuse the args.
|
| return self.update(options, [], file_list)
|
|
|
| @@ -431,9 +425,8 @@ class GitWrapper(SCMWrapper):
|
| def status(self, options, args, file_list):
|
| """Display status information."""
|
| if not os.path.isdir(self.checkout_path):
|
| - options.stdout.write(
|
| - ('\n________ couldn\'t run status in %s:\nThe directory '
|
| - 'does not exist.\n') % self.checkout_path)
|
| + print(('\n________ couldn\'t run status in %s:\n'
|
| + 'The directory does not exist.') % self.checkout_path)
|
| else:
|
| merge_base = self._Capture(['merge-base', 'HEAD', 'origin'])
|
| self._Run(['diff', '--name-status', merge_base], options)
|
| @@ -457,7 +450,7 @@ class GitWrapper(SCMWrapper):
|
| if not options.verbose:
|
| # git clone doesn't seem to insert a newline properly before printing
|
| # to stdout
|
| - options.stdout.write('\n')
|
| + print('')
|
|
|
| clone_cmd = ['clone']
|
| if revision.startswith('refs/heads/'):
|
| @@ -482,15 +475,15 @@ class GitWrapper(SCMWrapper):
|
| # read". In the meantime, just make sure .git exists.
|
| if (e.args[0] == 'git command clone returned 128' and
|
| os.path.exists(os.path.join(self.checkout_path, '.git'))):
|
| - options.stdout.write(str(e) + '\n')
|
| - options.stdout.write('Retrying...\n')
|
| + print(str(e))
|
| + print('Retrying...')
|
| continue
|
| raise e
|
|
|
| if detach_head:
|
| # Squelch git's very verbose detached HEAD warning and use our own
|
| self._Capture(['checkout', '--quiet', '%s^0' % revision])
|
| - options.stdout.write(
|
| + print(
|
| ('Checked out %s to a detached HEAD. Before making any commits\n'
|
| 'in this repo, you should use \'git checkout <branch>\' to switch to\n'
|
| 'an existing branch or use \'git checkout origin -b <branch>\' to\n'
|
| @@ -504,11 +497,11 @@ class GitWrapper(SCMWrapper):
|
| if newbase:
|
| revision = newbase
|
| if not printed_path:
|
| - options.stdout.write('\n_____ %s : Attempting rebase onto %s...\n' % (
|
| + print('\n_____ %s : Attempting rebase onto %s...' % (
|
| self.relpath, revision))
|
| printed_path = True
|
| else:
|
| - options.stdout.write('Attempting rebase onto %s...\n' % revision)
|
| + print('Attempting rebase onto %s...' % revision)
|
|
|
| # Build the rebase command here using the args
|
| # git rebase [options] [--onto <newbase>] <upstream> [<branch>]
|
| @@ -543,7 +536,7 @@ class GitWrapper(SCMWrapper):
|
| "cd %s && git " % self.checkout_path
|
| + "%s" % ' '.join(rebase_cmd))
|
| elif re.match(r'show|s', rebase_action, re.I):
|
| - options.stdout.write('\n%s\n' % e.stderr.strip())
|
| + print('\n%s' % e.stderr.strip())
|
| continue
|
| else:
|
| gclient_utils.Error("Input not recognized")
|
| @@ -553,19 +546,18 @@ class GitWrapper(SCMWrapper):
|
| "Fix the conflict and run gclient again.\n"
|
| "See 'man git-rebase' for details.\n")
|
| else:
|
| - options.stdout.write(e.stdout.strip() + '\n')
|
| - options.stdout.write('Rebase produced error output:\n%s\n' %
|
| - e.stderr.strip())
|
| + print(e.stdout.strip())
|
| + print('Rebase produced error output:\n%s' % e.stderr.strip())
|
| raise gclient_utils.Error("Unrecognized error, please merge or rebase "
|
| "manually.\ncd %s && git " %
|
| self.checkout_path
|
| + "%s" % ' '.join(rebase_cmd))
|
|
|
| - options.stdout.write(rebase_output)
|
| + print(rebase_output.strip())
|
| if not options.verbose:
|
| # Make the output a little prettier. It's nice to have some
|
| # whitespace between projects when syncing.
|
| - options.stdout.write('\n')
|
| + print('')
|
|
|
| @staticmethod
|
| def _CheckMinVersion(min_version):
|
| @@ -624,8 +616,7 @@ class GitWrapper(SCMWrapper):
|
| name = ('saved-by-gclient-' +
|
| self._Capture(['rev-parse', '--short', 'HEAD']))
|
| self._Capture(['branch', name])
|
| - options.stdout.write(
|
| - '\n_____ found an unreferenced commit and saved it as \'%s\'\n' %
|
| + print('\n_____ found an unreferenced commit and saved it as \'%s\'' %
|
| name)
|
|
|
| def _GetCurrentBranch(self):
|
| @@ -642,7 +633,7 @@ class GitWrapper(SCMWrapper):
|
| def _Run(self, args, options, **kwargs):
|
| kwargs.setdefault('cwd', self.checkout_path)
|
| gclient_utils.CheckCallAndFilterAndHeader(['git'] + args,
|
| - always=options.verbose, stdout=options.stdout, **kwargs)
|
| + always=options.verbose, **kwargs)
|
|
|
|
|
| class SVNWrapper(SCMWrapper):
|
| @@ -680,8 +671,7 @@ class SVNWrapper(SCMWrapper):
|
| ['svn', 'diff', '-x', '--ignore-eol-style'] + args,
|
| cwd=self.checkout_path,
|
| print_stdout=False,
|
| - filter_fn=DiffFilterer(self.relpath, options.stdout).Filter,
|
| - stdout=options.stdout)
|
| + filter_fn=DiffFilterer(self.relpath).Filter)
|
|
|
| def update(self, options, args, file_list):
|
| """Runs svn to update or transparently checkout the working copy.
|
| @@ -694,8 +684,7 @@ class SVNWrapper(SCMWrapper):
|
| # Only update if git is not controlling the directory.
|
| git_path = os.path.join(self.checkout_path, '.git')
|
| if os.path.exists(git_path):
|
| - options.stdout.write('________ found .git directory; skipping %s\n' %
|
| - self.relpath)
|
| + print('________ found .git directory; skipping %s' % self.relpath)
|
| return
|
|
|
| if args:
|
| @@ -757,8 +746,7 @@ class SVNWrapper(SCMWrapper):
|
| can_switch = ((from_info['Repository Root'] != to_info['Repository Root'])
|
| and (from_info['UUID'] == to_info['UUID']))
|
| if can_switch:
|
| - options.stdout.write('\n_____ relocating %s to a new checkout\n' %
|
| - self.relpath)
|
| + print('\n_____ relocating %s to a new checkout' % self.relpath)
|
| # We have different roots, so check if we can switch --relocate.
|
| # Subversion only permits this if the repository UUIDs match.
|
| # Perform the switch --relocate, then rewrite the from_url
|
| @@ -786,8 +774,7 @@ class SVNWrapper(SCMWrapper):
|
| 'there is local changes in %s. Delete the directory and '
|
| 'try again.') % (url, self.checkout_path))
|
| # Ok delete it.
|
| - options.stdout.write('\n_____ switching %s to a new checkout\n' %
|
| - self.relpath)
|
| + print('\n_____ switching %s to a new checkout' % self.relpath)
|
| gclient_utils.RemoveDirectory(self.checkout_path)
|
| # We need to checkout.
|
| command = ['checkout', url, self.checkout_path]
|
| @@ -799,7 +786,7 @@ class SVNWrapper(SCMWrapper):
|
| # number of the existing directory, then we don't need to bother updating.
|
| if not options.force and str(from_info['Revision']) == revision:
|
| if options.verbose or not forced_revision:
|
| - options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
|
| + print('\n_____ %s%s' % (self.relpath, rev_str))
|
| return
|
|
|
| command = ['update', self.checkout_path]
|
| @@ -843,16 +830,10 @@ class SVNWrapper(SCMWrapper):
|
| if not os.path.isdir(self.checkout_path):
|
| # svn revert won't work if the directory doesn't exist. It needs to
|
| # checkout instead.
|
| - options.stdout.write('\n_____ %s is missing, synching instead\n' %
|
| - self.relpath)
|
| + print('\n_____ %s is missing, synching instead' % self.relpath)
|
| # Don't reuse the args.
|
| return self.update(options, [], file_list)
|
|
|
| - # Do a flush of sys.stdout every 10 secs or so otherwise it may never be
|
| - # flushed fast enough for buildbot.
|
| - last_flushed_at = time.time()
|
| - sys.stdout.flush()
|
| -
|
| for file_status in scm.SVN.CaptureStatus(self.checkout_path):
|
| file_path = os.path.join(self.checkout_path, file_status[1])
|
| if file_status[0][0] == 'X':
|
| @@ -863,13 +844,7 @@ class SVNWrapper(SCMWrapper):
|
| if logging.getLogger().isEnabledFor(logging.INFO):
|
| logging.info('%s%s' % (file[0], file[1]))
|
| else:
|
| - options.stdout.write(file_path + '\n')
|
| - # Flush at least 10 seconds between line writes. We wait at least 10
|
| - # seconds to avoid overloading the reader that called us with output,
|
| - # which can slow busy readers down.
|
| - if (time.time() - last_flushed_at) > 10:
|
| - last_flushed_at = time.time()
|
| - sys.stdout.flush()
|
| + print(file_path)
|
|
|
| if file_status[0].isspace():
|
| logging.error('No idea what is the status of %s.\n'
|
| @@ -917,9 +892,9 @@ class SVNWrapper(SCMWrapper):
|
| command = ['status'] + args
|
| if not os.path.isdir(self.checkout_path):
|
| # svn status won't work if the directory doesn't exist.
|
| - options.stdout.write(
|
| - ('\n________ couldn\'t run \'%s\' in \'%s\':\nThe directory '
|
| - 'does not exist.') % (' '.join(command), self.checkout_path))
|
| + print(('\n________ couldn\'t run \'%s\' in \'%s\':\n'
|
| + 'The directory does not exist.') %
|
| + (' '.join(command), self.checkout_path))
|
| # There's no file list to retrieve.
|
| else:
|
| self._RunAndGetFileList(command, options, file_list)
|
| @@ -932,13 +907,13 @@ class SVNWrapper(SCMWrapper):
|
| """Runs a commands that goes to stdout."""
|
| kwargs.setdefault('cwd', self.checkout_path)
|
| gclient_utils.CheckCallAndFilterAndHeader(['svn'] + args,
|
| - always=options.verbose, stdout=options.stdout, **kwargs)
|
| + always=options.verbose, **kwargs)
|
|
|
| def _RunAndGetFileList(self, args, options, file_list, cwd=None):
|
| """Runs a commands that goes to stdout and grabs the file listed."""
|
| cwd = cwd or self.checkout_path
|
| scm.SVN.RunAndGetFileList(options.verbose, args, cwd=cwd,
|
| - file_list=file_list, stdout=options.stdout)
|
| + file_list=file_list)
|
|
|
| @staticmethod
|
| def _AddAdditionalUpdateFlags(command, options, revision):
|
|
|