Use CheckCallAndFilterAndHeader for git commands.

This causes git commands to be completely silent (they don't even print
______ running 'git foo bar') if the git command itself is completely silent.
This mirrors the behavior of SVN commands. This is useful for commands like
'gclient diff', which should print no output at all if there is no diff.

R=szager@chromium.org, vadimsh@chromium.org

Review URL: https://codereview.chromium.org/218993009

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@260758 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient_scm.py b/gclient_scm.py
index fd098e2..0b10982 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -962,10 +962,8 @@
       env.setdefault('SSH_ASKPASS', 'true')
     else:
       kwargs.setdefault('print_stdout', True)
-    stdout = kwargs.get('stdout', sys.stdout)
-    stdout.write('\n________ running \'git %s\' in \'%s\'\n' % (
-                 ' '.join(args), kwargs['cwd']))
-    return gclient_utils.CheckCallAndFilter(['git'] + args, **kwargs)
+    cmd = ['git'] + args
+    return gclient_utils.CheckCallAndFilterAndHeader(cmd, **kwargs)
 
 
 class SVNWrapper(SCMWrapper):
diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py
index 4276998..68264fa 100755
--- a/tests/gclient_smoketest.py
+++ b/tests/gclient_smoketest.py
@@ -848,10 +848,7 @@
     # Test unversioned checkout.
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '1'],
-        ['running', ('running', self.root_dir + '/src'),
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running'])
+        ['running', 'running', 'running', 'running', 'running'])
     # TODO(maruel): http://crosbug.com/3582 hooks run even if not matching, must
     # add sync parsing to get the list of updated files.
     tree = self.mangle_git_tree(('repo_1@2', 'src'),
@@ -866,14 +863,11 @@
     os.remove(join(self.root_dir, 'src', 'git_hooked1'))
 
     # Test incremental versioned sync: sync backward.
-    diffdir = os.path.join(self.root_dir, 'src', 'repo2', 'repo_renamed')
     self.parseGclient(
         ['sync', '--jobs', '1', '--revision',
         'src@' + self.githash('repo_1', 1),
         '--deps', 'mac', '--delete_unversioned_trees'],
-        ['running', ('running', self.root_dir + '/src/repo2/repo3'),
-         'running', ('running', self.root_dir + '/src/repo4'),
-         ('running', diffdir), 'deleting'])
+        ['running', 'running', 'deleting'])
     tree = self.mangle_git_tree(('repo_1@1', 'src'),
                                 ('repo_2@2', 'src/repo2'),
                                 ('repo_3@1', 'src/repo2/repo3'),
@@ -881,12 +875,9 @@
     tree['src/git_hooked2'] = 'git_hooked2'
     self.assertTree(tree)
     # Test incremental sync: delete-unversioned_trees isn't there.
-    expect3 = ('running', os.path.join(self.root_dir, 'src', 'repo2', 'repo3'))
-    expect4 = ('running', os.path.join(self.root_dir, 'src', 'repo4'))
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '1'],
-        ['running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running', expect3, expect4])
+        ['running', 'running', 'running'])
     tree = self.mangle_git_tree(('repo_1@2', 'src'),
                                 ('repo_2@1', 'src/repo2'),
                                 ('repo_3@1', 'src/repo2/repo3'),
@@ -904,10 +895,7 @@
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '1',
          '--revision', 'invalid@' + self.githash('repo_1', 1)],
-        ['running', ('running', self.root_dir + '/src'),
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running'],
+        ['running', 'running', 'running', 'running', 'running'],
         'Please fix your script, having invalid --revision flags '
         'will soon considered an error.\n')
     tree = self.mangle_git_tree(('repo_1@2', 'src'),
@@ -925,10 +913,7 @@
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '1',
          '--revision', self.githash('repo_1', 1)],
