mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 18:51:29 +00:00
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>
96 lines
2.7 KiB
Python
Executable File
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()
|