mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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.
73 lines
2.1 KiB
Python
Executable File
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())
|