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>
This commit is contained in:
Stephanie Kim
2024-05-01 21:58:45 +00:00
committed by LUCI CQ
parent c0366630f7
commit 497e8167a4
2 changed files with 47 additions and 1 deletions

View File

@@ -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.

View File

@@ -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(