# Copyright (c) 2011 Microsoft Corporation # # Redistribution and use in source and binary forms, with or without modification, are permitted provided # that the following conditions are met: # * Redistributions of source code must retain the above copyright notice, this list of conditions and # the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and # the following disclaimer in the documentation and/or other materials provided with the distribution. # * Neither the name of Microsoft nor the names of its contributors may be used to # endorse or promote products derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #--Imports--------------------------------------------------------------------- import argparse import os import sys import re #--Globals--------------------------------------------------------------------- MSFT_LICENSE = '''/// Copyright (c) 2012 Microsoft Corporation /// /// Redistribution and use in source and binary forms, with or without modification, are permitted provided /// that the following conditions are met: /// * Redistributions of source code must retain the above copyright notice, this list of conditions and /// the following disclaimer. /// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and /// the following disclaimer in the documentation and/or other materials provided with the distribution. /// * Neither the name of Microsoft nor the names of its contributors may be used to /// endorse or promote products derived from this software without specific prior written permission. /// /// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR /// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS /// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE /// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT /// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS /// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, /// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF /// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ''' GOOGLE_LICENSE = '''// Copyright 2011 Google Inc. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. ''' GOOGLE_RE = re.compile(r"[\\/]S([0-9]+)|(bp)(\.|_)[^\\/]+\.js$") GOOGLE_LINE_ONE = re.compile(r"(Copyright\s+20[0-9][0-9]\s+Google)|(the Sputnik authors)") IETC_RE = re.compile(r"[\\/][0-9]+\.[^\\/]+\.js$") IETC_LINE_ONE = re.compile(r"Microsoft Corporation") #------------------------------------------------------------------------------ def getAllJSFiles(dirName): ''' Returns all JS files under dirName ''' retVal = [] if os.path.isfile(dirName) and dirName.endswith(".js"): retVal = [dirName] elif os.path.isdir(dirName): tempList = [os.path.join(dirName, x) for x in os.listdir(dirName)] for x in tempList: retVal += getAllJSFiles(x) #else: # raise Exception("getAllJSFiles: encountered a non-file/non-dir:" + dirName) return retVal #------------------------------------------------------------------------------ def handleFile(filePath): ''' ''' with open(filePath, "rb") as f: origLines = f.readlines() #Figure out which license header we'll be using if GOOGLE_RE.search(filePath)!=None: licenseHeader = GOOGLE_LICENSE lineOne = GOOGLE_LINE_ONE elif IETC_RE.search(filePath)!=None: licenseHeader = MSFT_LICENSE lineOne = IETC_LINE_ONE else: print "*!!!*:\t", filePath return #See if it's already there if lineOne.search(origLines[0])!=None: return with open(filePath, "wb") as f: print "MODIFIED:\t", filePath f.write(licenseHeader) for line in origLines: f.write(line) #--Main------------------------------------------------------------------------ if __name__=="__main__": __parser = argparse.ArgumentParser(description='Tool used to fix test file license headers') __parser.add_argument('tpath', action='store', help='Full path to test cases. E.g., C:\repos\test262-msft\test\suite') ARGS = __parser.parse_args() if not os.path.exists(ARGS.tpath): print "Cannot fix tests in '%s' when it doesn't exist!" % ARGS.tpath sys.exit(1) ALL_JS_FILES = getAllJSFiles(ARGS.tpath) for fileName in ALL_JS_FILES: handleFile(fileName) print "Done!"