-        ['running', ('running', self.root_dir + '/src'),
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo3'),
-         'running', ('running', self.root_dir + '/src/repo4')])
+        ['running', 'running', 'running', 'running'])
     tree = self.mangle_git_tree(('repo_1@1', 'src'),
                                 ('repo_2@2', 'src/repo2'),
                                 ('repo_3@1', 'src/repo2/repo3'),
@@ -943,10 +928,7 @@
     # Test unversioned checkout.
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '8'],
-        ['running', ('running', self.root_dir + '/src'),
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running'],
+        ['running', 'running', 'running', 'running', 'running'],
         untangle=True)
     # TODO(maruel): http://crosbug.com/3582 hooks run even if not matching, must
     # add sync parsing to get the list of updated files.
@@ -962,20 +944,11 @@
     os.remove(join(self.root_dir, 'src', 'git_hooked1'))
 
     # Test incremental versioned sync: sync backward.
-    expect3 = ('running',
-               os.path.join(self.root_dir, 'src', 'repo2', 'repo_renamed'))
     # Use --jobs 1 otherwise the order is not deterministic.
     self.parseGclient(
         ['sync', '--revision', 'src@' + self.githash('repo_1', 1),
           '--deps', 'mac', '--delete_unversioned_trees', '--jobs', '1'],
-        [
-          'running',
-          ('running', self.root_dir + '/src/repo2/repo3'),
-          'running',
-          ('running', self.root_dir + '/src/repo4'),
-          expect3,
-          'deleting',
-        ],
+        [ 'running', 'running', 'deleting'],
         untangle=True)
     tree = self.mangle_git_tree(('repo_1@1', 'src'),
                                 ('repo_2@2', 'src/repo2'),
@@ -984,12 +957,9 @@
     tree['src/git_hooked2'] = 'git_hooked2'
     self.assertTree(tree)
     # Test incremental sync: delete-unversioned_trees isn't there.
-    expect4 = os.path.join(self.root_dir, 'src', 'repo2', 'repo3')
-    expect5 = os.path.join(self.root_dir, 'src', 'repo4')
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '8'],
-        ['running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running', ('running', expect4), ('running', expect5)],
+        ['running', 'running', 'running'],
         untangle=True)
     tree = self.mangle_git_tree(('repo_1@2', 'src'),
                                 ('repo_2@1', 'src/repo2'),
@@ -1032,18 +1002,15 @@
     self.gclient(['config', self.git_base + 'repo_5', '--name', 'src'])
     expectation = [
         ('running', self.root_dir),                 # git clone repo_5
-        ('running', self.root_dir + '/src'),        # git checkout src
         ('running', self.root_dir),                 # pre-deps hook
         ('running', self.root_dir),                 # git clone repo_1
-        ('running', self.root_dir + '/src/repo1'),  # git checkout repo1
         ('running', self.root_dir),                 # git clone repo_1
-        ('running', self.root_dir + '/src/repo2'),  # git checkout repo2
     ]
     out = self.parseGclient(['sync', '--deps', 'mac', '--jobs=1',
                              '--revision', 'src@' + self.githash('repo_5', 2)],
                             expectation)
-    self.assertEquals(2, len(out[2]))
-    self.assertEquals('pre-deps hook', out[2][1])
+    self.assertEquals(2, len(out[1]))
+    self.assertEquals('pre-deps hook', out[1][1])
     tree = self.mangle_git_tree(('repo_5@2', 'src'),
                                 ('repo_1@2', 'src/repo1'),
                                 ('repo_2@1', 'src/repo2')
@@ -1088,7 +1055,6 @@
     self.gclient(['config', self.git_base + 'repo_5', '--name', 'src'])
     expectated_stdout = [
         ('running', self.root_dir),                 # git clone repo_5
-        ('running', self.root_dir + '/src'),        # git checkout src
         ('running', self.root_dir),                 # pre-deps hook
         ('running', self.root_dir),                 # pre-deps hook (fails)
     ]
@@ -1171,23 +1137,23 @@
     expected1 = ('running', os.path.join(self.root_dir, 'src'))
     expected2 = ('running', os.path.join(expected1[1], 'repo2'))
     expected3 = ('running', os.path.join(expected2[1], 'repo_renamed'))
-    out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'],
-                            [expected1, expected2, expected3])
+    out = self.parseGclient(['status', '--deps', 'mac', '--jobs', '1'], [])
     # TODO(maruel): http://crosbug.com/3584 It should output the unversioned
     # files.
-    self.assertEquals(3, len(out))
+    self.assertEquals(0, len(out))
 
     # Revert implies --force implies running hooks without looking at pattern
     # matching. For each expected path, 'git reset' and 'git clean' are run, so
     # there should be two results for each. The last two results should reflect
-    # writing git_hooked1 and git_hooked2.
+    # writing git_hooked1 and git_hooked2. There's only one result for the third
+    # because it is clean and has no output for 'git clean'.
     expected4 = ('running', self.root_dir)
     out = self.parseGclient(['revert', '--deps', 'mac', '--jobs', '1'],
                             [expected1, expected1,
                              expected2, expected2,
-                             expected3, expected3,
+                             expected3,
                              expected4, expected4])
-    self.assertEquals(8, len(out))
+    self.assertEquals(7, len(out))
     tree = self.mangle_git_tree(('repo_1@3', 'src'),
                                 ('repo_2@1', 'src/repo2'),
                                 ('repo_3@2', 'src/repo2/repo_renamed'))
@@ -1207,9 +1173,9 @@
     out = self.parseGclient(['revert', '--deps', 'mac', '--jobs', '1'],
                             [expected1, expected1,
                              expected2, expected2,
-                             expected3, expected3,
+                             expected3,
                              expected4, expected4])
-    self.assertEquals(8, len(out))
+    self.assertEquals(7, len(out))
     tree = self.mangle_git_tree(('repo_1@3', 'src'),
                                 ('repo_2@3', 'src/repo2'),
                                 ('repo_3@2', 'src/repo2/repo_renamed'))
@@ -1221,7 +1187,7 @@
     out = results[0].splitlines(False)
     # TODO(maruel): http://crosbug.com/3584 It should output the unversioned
     # files.
-    self.assertEquals(6, len(out))
+    self.assertEquals(0, len(out))
 
 class GClientSmokeBoth(GClientSmokeBase):
   def setUp(self):
@@ -1238,16 +1204,12 @@
         '{"name": "src-git",'
         '"url": "' + self.git_base + 'repo_1"}]'])
     self.parseGclient(['sync', '--deps', 'mac', '--jobs', '1'],
-        ['running',
-         'running', ('running', self.root_dir + '/src-git'),
-         'running',
+        ['running', 'running', 'running',
          # This is due to the way svn update is called for a single
          # file when File() is used in a DEPS file.
          ('running', self.root_dir + '/src/file/other'),
-         'running', 'running', 'running',
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo_renamed'),
-         'running', 'running', 'running'])
+         'running', 'running', 'running', 'running',
+         'running', 'running', 'running', 'running'])
     tree = self.mangle_git_tree(('repo_1@2', 'src-git'),
                                 ('repo_2@1', 'src/repo2'),
                                 ('repo_3@2', 'src/repo2/repo_renamed'))
@@ -1278,7 +1240,7 @@
     self.checkString('', stderr)
     self.assertEquals(0, returncode)
     results = self.splitBlock(stdout)
-    self.assertEquals(15, len(results))
+    self.assertEquals(12, len(results))
     tree = self.mangle_git_tree(('repo_1@2', 'src-git'),
                                 ('repo_2@1', 'src/repo2'),
                                 ('repo_3@2', 'src/repo2/repo_renamed'))
@@ -1305,12 +1267,8 @@
     self.parseGclient(
         ['sync', '--deps', 'mac', '--jobs', '1', '--revision', '1',
          '-r', 'src-git@' + self.githash('repo_1', 1)],
-        ['running',
-         'running', ('running', self.root_dir + '/src-git'),
-         'running', 'running', 'running',
-         'running', ('running', self.root_dir + '/src/repo2'),
-         'running', ('running', self.root_dir + '/src/repo2/repo3'),
-         'running', ('running', self.root_dir + '/src/repo4')],
+        ['running', 'running', 'running', 'running', 'running',
+         'running', 'running', 'running'],
         expected_stderr=
             'You must specify the full solution name like --revision src@1\n'
             'when you have multiple solutions setup in your .gclient file.\n'