Blame msvc/replace.py

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