#!/usr/bin/python import sys, os, re from subprocess import Popen, PIPE from optparse import OptionParser # trail_spaces: This method removes the trailing whitespaces and trailing tabs def trail_spaces(line): newline=line carreturn = 0 if re.search("\r\n",line): carreturn = 1 status = re.search("\s+$",line) if status: if carreturn: newline = re.sub("\s+$","\r\n",line) else: newline = re.sub("\s+$","\n",line) status = re.search("\t+$",newline) if status: newline = re.sub("\t+$","",newline) return newline #convert_tabs: This methos converts tabs to 4 spaces def convert_tabs(line): newline=line status = re.search("\t",line) if status: newline = re.sub("\t"," ",line) return newline #convert_lineends: This method converts lineendings from DOS to Unix def convert_lineends(line): newline=line status = re.search("\r\n",line) if status: newline = re.sub("\r\n","\n",line) return newline #processfile: This method processes each file passed to it depending # on the flags passed def processfile(file,tabs, lineends,trails,verbose): processed_data = [] if verbose: print "processing file: "+file with open(file,'r') as fr: data = fr.readlines() for line in data: if tabs: line = convert_tabs(line) if lineends: line = convert_lineends(line) if trails: line = trail_spaces(line) processed_data.append(line) with open(file,'w') as fw: fw.writelines(processed_data) #findfiles: This method finds all the code files present in current # directory and subdirectories. def findfiles(tabs,lineends,trails,verbose): testfiles = [] for root, dirs, files in os.walk("./"): for file in files: for extn in ('.c','.cpp','.h','.hpp'): if file.endswith(extn): testfiles.append(os.path.join(root, file)) for file in testfiles: processfile(file,tabs,lineends,trails,verbose) # Main function def main(): parser = OptionParser() parser.add_option("--notabs", dest="tabs", action="store_false", default=True, help="Disable converting tabs to 4 spaces.") parser.add_option("--notrails", dest="trails", action="store_false", default=True, help="Disable removing trailing whitespaces and trailing tabs.") parser.add_option("--nolineends", dest="lineends", action="store_false", default=True, help=" Disable converting line endings to Unix from DOS.") parser.add_option("--verbose", dest="verbose", action="store_true", default=False, help="Prints out the files being processed.") parser.add_option("--git", dest="SHA1", default="", help="Processes only the files present in the particular commit.") parser.add_option('-o', action="store", default=True, help="Default: All the code files (.c,.cpp,.h,.hpp) in the current directory and subdirectories will be processed") (options, args) = parser.parse_args() if options.SHA1: pl = Popen(["git","show", "--pretty=format:", "--name-only",options.SHA1], stdout=PIPE) cmdout = pl.communicate()[0] gitout=cmdout.split("\n") for file in gitout: print file if file: processfile(file,options.tabs,options.lineends,options.trails,options.verbose) if not options.SHA1: findfiles(options.tabs,options.lineends,options.trails,options.verbose) # start the process by calling main main()