setdep: Add support for variables when setting CIPD vars.

Bug: 914712
Change-Id: I13db57af519bb254389bc6bd1f1f81ad1d497e42
Reviewed-on: https://chromium-review.googlesource.com/c/1377295
Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
diff --git a/gclient_eval.py b/gclient_eval.py
index 602190b..549ac08 100644
--- a/gclient_eval.py
+++ b/gclient_eval.py
@@ -22,6 +22,9 @@
   def __str__(self):
     return str({k: v[0] for k, v in self.data.iteritems()})
 
+  def __repr__(self):
+    return self.__str__()
+
   def __getitem__(self, key):
     return self.data[key][0]
 
@@ -712,6 +715,15 @@
   gclient_dict['vars'].SetNode(var_name, value, node)
 
 
+def _GetVarName(node):
+  if isinstance(node, ast.Call):
+    return node.args[0].s
+  elif node.s.endswith('}'):
+    last_brace = node.s.rfind('{')
+    return node.s[last_brace+1:-1]
+  return None
+
+
 def SetCIPD(gclient_dict, dep_name, package_name, new_version):
   if not isinstance(gclient_dict, _NodeDict) or gclient_dict.tokens is None:
     raise ValueError(
@@ -741,19 +753,20 @@
         "The deps entry for %s:%s has no formatting information." %
         (dep_name, package_name))
 
-  _UpdateAstString(tokens, node, new_version)
-  packages[0].SetNode('version', new_version, node)
+  if not isinstance(node, ast.Call) and not isinstance(node, ast.Str):
+    raise ValueError(
+        "Unsupported dependency revision format. Please file a bug to the "
+        "Infra>SDK component in monorail.")
+
+  var_name = _GetVarName(node)
+  if var_name is not None:
+    SetVar(gclient_dict, var_name, new_version)
+  else:
+    _UpdateAstString(tokens, node, new_version)
+    packages[0].SetNode('version', new_version, node)
 
 
 def SetRevision(gclient_dict, dep_name, new_revision):
-  def _GetVarName(node):
-    if isinstance(node, ast.Call):
-      return node.args[0].s
-    elif node.s.endswith('}'):
-      last_brace = node.s.rfind('{')
-      return node.s[last_brace+1:-1]
-    return None
-
   def _UpdateRevision(dep_dict, dep_key, new_revision):
     dep_node = dep_dict.GetNode(dep_key)
     if dep_node is None:
@@ -766,7 +779,8 @@
 
     if not isinstance(node, ast.Call) and not isinstance(node, ast.Str):
       raise ValueError(
-          "Unsupported dependency revision format. Please file a bug.")
+          "Unsupported dependency revision format. Please file a bug to the "
+          "Infra>SDK component in monorail.")
 
     var_name = _GetVarName(node)
     if var_name is not None: