Explorar o código

Implement setdeps for GCS

The number of revision objects must match the number of current objects
for a given path. The comma separated values for a revision object
must also be in the order of object_name, sha256sum, size_bytes, and
generation.

Example usage:
gclient setdep --revision=src/third_party/js_code_coverage@myobjectname,deadbeef,1223455,9438393984/myobjectname2,deadbefeaef,1223455,9438393984

Resulting diff:
diff --git a/DEPS b/DEPS
index b40bca8cdd89d..c2186185c1db5 100644
--- a/DEPS
+++ b/DEPS
@@ -553,10 +553,10 @@ deps = {
       'bucket': 'chromium-nodejs',
       'objects': [
           {
-              'object_name': 'js_code_coverage/d538975c93eefc7bafd599b50f867e90c1ef17f3',
-              'sha256sum': '646bb00ced0a930b2eb1e4dbcfac18ebbb8f889bb80599e0254d9d6505427914',
-              'size_bytes': 1469185,
-              'generation': 1657780123604338,
+              'object_name': 'myobjectname',
+              'sha256sum': 'deadbeef',
+              'size_bytes': 1223455,
+              'generation': 9438393984,
           },
       ],
   },

Bug: b/324418194
Change-Id: Ibd824f7b51fa88f732c7197e2cc663b58de7479e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/5503101
Commit-Queue: Stephanie Kim <kimstephanie@google.com>
Reviewed-by: Joanna Wang <jojwang@chromium.org>
Stephanie Kim hai 1 ano
pai
achega
497e8167a4
Modificáronse 2 ficheiros con 47 adicións e 1 borrados
  1. 24 1
      gclient.py
  2. 23 0
      gclient_eval.py

+ 24 - 1
gclient.py

@@ -4103,7 +4103,13 @@ def CMDsetdep(parser, args):
                       'reference (e.g. src/dep@deadbeef). If it is a CIPD '
                       'reference (e.g. src/dep@deadbeef). If it is a CIPD '
                       'dependency, dep must be of the form path:package and '
                       'dependency, dep must be of the form path:package and '
                       'rev must be the package version '
                       'rev must be the package version '
-                      '(e.g. src/pkg:chromium/pkg@2.1-cr0).')
+                      '(e.g. src/pkg:chromium/pkg@2.1-cr0). '
+                      'If it is a GCS dependency, dep must be of the form '
+                      'path@object_name,sha256sum,size_bytes,generation?'
+                      'object_name2,sha256sum2,size_bytes2,generation2?... '
+                      'The number of revision objects for a given path must '
+                      'match the current number of revision objects for that '
+                      'path.')
     parser.add_option(
     parser.add_option(
         '--deps-file',
         '--deps-file',
         default='DEPS',
         default='DEPS',
@@ -4171,6 +4177,23 @@ def CMDsetdep(parser, args):
                     'Wrong CIPD format: %s:%s should be of the form path:pkg@version.'
                     'Wrong CIPD format: %s:%s should be of the form path:pkg@version.'
                     % (name, package))
                     % (name, package))
             gclient_eval.SetCIPD(local_scope, name, package, value)
             gclient_eval.SetCIPD(local_scope, name, package, value)
+        elif ',' in value:
+            objects = []
+            raw_objects = value.split('?')
+            for o in raw_objects:
+                object_info = o.split(',')
+                if len(object_info) != 4:
+                    parser.error(
+                        'All 4 values are required in the revision object: '
+                        'object_name, sha256sum, size_bytes, and generation.')
+                object_dict = {
+                    'object_name': object_info[0],
+                    'sha256sum': object_info[1],
+                    'size_bytes': object_info[2],
+                    'generation': object_info[3],
+                }
+                objects.append(object_dict)
+            gclient_eval.SetGCS(local_scope, name, objects)
         else:
         else:
             # Update DEPS only when `git_dependencies` == DEPS or SYNC.
             # Update DEPS only when `git_dependencies` == DEPS or SYNC.
             # git_dependencies is defaulted to DEPS when not set.
             # git_dependencies is defaulted to DEPS when not set.

+ 23 - 0
gclient_eval.py

@@ -787,6 +787,29 @@ def _GetVarName(node):
     return None
     return None
 
 
 
 
+def SetGCS(gclient_dict, dep_name, new_objects):
+    if not isinstance(gclient_dict, _NodeDict) or gclient_dict.tokens is None:
+        raise ValueError(
+            "Can't use SetGCS for the given gclient dict. It contains no "
+            "formatting information.")
+    tokens = gclient_dict.tokens
+
+    if 'deps' not in gclient_dict or dep_name not in gclient_dict['deps']:
+        raise KeyError("Could not find any dependency called %s." % dep_name)
+
+    node = gclient_dict['deps'][dep_name]
+    objects_node = node.GetNode('objects')
+    if len(objects_node.elts) != len(new_objects):
+        raise ValueError("Number of revision objects must match the current "
+                         "number of objects.")
+
+    for index, object_node in enumerate(objects_node.elts):
+        for key, value in zip(object_node.keys, object_node.values):
+            _UpdateAstString(tokens, value, new_objects[index][key.s])
+
+    node.SetNode('objects', new_objects, objects_node)
+
+
 def SetCIPD(gclient_dict, dep_name, package_name, new_version):
 def SetCIPD(gclient_dict, dep_name, package_name, new_version):
     if not isinstance(gclient_dict, _NodeDict) or gclient_dict.tokens is None:
     if not isinstance(gclient_dict, _NodeDict) or gclient_dict.tokens is None:
         raise ValueError(
         raise ValueError(