blob: 03d2e7627bf441008c47a8654933d3930fe5ac6e [file] [edit]
#!/usr/bin/env python3
# Copyright (C) 2026 The Android Open Source Project
#
# 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
#
# http://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.
"""Assembles the assets directory that conditions.json refers to as {assets}.
The things under test are deliberately not in the source tree in loadable
form (the skill needs bundling, the binary needs building), so this script
gathers them once into a directory outside the checkout:
<assets>/skill-published/plugins/perfetto the skill from the ai-agents
branch (what users install)
<assets>/skill-local/plugins/perfetto this checkout's ai/skills,
bundled by build_ai_agents.py
<assets>/bin/trace_processor a trace_processor_shell binary,
exposed under both names
Usage:
ai/evals/setup_assets.py --out /path/to/assets \\
--tp-binary out/mac_release/trace_processor_shell
export EVAL_ASSETS=/path/to/assets
Pass --published-ref to bundle a different published ref (default:
origin/ai-agents; fetch it first).
"""
import argparse
import os
import shutil
import subprocess
import sys
from pathlib import Path
REPO = Path(__file__).resolve().parent.parent.parent
def _run(cmd, **kw):
print('+', ' '.join(str(c) for c in cmd), flush=True)
subprocess.run(cmd, check=True, **kw)
def main() -> int:
ap = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument('--out', required=True, help='assets directory to create')
ap.add_argument(
'--tp-binary',
help='trace_processor_shell to expose at <assets>/bin (skip to omit)')
ap.add_argument('--published-ref', default='origin/ai-agents')
args = ap.parse_args()
out = Path(args.out).resolve()
if str(out).startswith(str(REPO) + os.sep):
sys.exit('assets must live outside the checkout: agents are sandboxed '
'away from the repo and would not be able to read them')
out.mkdir(parents=True, exist_ok=True)
# Published skill: the tree users get from the marketplace.
published = out / 'skill-published'
shutil.rmtree(published, ignore_errors=True)
published.mkdir()
archive = subprocess.run([
'git', '-C',
str(REPO), 'archive', args.published_ref, 'plugins/perfetto'
],
check=True,
capture_output=True).stdout
subprocess.run(['tar', '-x', '-C', str(published)], input=archive, check=True)
# Local skill: this checkout's ai/skills, assembled the way the release
# pipeline does it.
local = out / 'skill-local'
_run([
sys.executable,
str(REPO / 'tools' / 'release' / 'build_ai_agents.py'), '--output',
str(local)
])
if args.tp_binary:
bin_dir = out / 'bin'
bin_dir.mkdir(exist_ok=True)
dst = bin_dir / 'trace_processor'
shutil.copy2(args.tp_binary, dst)
dst.chmod(0o755)
alias = bin_dir / 'trace_processor_shell'
if alias.exists() or alias.is_symlink():
alias.unlink()
alias.symlink_to('trace_processor')
_run([str(dst), '--version'])
print(f'\nassets ready in {out}\nexport EVAL_ASSETS={out}')
return 0
if __name__ == '__main__':
sys.exit(main())