Split _Run() in two to make redirection simpler in a later change.

Simplify GitWrapper._Run() and move logging at the right place.

TEST=none
BUG=54084

Review URL: http://codereview.chromium.org/3358015

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@58694 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient_scm.py b/gclient_scm.py
index f92e4f8..b6ee8a0 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -127,8 +127,8 @@
     """
 
   def diff(self, options, args, file_list):
-    merge_base = self._Run(['merge-base', 'HEAD', 'origin'])
-    self._Run(['diff', merge_base], redirect_stdout=False)
+    merge_base = self._Capture(['merge-base', 'HEAD', 'origin'])
+    self._Run(['diff', merge_base])
 
   def export(self, options, args, file_list):
     """Export a clean directory tree into the given path.
@@ -140,8 +140,7 @@
     export_path = os.path.abspath(os.path.join(args[0], self.relpath))
     if not os.path.exists(export_path):
       os.makedirs(export_path)
-    self._Run(['checkout-index', '-a', '--prefix=%s/' % export_path],
-              redirect_stdout=False)
+    self._Run(['checkout-index', '-a', '--prefix=%s/' % export_path])
 
   def pack(self, options, args, file_list):
     """Generates a patch file which can be applied to the root of the
@@ -150,7 +149,7 @@
     The patch file is generated from a diff of the merge base of HEAD and
     its upstream branch.
     """
-    merge_base = self._Run(['merge-base', 'HEAD', 'origin'])
+    merge_base = self._Capture(['merge-base', 'HEAD', 'origin'])
     gclient_utils.CheckCallAndFilter(
         ['git', 'diff', merge_base],
         cwd=self.checkout_path,
@@ -202,7 +201,7 @@
 
     if not os.path.exists(self.checkout_path):
       self._Clone(revision, url, options)
-      files = self._Run(['ls-files']).split()
+      files = self._Capture(['ls-files']).split()
       file_list.extend([os.path.join(self.checkout_path, f) for f in files])
       if not verbose:
         # Make the output a little prettier. It's nice to have some whitespace
@@ -283,13 +282,13 @@
 
     # This is a big hammer, debatable if it should even be here...
     if options.force or options.reset:
-      self._Run(['reset', '--hard', 'HEAD'], redirect_stdout=False)
+      self._Run(['reset', '--hard', 'HEAD'])
 
     if current_type == 'detached':
       # case 0
       self._CheckClean(rev_str)
       self._CheckDetachedHead(rev_str, options)
-      self._Run(['checkout', '--quiet', '%s^0' % revision])
+      self._Capture(['checkout', '--quiet', '%s^0' % revision])
       if not printed_path:
         options.stdout.write('\n_____ %s%s\n' % (self.relpath, rev_str))
     elif current_type == 'hash':
@@ -327,7 +326,7 @@
       raise gclient_utils.Error(switch_error)
     else:
       # case 3 - the default case
-      files = self._Run(['diff', upstream_branch, '--name-only']).split()
+      files = self._Capture(['diff', upstream_branch, '--name-only']).split()
       if verbose:
         options.stdout.write('Trying fast-forward merge to branch : %s\n' %
             upstream_branch)
@@ -426,13 +425,13 @@
     if deps_revision.startswith('refs/heads/'):
       deps_revision = deps_revision.replace('refs/heads/', 'origin/')
 
-    files = self._Run(['diff', deps_revision, '--name-only']).split()
-    self._Run(['reset', '--hard', deps_revision], redirect_stdout=False)
+    files = self._Capture(['diff', deps_revision, '--name-only']).split()
+    self._Run(['reset', '--hard', deps_revision])
     file_list.extend([os.path.join(self.checkout_path, f) for f in files])
 
   def revinfo(self, options, args, file_list):
-    """Display revision"""
-    return self._Run(['rev-parse', 'HEAD'])
+    """Returns revision"""
+    return self._Capture(['rev-parse', 'HEAD'])
 
   def runhooks(self, options, args, file_list):
     self.status(options, args, file_list)
@@ -444,9 +443,9 @@
           ('\n________ couldn\'t run status in %s:\nThe directory '
            'does not exist.\n') % self.checkout_path)
     else:
