| Index: gclient.py
 | 
| ===================================================================
 | 
| --- gclient.py	(revision 15824)
 | 
| +++ gclient.py	(working copy)
 | 
| @@ -475,7 +475,7 @@
 | 
|  # SVN utils:
 | 
|  
 | 
|  
 | 
| -def RunSVN(args, in_directory):
 | 
| +def RunSVN(options, args, in_directory):
 | 
|    """Runs svn, sending output to stdout.
 | 
|  
 | 
|    Args:
 | 
| @@ -491,7 +491,7 @@
 | 
|    SubprocessCall(c, in_directory, options.stdout)
 | 
|  
 | 
|  
 | 
| -def CaptureSVN(args, in_directory=None, print_error=True):
 | 
| +def CaptureSVN(options, args, in_directory):
 | 
|    """Runs svn, capturing output sent to stdout as a string.
 | 
|  
 | 
|    Args:
 | 
| @@ -508,14 +508,8 @@
 | 
|    # the svn.exe executable, but shell=True makes subprocess on Linux fail
 | 
|    # when it's called with a list because it only tries to execute the
 | 
|    # first string ("svn").
 | 
| -  stderr = None
 | 
| -  if print_error:
 | 
| -    stderr = subprocess.PIPE
 | 
| -  return subprocess.Popen(c,
 | 
| -                          cwd=in_directory,
 | 
| -                          shell=(sys.platform == 'win32'),
 | 
| -                          stdout=subprocess.PIPE,
 | 
| -                          stderr=stderr).communicate()[0]
 | 
| +  return subprocess.Popen(c, cwd=in_directory, shell=(sys.platform == 'win32'),
 | 
| +                          stdout=subprocess.PIPE).communicate()[0]
 | 
|  
 | 
|  
 | 
|  def RunSVNAndGetFileList(options, args, in_directory, file_list):
 | 
| @@ -562,7 +556,7 @@
 | 
|                             pattern=pattern, capture_list=file_list)
 | 
|  
 | 
|  
 | 
| -def CaptureSVNInfo(relpath, in_directory=None, print_error=True):
 | 
| +def CaptureSVNInfo(options, relpath, in_directory):
 | 
|    """Returns a dictionary from the svn info output for the given file.
 | 
|  
 | 
|    Args:
 | 
| @@ -570,8 +564,7 @@
 | 
|        the directory given by in_directory.
 | 
|      in_directory: The directory where svn is to be run.
 | 
|    """
 | 
| -  output = CaptureSVN(["info", "--xml", relpath], in_directory, print_error)
 | 
| -  dom = ParseXML(output)
 | 
| +  dom = ParseXML(CaptureSVN(options, ["info", "--xml", relpath], in_directory))
 | 
|    result = {}
 | 
|    if dom:
 | 
|      def C(item, f):
 | 
| @@ -599,13 +592,13 @@
 | 
|    return result
 | 
|  
 | 
|  
 | 
| -def CaptureSVNHeadRevision(url):
 | 
| +def CaptureSVNHeadRevision(options, url):
 | 
|    """Get the head revision of a SVN repository.
 | 
|  
 | 
|    Returns:
 | 
|      Int head revision
 | 
|    """
 | 
| -  info = CaptureSVN(["info", "--xml", url], os.getcwd())
 | 
| +  info = CaptureSVN(options, ["info", "--xml", url], os.getcwd())
 | 
|    dom = xml.dom.minidom.parseString(info)
 | 
|    return int(dom.getElementsByTagName('entry')[0].getAttribute('revision'))
 | 
|  
 | 
| @@ -624,7 +617,7 @@
 | 
|              self.path)
 | 
|  
 | 
|  
 | 
| -def CaptureSVNStatus(path):
 | 
| +def CaptureSVNStatus(options, path):
 | 
|    """Runs 'svn status' on an existing path.
 | 
|  
 | 
|    Args:
 | 
| @@ -633,7 +626,7 @@
 | 
|    Returns:
 | 
|      An array of FileStatus corresponding to the emulated output of 'svn status'
 | 
|      version 1.5."""
 | 
| -  dom = ParseXML(CaptureSVN(["status", "--xml"], path))
 | 
| +  dom = ParseXML(CaptureSVN(options, ["status", "--xml"], path))
 | 
|    results = []
 | 
|    if dom:
 | 
|      # /status/target/entry/(wc-status|commit|author|date)
 | 
| @@ -735,13 +728,13 @@
 | 
|      """Cleanup working copy."""
 | 
|      command = ['cleanup']
 | 
|      command.extend(args)
 | 
| -    RunSVN(command, os.path.join(self._root_dir, self.relpath))
 | 
| +    RunSVN(options, command, os.path.join(self._root_dir, self.relpath))
 | 
|  
 | 
|    def diff(self, options, args, file_list):
 | 
|      # NOTE: This function does not currently modify file_list.
 | 
|      command = ['diff']
 | 
|      command.extend(args)
 | 
| -    RunSVN(command, os.path.join(self._root_dir, self.relpath))
 | 
| +    RunSVN(options, command, os.path.join(self._root_dir, self.relpath))
 | 
|  
 | 
|    def update(self, options, args, file_list):
 | 
