blob: 8eac16b1b7d37b874e2383297c87bdf64fb308da [file] [log] [blame]
#!python
# Copyright 2014 Google Inc. All Rights Reserved.
#
# 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.
'''
Template replacement script. Reads key/value pairs from argument files,
and substitutes $(key) strings in the input file to create the output file.
The output file is only rewritten if the contents will be different from
the existing contents.
'''
import exceptions
import optparse
import os
import re
import string
import sys
_USAGE = 'usage: %prog [option] [key files]\n' + __doc__
_LINE_RE = re.compile('^'
'(?P<key>\w+)=(?P<value>.*)|' # key=value
'(?P<comment>\s*(?:#.*)?)' # WS or comment
'$')
class Error(exceptions.Exception):
pass
def ReadKeyFile(key_file, values):
'''Reads the key/value pairs from key_file, and adds them to the values dict.
'''
f = open(key_file, 'r')
for line in f:
line = line.rstrip('\n\r')
m = _LINE_RE.match(line)
if not m:
raise Error('Syntax error in file "%s", line "%s"' % (key_file, line))
matches = m.groupdict()
if matches['key']:
values[matches['key']] = matches['value']
def GetOptionParser():
parser = optparse.OptionParser(usage=_USAGE)
parser.add_option('-i', '--input', dest='input',
help='Input template file name')
parser.add_option('-o', '--output', dest='output',
help='Output file name')
return parser
def Main():
parser = GetOptionParser()
(opts, args) = parser.parse_args()
if not opts.input:
parser.error('you must provide an input file')
if not opts.output:
parser.error('you must provide an output file')
values = dict()
for key_file in args:
ReadKeyFile(key_file, values)
# Slurp the input file.
input = open(opts.input, 'r').read()
# Do the replacements.
template = string.Template(input)
output = template.substitute(values)
# If there is an existing version of the file, check its contents.
# If they are identical, we return early not rewriting the file.
if os.path.isfile(opts.output):
contents = open(opts.output, 'r').read()
if output == contents:
return 0
# And write the output.
open(opts.output, 'w').write(output)
return 0
if __name__ == '__main__':
sys.exit(Main())