diff --git a/scm.py b/scm.py index 7cbf0ea35..1793b400f 100644 --- a/scm.py +++ b/scm.py @@ -1113,9 +1113,13 @@ class GIT(object): """ if not os.path.exists(os.path.join(repo_root, '.gitmodules')): return [] - config_output = GIT.Capture( - ['config', '--file', '.gitmodules', '--get-regexp', 'path'], - cwd=repo_root) + try: + config_output = GIT.Capture( + ['config', '--file', '.gitmodules', '--get-regexp', 'path'], + cwd=repo_root) + except subprocess2.CalledProcessError: + # Git exits with 1 if no config matches are found. + return [] assert isinstance(config_output, str) return [ line.split()[-1].replace('/', os.path.sep) diff --git a/tests/scm_unittest.py b/tests/scm_unittest.py index df8633561..738027bd0 100755 --- a/tests/scm_unittest.py +++ b/tests/scm_unittest.py @@ -149,6 +149,15 @@ class GitWrapperTestCase(unittest.TestCase): def testListSubmodules_missing(self): self.assertEqual(scm.GIT.ListSubmodules('root'), []) + @mock.patch('os.path.exists', return_value=True) + @mock.patch('scm.GIT.Capture') + def testListSubmodules_empty(self, mockCapture, *_mock): + mockCapture.side_effect = [ + subprocess2.CalledProcessError(1, '', '', '', ''), + ] + self.assertEqual(scm.GIT.ListSubmodules('root'), []) + + class RealGitTest(fake_repos.FakeReposTestBase): def setUp(self):