|      """Runs SCM to update or transparently checkout the working copy.
 | 
| @@ -787,18 +780,19 @@
 | 
|        return
 | 
|  
 | 
|      # Get the existing scm url and the revision number of the current checkout.
 | 
| -    from_info = CaptureSVNInfo(os.path.join(self._root_dir, self.relpath, '.'),
 | 
| +    from_info = CaptureSVNInfo(options,
 | 
| +                               os.path.join(self._root_dir, self.relpath, '.'),
 | 
|                                 '.')
 | 
|  
 | 
|      if options.manually_grab_svn_rev:
 | 
|        # Retrieve the current HEAD version because svn is slow at null updates.
 | 
|        if not revision:
 | 
| -        from_info_live = CaptureSVNInfo(from_info['URL'], '.')
 | 
| +        from_info_live = CaptureSVNInfo(options, from_info['URL'], '.')
 | 
|          revision = int(from_info_live['Revision'])
 | 
|          rev_str = ' at %d' % revision
 | 
|  
 | 
|      if from_info['URL'] != components[0]:
 | 
| -      to_info = CaptureSVNInfo(url, '.')
 | 
| +      to_info = CaptureSVNInfo(options, url, '.')
 | 
|        if from_info['Repository Root'] != to_info['Repository Root']:
 | 
|          # We have different roots, so check if we can switch --relocate.
 | 
|          # Subversion only permits this if the repository UUIDs match.
 | 
| @@ -820,7 +814,7 @@
 | 
|                     from_info['Repository Root'],
 | 
|                     to_info['Repository Root'],
 | 
|                     self.relpath]
 | 
| -        RunSVN(command, self._root_dir)
 | 
| +        RunSVN(options, command, self._root_dir)
 | 
|          from_info['URL'] = from_info['URL'].replace(
 | 
|              from_info['Repository Root'],
 | 
|              to_info['Repository Root'])
 | 
| @@ -853,7 +847,7 @@
 | 
|        # Don't reuse the args.
 | 
|        return self.update(options, [], file_list)
 | 
|  
 | 
| -    files = CaptureSVNStatus(path)
 | 
| +    files = CaptureSVNStatus(options, path)
 | 
|      # Batch the command.
 | 
|      files_to_revert = []
 | 
|      for file in files:
 | 
| @@ -882,7 +876,7 @@
 | 
|        for p in files_to_revert:
 | 
|          # Some shell have issues with command lines too long.
 | 
|          if accumulated_length and accumulated_length + len(p) > 3072:
 | 
| -          RunSVN(command + accumulated_paths,
 | 
| +          RunSVN(options, command + accumulated_paths,
 | 
|                   os.path.join(self._root_dir, self.relpath))
 | 
|            accumulated_paths = []
 | 
|            accumulated_length = 0
 | 
| @@ -890,7 +884,7 @@
 | 
|            accumulated_paths.append(p)
 | 
|            accumulated_length += len(p)
 | 
|        if accumulated_paths:
 | 
| -        RunSVN(command + accumulated_paths,
 | 
| +        RunSVN(options, command + accumulated_paths,
 | 
|                 os.path.join(self._root_dir, self.relpath))
 | 
|  
 | 
|    def status(self, options, args, file_list):
 | 
| @@ -1331,7 +1325,7 @@
 | 
|        for entry in prev_entries:
 | 
|          e_dir = os.path.join(self._root_dir, entry)
 | 
|          if entry not in entries and self._options.path_exists(e_dir):
 | 
| -          if CaptureSVNStatus(e_dir):
 | 
| +          if CaptureSVNStatus(self._options, e_dir):
 | 
|              # There are modified files in this entry
 | 
|              entries[entry] = None  # Keep warning until removed.
 | 
|              print >> self._options.stdout, (
 | 
| @@ -1389,7 +1383,8 @@
 | 
|            return (original_url, int(revision_overrides[name]))
 | 
|          else:
 | 
|            # TODO(aharper): SVN/SCMWrapper cleanup (non-local commandset)
 | 
| -          return (original_url, CaptureSVNHeadRevision(original_url))
 | 
| +          return (original_url, CaptureSVNHeadRevision(self._options,
 | 
| +                                                       original_url))
 | 
|        else:
 | 
|          url_components = original_url.split("@")
 | 
|          if revision_overrides.has_key(name):
 | 
| @@ -1406,6 +1401,7 @@
 | 
|        entries[name] = "%s@%d" % (url, rev)
 | 
|        # TODO(aharper): SVN/SCMWrapper cleanup (non-local commandset)
 | 
|        entries_deps_content[name] = CaptureSVN(
 | 
| +                                     self._options,
 | 
|                                       ["cat",
 | 
|                                        "%s/%s@%d" % (url,
 | 
|                                                      self._options.deps_file,
 | 
| @@ -1433,6 +1429,7 @@
 | 
|          deps_parent_url_components = deps_parent_url.split("@")
 | 
|          # TODO(aharper): SVN/SCMWrapper cleanup (non-local commandset)
 | 
|          deps_parent_content = CaptureSVN(
 | 
| +                                self._options,
 | 
|                                  ["cat",
 | 
|                                   "%s/%s@%s" % (deps_parent_url_components[0],
 | 
|                                                 self._options.deps_file,
 | 
| 
 |