diff --git a/gclient_eval.py b/gclient_eval.py index 93fd2a8b5..aac3535f0 100644 --- a/gclient_eval.py +++ b/gclient_eval.py @@ -666,7 +666,13 @@ def SetRevision(gclient_dict, dep_name, new_revision): SetVar(gclient_dict, var_name, new_revision) else: if '@' in node.s: + # '@' is part of the last string, which we want to modify. Discard + # whatever was after the '@' and put the new revision in its place. new_revision = node.s.split('@')[0] + '@' + new_revision + elif '@' not in dep_dict[dep_key]: + # '@' is not part of the URL at all. This mean the dependency is + # unpinned and we should pin it. + new_revision = node.s + '@' + new_revision _UpdateAstString(tokens, node, new_revision) dep_dict.SetNode(dep_key, new_revision, node) diff --git a/tests/gclient_eval_unittest.py b/tests/gclient_eval_unittest.py index 9316e3502..c7896b362 100755 --- a/tests/gclient_eval_unittest.py +++ b/tests/gclient_eval_unittest.py @@ -504,6 +504,20 @@ class SetRevisionTest(unittest.TestCase): ] self.assert_changes_revision(before, after) + def test_pins_revision(self): + before = [ + 'deps = {', + ' "src/dep": "https://example.com/dep.git",', + '}', + ] + after = [ + 'deps = {', + ' "src/dep": "https://example.com/dep.git@deadfeed",', + '}', + ] + self.assert_changes_revision(before, after) + + def test_preserves_formatting(self): before = [ 'vars = {',