Blame win32/replace.py

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