blob: 96bfa72dfd45e182c03dd0ada7f22eeac98a0fc5 [file]
# Copyright 2026 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Shared utilities for spanification script configurations."""
import functools
import os
import pathlib
import shutil
import subprocess
import sys
@functools.cache
def scratch_dir():
"""Returns the path to the scratch directory as a pathlib.Path."""
if env_dir := os.environ.get("SPANIFY_SCRATCH_DIR"):
path = pathlib.Path(env_dir)
else:
path = pathlib.Path.cwd() / "spanify_scratch"
print(f"No SPANIFY_SCRATCH_DIR set falling back to {path}")
path.mkdir(parents=True, exist_ok=True)
return path
def clear_scratch_dir():
"""Clears the contents of the scratch directory without deleting the directory itself."""
for item in scratch_dir().iterdir():
if item.is_dir():
shutil.rmtree(item, ignore_errors=True)
else:
item.unlink(missing_ok=True)
def apply_collected_edits(replacements, platform="linux"):
"""
Numerical offset descending order sorting procedure.
Outputs processed data piped directly to tool: apply_edits.py.
"""
# The output contains lines with the format:
# r:::{0}:::{1}:::{2}:::{3}
# We must sort by {1} numerically in descending order to avoid conflict when
# applying replacements.
# {0} is the file path
# {1} is the file offset
# {2} is the replacement length
# {3} is the replacement text
sorted_replacements = []
for r in replacements:
r = r.strip()
if not r:
continue
parts = r.split(':::')
try:
offset = int(parts[2])
sorted_replacements.append((offset, r))
except (ValueError, IndexError):
print("Error: Dropping invalid replacement", file=sys.stderr)
continue
sorted_replacements.sort(key=lambda x: x[0], reverse=True)
input_text = '\n'.join([x[1] for x in sorted_replacements]) + '\n'
apply_edits_script = "tools/clang/scripts/apply_edits.py"
subprocess.run(
[sys.executable, str(apply_edits_script), "-p", f"./out/{platform}"],
input=input_text,
text=True,
check=True,
)