diff --git a/gclient_eval.py b/gclient_eval.py index 7528c266b3..f682d354c9 100644 --- a/gclient_eval.py +++ b/gclient_eval.py @@ -759,6 +759,14 @@ def SetRevision(gclient_dict, dep_name, new_revision): if isinstance(node, ast.BinOp): node = node.right + token = tokens[node.lineno, node.col_offset][1][1:-1] + if isinstance(node, ast.Str) and token != node.s: + raise ValueError( + 'Can\'t update value for %s. Multiline strings and implicitly ' + 'concatenated strings are not supported.\n' + 'Consider reformatting the DEPS file.' % dep_key) + + if not isinstance(node, ast.Call) and not isinstance(node, ast.Str): raise ValueError( "Unsupported dependency revision format. Please file a bug to the " diff --git a/roll_dep.py b/roll_dep.py index 4b35c95d6f..3179d3e34a 100755 --- a/roll_dep.py +++ b/roll_dep.py @@ -265,6 +265,8 @@ def main(): except Error as e: sys.stderr.write('error: %s\n' % e) return 2 if isinstance(e, AlreadyRolledError) else 1 + except subprocess.CalledProcessError: + return 1 print('') if not reviewers: diff --git a/tests/gclient_eval_unittest.py b/tests/gclient_eval_unittest.py index d5b499fb95..a4d38d88b2 100755 --- a/tests/gclient_eval_unittest.py +++ b/tests/gclient_eval_unittest.py @@ -663,6 +663,37 @@ class RevisionTest(unittest.TestCase): ] self.assert_gets_and_sets_revision(before, after) + def test_revision_multiline_strings(self): + deps = [ + 'deps = {', + ' "src/dep": "https://example.com/dep.git@"', + ' "deadbeef",', + '}', + ] + with self.assertRaises(ValueError) as e: + local_scope = gclient_eval.Exec('\n'.join(deps)) + gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed') + self.assertEqual( + 'Can\'t update value for src/dep. Multiline strings and implicitly ' + 'concatenated strings are not supported.\n' + 'Consider reformatting the DEPS file.', + str(e.exception)) + + def test_revision_implicitly_concatenated_strings(self): + deps = [ + 'deps = {', + ' "src/dep": "https://example.com" + "/dep.git@" "deadbeef",', + '}', + ] + with self.assertRaises(ValueError) as e: + local_scope = gclient_eval.Exec('\n'.join(deps)) + gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed') + self.assertEqual( + 'Can\'t update value for src/dep. Multiline strings and implicitly ' + 'concatenated strings are not supported.\n' + 'Consider reformatting the DEPS file.', + str(e.exception)) + def test_revision_inside_dict(self): before = [ 'deps = {',