import argparse
import sys
import os.path
import re
import fileinput
import datetime
import glob
def check_header_comment(filename):
name = os.path.basename( filename )
sourcefile = open( filename, "r" )
content = sourcefile.read()
sourcefile.close()
match = re.search(r'\$Id\$', content)
if match == None:
match = re.search(r'\$Id: ' + name + r'\s+[^$]+\$', content)
if match != None:
return False
return True
def check_input_files_for_variadic_seq(headerDir, sourceDir):
files = glob.glob( os.path.join( headerDir, "*.hpp" ) )
files += glob.glob( os.path.join( headerDir, "aux_", "*.hpp" ) )
files += glob.glob( os.path.join( sourceDir, "src", "*" ) )
for currentFile in sorted( files ):
if check_header_comment( currentFile ):
return True
return False
def check_input_files_for_numbered_seq(sourceDir, suffix, containers):
for container in containers:
files = glob.glob( os.path.join( sourceDir, container, container + '*' + suffix ) )
for currentFile in sorted( files ):
if check_header_comment( currentFile ):
return True
return False
def check_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', 'map'],
seqType='both', verbose=False):
result1 = False
if seqType == "both" or seqType == "variadic":
if verbose:
print("Check if input files for pre-processing Boost.MPL variadic containers need fixing.")
result1 = check_input_files_for_variadic_seq(headerDir, sourceDir)
if verbose:
if result1:
print(" At least one input file needs fixing!")
else:
print(" No input file needs fixing!")
result2 = False
result3 = False
if seqType == "both" or seqType == "numbered":
if verbose:
print("Check input files for pre-processing Boost.MPL numbered containers.")
result2 = check_input_files_for_numbered_seq(headerDir, ".hpp", containers)
result3 = check_input_files_for_numbered_seq(sourceDir, ".cpp", containers)
if verbose:
if result2 or result3:
print(" At least one input file needs fixing!")
else:
print(" No input file needs fixing!")
return result1 or result2 or result3
def fix_header_comment(filename, timestamp):
name = os.path.basename( filename )
for line in fileinput.input( filename, inplace=1, mode="r" ):
line = re.sub(r'\$Id:[^$]+\$', r'$Id$', line.rstrip())
line = re.sub(re.escape(r'$Id$'), r'$Id: ' + name + r' ' + timestamp.isoformat() + r' $', line.rstrip())
print(line)
def fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp):
files = glob.glob( os.path.join( headerDir, "*.hpp" ) )
files += glob.glob( os.path.join( headerDir, "aux_", "*.hpp" ) )
files += glob.glob( os.path.join( sourceDir, "src", "*" ) )
for currentFile in sorted( files ):
fix_header_comment( currentFile, timestamp )
def fix_input_files_for_numbered_seq(sourceDir, suffix, timestamp, containers):
for container in containers:
files = glob.glob( os.path.join( sourceDir, container, container + '*' + suffix ) )
for currentFile in sorted( files ):
fix_header_comment( currentFile, timestamp )
def fix_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', 'map'],
seqType='both', verbose=False):
timestamp = datetime.datetime.now();
if seqType == "both" or seqType == "variadic":
if verbose:
print("Fix input files for pre-processing Boost.MPL variadic containers.")
fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp)
if seqType == "both" or seqType == "numbered":
if verbose:
print("Fix input files for pre-processing Boost.MPL numbered containers.")
fix_input_files_for_numbered_seq(headerDir, ".hpp", timestamp, containers)
fix_input_files_for_numbered_seq(sourceDir, ".cpp", timestamp, containers)
def to_existing_absolute_path(string):
value = os.path.abspath(string)
if not os.path.exists( value ) or not os.path.isdir( value ):
msg = '"%r" is not a valid path to a directory.' % string
raise argparse.ArgumentTypeError(msg)
return value
def main():
cmdlineParser = argparse.ArgumentParser(
description="Fixes the input files used for pre-processing of Boost.MPL headers.")
cmdlineParser.add_argument("-v", "--verbose", dest='verbose', action='store_true',
help="Be a little bit more verbose.")
cmdlineParser.add_argument("--check-only", dest='checkonly', action='store_true',
help="Only checks if fixing is required.")
cmdlineParser.add_argument(dest='sourceDir', metavar="<source-dir>",
type=to_existing_absolute_path,
help="The source-directory of Boost.")
args = cmdlineParser.parse_args()
if args.verbose:
print("Arguments extracted from command-line:")
print(" verbose = ", args.verbose)
print(" check-only = ", args.checkonly)
print(" source directory = ", args.sourceDir)
headerDir = os.path.join( args.sourceDir, "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "libs", "mpl", "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
headerDir = os.path.join( args.sourceDir, "include", "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
cmdlineParser.print_usage()
print("error: Cannot find Boost.MPL header/source files in given Boost source-directory!")
sys.exit(0)
if args.verbose:
print("Chosen header-directory: ", headerDir)
print("Chosen source-directory: ", sourceDir)
if args.checkonly:
result = check_input_files(headerDir, sourceDir, verbose = args.verbose)
if result:
print("Fixing the input-files used for pre-processing of Boost.MPL headers IS required.")
else:
print("Fixing the input-files used for pre-processing of Boost.MPL headers is NOT required.")
else:
fix_input_files(headerDir, sourceDir, verbose = args.verbose)
if __name__ == '__main__':
main()