-      merge_base = self._Run(['merge-base', 'HEAD', 'origin'])
-      self._Run(['diff', '--name-status', merge_base], redirect_stdout=False)
-      files = self._Run(['diff', '--name-only', merge_base]).split()
+      merge_base = self._Capture(['merge-base', 'HEAD', 'origin'])
+      self._Run(['diff', '--name-status', merge_base])
+      files = self._Capture(['diff', '--name-only', merge_base]).split()
       file_list.extend([os.path.join(self.checkout_path, f) for f in files])
 
   def FullUrlForRelativeUrl(self, url):
@@ -481,7 +480,7 @@
 
     for _ in range(3):
       try:
-        self._Run(clone_cmd, cwd=self._root_dir, redirect_stdout=False)
+        self._Run(clone_cmd, cwd=self._root_dir)
         break
       except gclient_utils.Error, e:
         # TODO(maruel): Hackish, should be fixed by moving _Run() to
@@ -498,7 +497,7 @@
 
     if detach_head:
       # Squelch git's very verbose detached HEAD warning and use our own
-      self._Run(['checkout', '--quiet', '%s^0' % revision])
+      self._Capture(['checkout', '--quiet', '%s^0' % revision])
       options.stdout.write(
         ('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'
@@ -508,7 +507,7 @@
   def _AttemptRebase(self, upstream, files, options, newbase=None,
                      branch=None, printed_path=False):
     """Attempt to rebase onto either upstream or, if specified, newbase."""
-    files.extend(self._Run(['diff', upstream, '--name-only']).split())
+    files.extend(self._Capture(['diff', upstream, '--name-only']).split())
     revision = upstream
     if newbase:
       revision = newbase
@@ -545,7 +544,7 @@
                                         "work in your current branch!"
                                         " (y)es / (q)uit / (s)how : "))
           if re.match(r'yes|y', rebase_action, re.I):
-            self._Run(['reset', '--hard', 'HEAD'], redirect_stdout=False)
+            self._Run(['reset', '--hard', 'HEAD'])
             # Should this be recursive?
             rebase_output, rebase_err = scm.GIT.Capture(rebase_cmd,
                                                         self.checkout_path)
@@ -638,41 +637,31 @@
                                   '\tSee man git-rebase for details.\n'
                                    % (self.relpath, rev_str))
       # Let's just save off the commit so we can proceed.
-      name = "saved-by-gclient-" + self._Run(["rev-parse", "--short", "HEAD"])
-      self._Run(["branch", name])
+      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' %
           name)
 
   def _GetCurrentBranch(self):
     # Returns name of current branch or None for detached HEAD
-    branch = self._Run(['rev-parse', '--abbrev-ref=strict', 'HEAD'])
+    branch = self._Capture(['rev-parse', '--abbrev-ref=strict', 'HEAD'])
     if branch == 'HEAD':
       return None
     return branch
 
-  def _Run(self, args, cwd=None, redirect_stdout=True):
-    # TODO(maruel): Merge with Capture or better gclient_utils.CheckCall().
-    if cwd is None:
-      cwd = self.checkout_path
-    stdout = None
-    if redirect_stdout:
-      stdout = subprocess.PIPE
-    if cwd == None:
-      cwd = self.checkout_path
-    cmd = ['git'] + args
-    logging.debug(cmd)
+  def _Capture(self, args):
+    return gclient_utils.CheckCall(['git'] + args,
+                                   cwd=self.checkout_path)[0].strip()
+
+  def _Run(self, args, **kwargs):
+    kwargs.setdefault('cwd', self.checkout_path)
     try:
-      sp = gclient_utils.Popen(cmd, cwd=cwd, stdout=stdout)
-      output = sp.communicate()[0]
+      gclient_utils.Popen(['git'] + args, **kwargs).communicate()
     except OSError:
       raise gclient_utils.Error("git command '%s' failed to run." %
               ' '.join(cmd) + "\nCheck that you have git installed.")
-    if sp.returncode:
-      raise gclient_utils.Error('git command %s returned %d' %
-                                (args[0], sp.returncode))
-    if output is not None:
-      return output.strip()
 
 
 class SVNWrapper(SCMWrapper):