1#!/usr/local/bin/python3.8
2
3"Replace tabs with spaces in argument files.  Print names of changed files."
4
5import os
6import sys
7import getopt
8import tokenize
9
10def main():
11    tabsize = 8
12    try:
13        opts, args = getopt.getopt(sys.argv[1:], "t:")
14        if not args:
15            raise getopt.error("At least one file argument required")
16    except getopt.error as msg:
17        print(msg)
18        print("usage:", sys.argv[0], "[-t tabwidth] file ...")
19        return
20    for optname, optvalue in opts:
21        if optname == '-t':
22            tabsize = int(optvalue)
23
24    for filename in args:
25        process(filename, tabsize)
26
27
28def process(filename, tabsize, verbose=True):
29    try:
30        with tokenize.open(filename) as f:
31            text = f.read()
32            encoding = f.encoding
33    except IOError as msg:
34        print("%r: I/O error: %s" % (filename, msg))
35        return
36    newtext = text.expandtabs(tabsize)
37    if newtext == text:
38        return
39    backup = filename + "~"
40    try:
41        os.unlink(backup)
42    except OSError:
43        pass
44    try:
45        os.rename(filename, backup)
46    except OSError:
47        pass
48    with open(filename, "w", encoding=encoding) as f:
49        f.write(newtext)
50    if verbose:
51        print(filename)
52
53
54if __name__ == '__main__':
55    main()
56