Explorar o código

Fix ParseGitSubmodules for git v2.34

The `--format` option for `git ls-tree` was introduced in git v2.36 and
hence gclient breaks for lower git versions.

Change-Id: I02750904aa78bb5fd5f3f57dc2ad42e355fa4a42
Bug: 1471241
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4765682
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
Commit-Queue: Aravind Vasudevan <aravindvasudev@google.com>
Aravind Vasudevan %!s(int64=2) %!d(string=hai) anos
pai
achega
e29d5e9ad5
Modificáronse 2 ficheiros con 35 adicións e 20 borrados
  1. 5 8
      gclient.py
  2. 30 12
      tests/gclient_test.py

+ 5 - 8
gclient.py

@@ -942,19 +942,16 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
       return {}
 
     # Get submodule commit hashes
-    #  Output Format: `<mode> <commit_hash> <path>`.
-    result = subprocess2.check_output([
-        'git', 'ls-tree', '-r', 'HEAD', '--format',
-        '%(objectmode) %(objectname) %(path)'
-    ],
+    #  Output Format: `<mode> SP <type> SP <object> TAB <file>`.
+    result = subprocess2.check_output(['git', 'ls-tree', '-r', 'HEAD'],
                                       cwd=cwd).decode('utf-8')
 
     commit_hashes = {}
     for r in result.splitlines():
-      # ['<mode>', '<commit_hash>', '<path>'].
-      record = r.strip().split()
+      # ['<mode>', '<type>', '<commit_hash>', '<path>'].
+      record = r.strip().split(maxsplit=3)  # path can contain spaces.
       if record[0] == '160000':  # Only add gitlinks
-        commit_hashes[record[2]] = record[1]
+        commit_hashes[record[3]] = record[2]
 
     # Get .gitmodules fields
     gitmodules_entries = subprocess2.check_output(

+ 30 - 12
tests/gclient_test.py

@@ -1432,11 +1432,12 @@ class GclientTest(trial_dir.TestCase):
     }]
     write('.gclient', 'solutions = %s' % repr(solutions))
 
-    ls_tree = """160000 be8c5114d606692dc783b60cf256690b62fbad17 foo/bar
-    123456 daf2de9caad4a70e6bb1047a6b50c412066f68b1 README.txt
-    160000 3ad3b564f8ae456f286446d091709f5a09fa4a93 aaaaaa
-    160000 956df937508b65b5e72a4cf02696255be3631b78 a.a.a/a
-    160000 b9f77763f0fab67eeeb6371492166567a8b7a3d2 a_b/c"""
+    ls_tree = """160000 commit be8c5114d606692dc783b60cf256690b62fbad17\tfoo/bar
+    100644 blob daf2de9caad4a70e6bb1047a6b50c412066f68b1\tREADME.txt
+    160000 commit 3ad3b564f8ae456f286446d091709f5a09fa4a93\taaaaaa
+    160000 commit 956df937508b65b5e72a4cf02696255be3631b78\ta.a.a/a
+    160000 commit b9f77763f0fab67eeeb6371492166567a8b7a3d2\ta_b/c
+    160000 commit b9f77763f0fab67eeeb6371492166567a8b7a3d2\ta b/c"""
 
     git_config = """submodule.foo/bar.path=foo/bar
     submodule.foo/bar.url=http://example.com/foo/bar
@@ -1446,7 +1447,9 @@ class GclientTest(trial_dir.TestCase):
     submodule.a.a.a/a.path=a.a.a/a
     submodule.a.a.a/a.url=http://example.com/a.a.a/a
     submodule.a_b/c.path=a_b/c
-    submodule.a_b/c.url=http://example.com/a_b/c"""
+    submodule.a_b/c.url=http://example.com/a_b/c
+    submodule.a b/c.path=a b/c
+    submodule.a b/c.url=http://example.com/a%20b/c"""
 
     os_path_isfile_mock = mock.MagicMock(return_value=True)
     subprocess2_check_output_mock = mock.MagicMock(
@@ -1487,6 +1490,12 @@ class GclientTest(trial_dir.TestCase):
                   'git',
                   'url': ('http://example.com/a_b/c@' +
                           'b9f77763f0fab67eeeb6371492166567a8b7a3d2')
+              },
+              'a b/c': {
+                  'dep_type':
+                  'git',
+                  'url': ('http://example.com/a%20b/c@' +
+                          'b9f77763f0fab67eeeb6371492166567a8b7a3d2'),
               }
           })
 
@@ -1500,11 +1509,12 @@ class GclientTest(trial_dir.TestCase):
     }]
     write('.gclient', 'solutions = %s' % repr(solutions))
 
-    ls_tree = """160000 be8c5114d606692dc783b60cf256690b62fbad17 foo/bar
-    123456 daf2de9caad4a70e6bb1047a6b50c412066f68b1 README.txt
-    160000 3ad3b564f8ae456f286446d091709f5a09fa4a93 aaaaaa
-    160000 956df937508b65b5e72a4cf02696255be3631b78 a.a.a/a
-    160000 b9f77763f0fab67eeeb6371492166567a8b7a3d2 a_b/c"""
+    ls_tree = """160000 commit be8c5114d606692dc783b60cf256690b62fbad17\tfoo/bar
+    100644 blob daf2de9caad4a70e6bb1047a6b50c412066f68b1\tREADME.txt
+    160000 commit 3ad3b564f8ae456f286446d091709f5a09fa4a93\taaaaaa
+    160000 commit 956df937508b65b5e72a4cf02696255be3631b78\ta.a.a/a
+    160000 commit b9f77763f0fab67eeeb6371492166567a8b7a3d2\ta_b/c
+    160000 commit b9f77763f0fab67eeeb6371492166567a8b7a3d2\ta b/c"""
 
     git_config = """submodule.foo/bar.path=foo/bar
     submodule.foo/bar.url=http://example.com/foo/bar
@@ -1514,7 +1524,9 @@ class GclientTest(trial_dir.TestCase):
     submodule.a.a.a/a.path=a.a.a/a
     submodule.a.a.a/a.url=http://example.com/a.a.a/a
     submodule.a_b/c.path=a_b/c
-    submodule.a_b/c.url=http://example.com/a_b/c"""
+    submodule.a_b/c.url=http://example.com/a_b/c
+    submodule.a b/c.path=a b/c
+    submodule.a b/c.url=http://example.com/a%20b/c"""
 
     os_path_isfile_mock = mock.MagicMock(return_value=True)
     subprocess2_check_output_mock = mock.MagicMock(
@@ -1554,6 +1566,12 @@ class GclientTest(trial_dir.TestCase):
                   'git',
                   'url': ('http://example.com/a_b/c@' +
                           'b9f77763f0fab67eeeb6371492166567a8b7a3d2')
+              },
+              'foobar/a b/c': {
+                  'dep_type':
+                  'git',
+                  'url': ('http://example.com/a%20b/c@' +
+                          'b9f77763f0fab67eeeb6371492166567a8b7a3d2'),
               }
           })