| #!/usr/bin/env python3 |
| # Copyright 2025 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| from __future__ import annotations |
| |
| import json |
| import re |
| import tarfile |
| from pathlib import Path |
| |
| import requests |
| |
| ORIGIN_URL = 'https://pigweed.googlesource.com/pigweed/pigweed' |
| LOG_URL = f'{ORIGIN_URL}/+log/main/{{}}?format=JSON&n=1' |
| TAR_URL = f'{ORIGIN_URL}/+archive/{{}}/{{}}.tar.gz' |
| |
| PROTO_PATHS = [ |
| 'pw_build/proto', |
| ] |
| |
| |
| def main(): |
| base_dir = Path(__file__).parent |
| |
| for proto_path in PROTO_PATHS: |
| proto_dir = base_dir / proto_path |
| proto_dir.mkdir(parents=True, exist_ok=True) |
| |
| to_remove: set[Path] = set() |
| for root, _, files in proto_dir.walk(): |
| for file in files: |
| if file.endswith('.proto'): |
| to_remove.add(root / file) |
| |
| resp = requests.get(LOG_URL.format(proto_path)) |
| commit = str(json.loads(resp.text[4:])['log'][0]['commit']) |
| print('Updating', proto_path, 'to', commit) |
| |
| resp = requests.get(TAR_URL.format(commit, proto_path), stream=True).raw |
| with tarfile.open(mode='r|*', fileobj=resp) as tar: |
| for item in tar: |
| if item.name.endswith('.proto'): |
| print('Extracting', item.name) |
| tar.extract(item, path=proto_dir, filter='data') |
| item_path = proto_dir / item.name |
| to_remove.discard(item_path) |
| |
| contents = item_path.read_text() |
| contents = re.sub( |
| r'^import "pw_', |
| 'import "pigweed/pw_', |
| contents, |
| flags=re.MULTILINE, |
| ) |
| item_path.write_text(contents) |
| |
| if to_remove: |
| print('Removing stale protos') |
| for rem in to_remove: |
| rem.unlink() |
| |
| print('Done') |
| |
| |
| if __name__ == '__main__': |
| main() |