Files
chromium_depot_tools/recipes/recipe_proto/turboci/update.py
Garrett Beaty d247f48cf9 Import depot_tools protos for TurboCI checks
This adds a script for updating the depot_tools protos and imports the
initial version. This provides the BotUpdateResults type for reporting
the revisions that were checked out by bot_update in its associated
source check.

Bug: b:443496677
Change-Id: I8b67dcf1419c48f2a684c59c265fbe1caa9f0d43
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/7227735
Reviewed-by: Robbie Iannucci <iannucci@google.com>
Commit-Queue: Robbie Iannucci <iannucci@google.com>
Auto-Submit: Garrett Beaty <gbeaty@google.com>
2025-12-04 11:21:22 -08:00

96 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env vpython3
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Automatically updates the .proto files in this directory."""
import json
import os
import re
import tarfile
from pathlib import Path
import requests
BASE_URL = 'https://chromium.googlesource.com/infra/turboci/proto'
LOG_URL = BASE_URL + '/+log/main/{}?format=JSON&n=1'
TAR_URL = BASE_URL + '/+archive/{}/{}.tar.gz'
REPO_PATH = 'turboci/data/chrome/depot_tools'
def print_commit_message(prev_commit: str, target: str):
print('{0:=^80}'.format(' START[Commit Message] '))
print('[TurboCI] Import latest protos.')
print()
changelog = f'{BASE_URL}/+log/{prev_commit}..{target}'
print(f'Changelog: {changelog}')
print()
clog = json.loads(requests.get(f'{changelog}?format=JSON').text[4:])
for commit in clog['log']:
first_line = commit['message'].split('\n')[0]
print(f'{commit["commit"][:8]} {first_line}')
print()
print('{0:=^80}'.format(' END[Commit Message] '))
def main():
"""Automatically updates the .proto files in this directory."""
this_dir = Path(__file__).parent
readme_path = this_dir / 'README.md'
with open(readme_path, 'r') as rmd:
prev_commit = re.match(r'.*/([a-f0-9]{40})/.*', rmd.read(),
re.MULTILINE | re.DOTALL).group(1)
to_remove = set()
for root, _, files in os.walk(this_dir):
for file in files:
if file.endswith('.proto'):
to_remove.add(Path(root) / file)
resp = requests.get(LOG_URL.format(REPO_PATH))
target = str(json.loads(resp.text[4:])['log'][0]['commit'])
if prev_commit == target:
print('Nothing to update.')
return
print(f'Updating to {target!r}')
base_dir = this_dir.parent / REPO_PATH
resp = requests.get(TAR_URL.format(target, REPO_PATH), stream=True).raw
with tarfile.open(mode='r', fileobj=resp) as tar:
for item in tar:
if not item.name.endswith('.proto'):
continue
if item.name.endswith('_test.proto'):
print(f'Skipping {item.name!r}')
continue
if 'internal' in item.name or 'googleapis' in item.name:
print(f'Skipping {item.name!r}')
continue
print(f'Extracting {item.name!r}')
tar.extract(item, path=base_dir)
to_remove.discard(base_dir / item.name)
if to_remove:
print('Removing stale proto')
for file in to_remove:
os.remove(file)
with open(readme_path, 'w') as rmd:
print('Generated by update.py. DO NOT EDIT.', file=rmd)
print('These protos were copied from:', file=rmd)
print(f'{BASE_URL}/+/{target}/{REPO_PATH}', file=rmd)
print_commit_message(prev_commit, target)
print('Done.')
if __name__ == '__main__':
main()