Files
swift-mirror/utils/apply-fixit-edits.py
Doug Gregor 528d642fc5 Make the Fix-It JSON writer produce proper JSON
While here, also sort and deduplicate output entries, and stop having
the Python script try to

The Python script is still messing up the files in some cases, but
I haven't tracked it down. Instead, I have a small Swift program
that does the same thing more easily.
2024-12-14 21:49:57 -08:00

73 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
# utils/apply-fixit-edits.py - Apply edits from .remap files -*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
import argparse
import collections
import json
import os
import sys
def find_remap_files(path):
for root, dirs, files in os.walk(path):
for filename in files:
if not filename.endswith(".remap"):
continue
yield os.path.join(root, filename)
def apply_edits(path):
remap_files = find_remap_files(path)
if not remap_files:
print("No remap files found")
return 1
edits_per_file = collections.defaultdict(list)
for remap_file in remap_files:
with open(remap_file) as f:
json_data = f.read()
curr_edits = json.loads(json_data)
for ed in curr_edits:
fname = ed["file"]
offset = ed["offset"]
length = ed.get("remove", 0)
text = ed.get("text", "")
edits_per_file[fname].append((offset, length, text))
for fname, edits in edits_per_file.items():
print('Updating', fname)
edits.sort(reverse=True)
with open(fname) as f:
file_data = f.read()
for ed in edits:
offset, length, text = ed
file_data = file_data[:offset] + str(text) + \
file_data[offset + length:]
with open(fname, 'w') as f:
f.write(file_data)
return 0
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="""Finds all .remap files in a directory and applies their
edits to the source files.""")
parser.add_argument("build_dir_path",
help="path to index info")
args = parser.parse_args()
return apply_edits(args.build_dir_path)
if __name__ == "__main__":
sys.exit(main())