• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#! /usr/bin/env python3
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    return max(process(filename, tabsize) for filename in args)
25
26
27def process(filename, tabsize, verbose=True):
28    try:
29        with tokenize.open(filename) as f:
30            text = f.read()
31            encoding = f.encoding
32    except IOError as msg:
33        print("%r: I/O error: %s" % (filename, msg))
34        return 2
35    newtext = text.expandtabs(tabsize)
36    if newtext == text:
37        return 0
38    backup = filename + "~"
39    try:
40        os.unlink(backup)
41    except OSError:
42        pass
43    try:
44        os.rename(filename, backup)
45    except OSError:
46        pass
47    with open(filename, "w", encoding=encoding) as f:
48        f.write(newtext)
49    if verbose:
50        print(filename)
51    return 1
52
53
54if __name__ == '__main__':
55    raise SystemExit(main())
56