Home | History | Annotate | Download | only in scripts
      1 #! /usr/bin/env python3
      2 
      3 "Replace tabs with spaces in argument files.  Print names of changed files."
      4 
      5 import os
      6 import sys
      7 import getopt
      8 import tokenize
      9 
     10 def 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 
     28 def 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 
     54 if __name__ == '__main__':
     55     main()
     56