Blame win32/replace.py

Packit a4058c
#!/usr/bin/python
Packit a4058c
#
Packit a4058c
# Simple utility script to manipulate
Packit a4058c
# certain types of strings in a file
Packit a4058c
Packit a4058c
# This can be used in various projects where
Packit a4058c
# there is the need to replace strings in files,
Packit a4058c
# and is copied from GLib's $(srcroot)/build/win32
Packit a4058c
Packit a4058c
# Author: Fan, Chun-wei
Packit a4058c
# Date: September 03, 2014
Packit a4058c
Packit a4058c
import os
Packit a4058c
import sys
Packit a4058c
import re
Packit a4058c
import string
Packit a4058c
import argparse
Packit a4058c
Packit a4058c
valid_actions = ['remove-prefix',
Packit a4058c
                 'replace-var',
Packit a4058c
                 'replace-str',
Packit a4058c
                 'remove-str']
Packit a4058c
Packit a4058c
def open_file(filename, mode):
Packit a4058c
    if sys.version_info[0] < 3:
Packit a4058c
        return open(filename, mode=mode)
Packit a4058c
    else:
Packit a4058c
        return open(filename, mode=mode, encoding='utf-8')
Packit a4058c
Packit a4058c
def replace_multi(src, dest, replace_items):
Packit a4058c
    with open_file(src, 'r') as s:
Packit a4058c
        with open_file(dest, 'w') as d:
Packit a4058c
            for line in s:
Packit a4058c
                replace_dict = dict((re.escape(key), value) \
Packit a4058c
                               for key, value in replace_items.items())
Packit a4058c
                replace_pattern = re.compile("|".join(replace_dict.keys()))
Packit a4058c
                d.write(replace_pattern.sub(lambda m: \
Packit a4058c
                        replace_dict[re.escape(m.group(0))], line))
Packit a4058c
Packit a4058c
def replace(src, dest, instring, outstring):
Packit a4058c
    replace_item = {instring: outstring}
Packit a4058c
    replace_multi(src, dest, replace_item)
Packit a4058c
Packit a4058c
def check_required_args(args, params):
Packit a4058c
    for param in params:
Packit a4058c
        if getattr(args, param, None) is None:
Packit a4058c
            raise SystemExit('%s: error: --%s argument is required' % (__file__, param))
Packit a4058c
Packit a4058c
def warn_ignored_args(args, params):
Packit a4058c
    for param in params:
Packit a4058c
        if getattr(args, param, None) is not None:
Packit a4058c
            print('%s: warning: --%s argument is ignored' % (__file__, param))
Packit a4058c
Packit a4058c
def main(argv):
Packit a4058c
Packit a4058c
    parser = argparse.ArgumentParser(description='Process strings in a file.')
Packit a4058c
    parser.add_argument('-a',
Packit a4058c
                        '--action',
Packit a4058c
                        help='Action to carry out.  Can be one of:\n'
Packit a4058c
                             'remove-prefix\n'
Packit a4058c
                             'replace-var\n'
Packit a4058c
                             'replace-str\n'
Packit a4058c
                             'remove-str',
Packit a4058c
                        choices=valid_actions)
Packit a4058c
    parser.add_argument('-i', '--input', help='Input file')
Packit a4058c
    parser.add_argument('-o', '--output', help='Output file')
Packit a4058c
    parser.add_argument('--instring', help='String to replace or remove')
Packit a4058c
    parser.add_argument('--var', help='Autotools variable name to replace')
Packit a4058c
    parser.add_argument('--outstring',
Packit a4058c
                        help='New String to replace specified string or variable')
Packit a4058c
    parser.add_argument('--removeprefix', help='Prefix of string to remove')
Packit a4058c
Packit a4058c
    args = parser.parse_args()
Packit a4058c
Packit a4058c
    input_string = ''
Packit a4058c
    output_string = ''
Packit a4058c
Packit a4058c
    # We must have action, input, output for all operations
Packit a4058c
    check_required_args(args, ['action','input','output'])
Packit a4058c
Packit a4058c
    # Build the arguments by the operation that is to be done,
Packit a4058c
    # to be fed into replace()
Packit a4058c
Packit a4058c
    # Get rid of prefixes from a string
Packit a4058c
    if args.action == 'remove-prefix':
Packit a4058c
        check_required_args(args, ['instring','removeprefix'])
Packit a4058c
        warn_ignored_args(args, ['outstring','var'])
Packit a4058c
        input_string = args.removeprefix + args.instring
Packit a4058c
        output_string = args.instring
Packit a4058c
Packit a4058c
    # Replace an m4-style variable (those surrounded by @...@)
Packit a4058c
    if args.action == 'replace-var':
Packit a4058c
        check_required_args(args, ['var','outstring'])
Packit a4058c
        warn_ignored_args(args, ['instring','removeprefix'])
Packit a4058c
        input_string = '@' + args.var + '@'
Packit a4058c
        output_string = args.outstring
Packit a4058c
Packit a4058c
    # Replace a string
Packit a4058c
    if args.action == 'replace-str':
Packit a4058c
        check_required_args(args, ['instring','outstring'])
Packit a4058c
        warn_ignored_args(args, ['var','removeprefix'])
Packit a4058c
        input_string = args.instring
Packit a4058c
        output_string = args.outstring
Packit a4058c
Packit a4058c
    # Remove a string
Packit a4058c
    if args.action == 'remove-str':
Packit a4058c
        check_required_args(args, ['instring'])
Packit a4058c
        warn_ignored_args(args, ['var','outstring','removeprefix'])
Packit a4058c
        input_string = args.instring
Packit a4058c
        output_string = ''
Packit a4058c
Packit a4058c
    replace(args.input, args.output, input_string, output_string)
Packit a4058c
Packit a4058c
if __name__ == '__main__':
Packit a4058c
    sys.exit(main(sys.argv))