blob: b6fcd915d9ebdd4d2bb63e85c39e84b6533474de [file] [log] [blame]
#!/usr/bin/env python
"""
Scans each resource file in res/ applying various transformations
to fix invalid resource files.
"""
import os
import os.path
import sys
import tempfile
from consumers.duplicates import DuplicateRemover
from consumers.positional_arguments import PositionalArgumentFixer
def do_it(res_path, consumers):
for file_path in enumerate_files(res_path):
eligible_consumers = filter(lambda c: c.matches(file_path), consumers)
if len(eligible_consumers) > 0:
print "checking {0} ...".format(file_path)
original_contents = read_contents(file_path)
contents = original_contents
for c in eligible_consumers:
contents = c.consume(file_path, contents)
if original_contents != contents:
write_contents(file_path, contents)
def enumerate_files(res_path):
"""Enumerates all files in the resource directory."""
values_directories = os.listdir(res_path)
values_directories = map(lambda f: os.path.join(res_path, f), values_directories)
all_files = []
for dir in values_directories:
files = os.listdir(dir)
files = map(lambda f: os.path.join(dir, f), files)
for f in files:
yield f
def read_contents(file_path):
"""Reads the contents of file_path without decoding."""
with open(file_path) as fin:
return fin.read()
def write_contents(file_path, contents):
"""Writes the bytes in contents to file_path by first writing to a temporary, then
renaming the temporary to file_path, ensuring a consistent write.
"""
dirname, basename = os.path.split(file_path)
temp_name = ""
with tempfile.NamedTemporaryFile(prefix=basename, dir=dirname, delete=False) as temp:
temp_name = temp.name
temp.write(contents)
os.rename(temp.name, file_path)
if __name__ == '__main__':
if len(sys.argv) < 2:
print >> sys.stderr, "please specify a path to a resource directory"
sys.exit(1)
res_path = os.path.abspath(sys.argv[1])
print "looking in {0} ...".format(res_path)
do_it(res_path, [DuplicateRemover(), PositionalArgumentFixer()])