Changeset 7780

Show
Ignore:
Timestamp:
03/24/07 15:03:48 (20 months ago)
Author:
jburke
Message:

Refs #2607. Got string interning plugged in, but not sure if it really works yet.

Location:
util/trunk/buildscripts
Files:
1 removed
3 modified

Legend:

Unmodified
Added
Removed
  • util/trunk/buildscripts/build.js

    r7779 r7780  
    11//Main build script for Dojo 
     2var buildTimerStart = (new Date()).getTime(); 
    23 
    34load("jslib/logger.js"); 
     
    1718        kwArgs.profileFile = "profiles/" + kwArgs.profile + ".profile.js"; 
    1819} 
     20if(typeof kwArgs["internStrings"] == "undefined"){ 
     21        kwArgs.internStrings = true;     
     22} 
    1923if(kwArgs["log"]){ 
    2024        logger.level = logger[kwArgs["log"]]; 
     
    3236} 
    3337 
     38var buildTime = ((new Date().getTime() - buildTimerStart) / 1000); 
     39logger.info("Build time: " + buildTime + " seconds"); 
    3440 
    3541//********* Start clean ************ 
     
    5056        //Get the list of module directories we need to process. 
    5157        //They will be in the dependencies.prefixes array. 
    52         var profileProperties = buildUtil.evalProfile(kwArgs.profileFile); 
    53         var dependencies = profileProperties.dependencies; 
     58        kwArgs.profileProperties = buildUtil.evalProfile(kwArgs.profileFile); 
     59        var dependencies = kwArgs.profileProperties.dependencies; 
    5460        var prefixes = dependencies.prefixes; 
    5561        var dojoPrefixPath = null; 
     
    6470                var prefixPath = prefixes[i][1]; 
    6571                 
     72                //Set prefix path to the release location, so that 
     73                //build operations that depend/operate on it are using 
     74                //the release location. 
     75                prefixes[i][1] = kwArgs.releaseDir + "/"  + prefixName; 
     76 
    6677                //Save dojo for last. 
    6778                if(prefixName == "dojo"){ 
     
    7788 
    7889                //FIXME: loadDependency list reparses profile file, but we've already done that. 
     90                logger.trace("Building dojo.js and layer files"); 
    7991                var result = buildUtil.makeDojoJs(buildUtil.loadDependencyList(kwArgs.profileFile), kwArgs.version); 
    8092 
    8193                //Save the build layers. The first layer is dojo.js. 
    8294                var layerLegalText = copyrightText + buildNoticeText; 
     95                var dojoReleaseDir = kwArgs.releaseDir + "/dojo/"; 
    8396                for(var i = 0; i < result.length; i++){ 
    84                         var fileName = kwArgs.releaseDir + "/dojo/" + result[i].layerName; 
     97                        var fileName = dojoReleaseDir + result[i].layerName; 
    8598                        var fileContents = result[i].contents; 
    8699                         
     
    93106 
    94107                        //Save uncompressed file. 
    95                         fileUtil.saveFile(fileName + ".uncompressed.js", layerLegalText + fileContents); 
     108                        var uncompressedFileName = fileName + ".uncompressed.js"; 
     109                        fileUtil.saveFile(uncompressedFileName, layerLegalText + fileContents); 
    96110 
    97111                        //Save compressed file. 
     
    100114                        var compresedContents = buildUtil.optimizeJs(fileName, fileContents, layerLegalText, true); 
    101115                        fileUtil.saveFile(fileName, compresedContents); 
     116 
     117                        //Intern strings if desired. 
     118                        if(kwArgs.internStrings){ 
     119                                logger.info("Interning strings for file: " + fileName); 
     120                                var prefixes = dependencies["prefixes"] || []; 
     121                                var skiplist = dependencies["internSkipList"] || []; 
     122                                buildUtil.internTemplateStringsInFile(uncompressedFileName, dojoReleaseDir, prefixes, skiplist); 
     123                                buildUtil.internTemplateStringsInFile(fileName, dojoReleaseDir, prefixes, skiplist); 
     124                        } 
    102125                } 
    103126 
     
    127150        fileUtil.copyDir(prefixPath, releasePath, copyRegExp); 
    128151 
     152        //Intern strings if desired. 
     153        if(kwArgs.internStrings){ 
     154                logger.info("Interning strings for: " + releasePath); 
     155                buildUtil.internTemplateStrings(kwArgs.profileProperties.dependencies, releasePath); 
     156        } 
     157 
    129158        //FIXME: flatten bundles inside the directory 
    130159 
  • util/trunk/buildscripts/build.xml

    r7741 r7780  
    338338        <!-- end list-profile-deps task --> 
    339339 
    340         <!-- clean task --> 
    341         <target name="clean" 
    342                 description="removes release files"> 
    343                 <delete dir="${release_dir}"/> 
    344         </target> 
    345         <!-- end clean task --> 
    346  
    347         <!-- release task --> 
    348         <target name="release" depends="-fix-config" 
    349                 description="builds a release"> 
    350  
    351                 <echo level="info" taskName="release" message="Using version number: ${version} for the release."/> 
    352  
    353                 <antcall target="clean" /> 
    354  
    355                 <copy todir="${release_dir}/${src}" includeEmptyDirs="false" preservelastmodified="true"> 
    356                         <fileset dir="${root}/${src}"> 
    357                                 <include name="**" /> 
    358                                 <exclude name="**/*.swp" /> 
    359                                 <exclude name="**/.svn*" /> 
    360                         </fileset> 
    361                 </copy> 
    362  
    363                 <copy todir="${release_dir}/tests" includeEmptyDirs="false" preservelastmodified="true"> 
    364                         <fileset dir="${root}/tests"> 
    365                                 <include name="**" /> 
    366                                 <exclude name="**/*.swp" /> 
    367                                 <exclude name="**/.svn*" /> 
    368                         </fileset> 
    369                 </copy> 
    370  
    371                 <antcall target="compress" /> 
    372  
    373                 <!-- Run xdgen if it xdomain loading is wanted. --> 
    374                 <condition property="xdgenRun"> 
    375                         <equals arg1="xdomain" arg2="${dojoLoader}"/> 
    376                 </condition> 
    377                 <antcall target="xdgenRelease"/> 
    378  
    379                 <copy overwrite="true" file="../iframe_history.html" todir="${release_dir}/"  preservelastmodified="true" /> 
    380  
    381                 <copy file="${root}/LICENSE" todir="${release_dir}/"  preservelastmodified="true" /> 
    382                 <copy file="${root}/README" todir="${release_dir}/"  preservelastmodified="true" /> 
    383         </target> 
    384         <!-- end release task --> 
    385  
    386         <!-- compress task --> 
    387         <target name="compress" depends="-fix-config, -set-profileFile" 
    388                 description="runs compression code over release JS files"> 
    389                 <!-- Create the release dir if it doesn't exist. --> 
    390                 <mkdir dir="${release_dir}"/> 
    391  
    392                 <echo level="info" taskName="compress">profileFile: ${profileFile}</echo> 
    393  
    394                 <!-- Call the JS script that will generate the raw dojo.js file --> 
    395                 <java jar="./lib/custom_rhino.jar" failonerror="true" fork="true" 
    396                         logError="true"> 
    397                         <arg value="makeDojoJs.js" /> 
    398                         <arg value="${profileFile}" /> 
    399                         <arg value="${release_dir}" /> 
    400                         <arg value="source.__package__.js" /> 
    401                         <arg value="${version}" /> 
    402                         <sysproperty key="DOJO_LOADER" value="${dojoLoader}" /> 
    403                 </java> 
    404  
    405                 <antcall target="-preload-resources"> 
    406                         <param name="srcFile" value="${release_dir}/source.__package__.js" /> 
    407                         <param name="dstFile" value="${release_dir}/source.__package__.js" /> 
    408                         <param name="buildPrefix" value="dojo" /> 
    409                 </antcall> 
    410  
    411                 <!-- 
    412                         clobber requireLocalization statements.  They need to be come no-ops since the resources 
    413                         are now prebuilt and also because we do not want dojo.js to trigger XHRs on load 
    414                 --> 
    415                 <replaceregexp match="dojo.requireLocalization\((.*?)\);" 
    416                         byline="true" flags="g" file="${release_dir}/source.__package__.js"> 
    417                         <substitution expression=""/> 
    418                 </replaceregexp> 
    419  
    420                 <antcall target="-rhino-compress"> 
    421                         <param name="srcFile" value="${release_dir}/source.__package__.js" /> 
    422                         <param name="dstFile" value="${release_dir}/dojo.js" /> 
    423                 </antcall> 
    424  
    425                 <antcall target="-no-rhino-compress"> 
    426                         <param name="srcFile" value="${release_dir}/source.__package__.js" /> 
    427                         <param name="dstFile" value="${release_dir}/dojo.js" /> 
    428                 </antcall> 
    429  
    430                 <!-- add build notice --> 
    431                 <replaceregexp match="^" byline="false" replace="${build_notice}"> 
    432                         <fileset dir="${release_dir}" includes="dojo.js"/> 
    433                 </replaceregexp> 
    434  
    435                 <!-- add copyright notice --> 
    436                 <replaceregexp match="^" byline="false" replace="${copyright}"> 
    437                         <fileset dir="${release_dir}"> 
    438                                 <include name="**/*.js" /> 
    439                                 <include name="**/*.as" /> 
    440                                 <not> 
    441                                         <contains text="copyright" casesensitive="no"  /> 
    442                                 </not> 
    443                         </fileset> 
    444                 </replaceregexp> 
    445  
    446                 <delete file="${release_dir}/source.__package__.js"/> 
    447  
    448                 <!-- we copy over iframe_history.html here just in case this is a truly 
    449                 stand-alone build that isn't being kicked off via release --> 
    450                 <copy file="../iframe_history.html" todir="${release_dir}/" /> 
    451  
    452                 <!-- copy our dojo.storage and dojo.flash SWFs --> 
    453                 <copy todir="${release_dir}/" preservelastmodified="true"> 
    454                         <fileset dir="${root}/"> 
    455                                 <include name="**/*.swf" /> 
    456                                 <include name="*.jar" /> 
    457                         </fileset> 
    458                 </copy> 
    459  
    460         </target> 
    461         <!-- end compress task --> 
    462  
    463         <target name="-rhino-compress" unless="nostrip"> 
    464                 <copy overwrite="true" file="${srcFile}" tofile="${dstFile}.uncompressed.js" /> 
    465                 <java jar="./lib/custom_rhino.jar" failonerror="true" fork="true" 
    466                                 logerror="true" output="${dstFile}"> 
    467                         <arg value="-strict" /> 
    468                         <arg value="-opt"/> 
    469                         <arg value="-1" /> 
    470                         <arg value="-c" /> 
    471                         <arg value="${srcFile}" /> 
    472                 </java> 
    473         </target> 
    474  
    475         <target name="-no-rhino-compress" 
    476                 if="nostrip"> 
    477                 <copy overwrite="true" file="${srcFile}" tofile="${dstFile}" /> 
    478         </target> 
    479  
    480340        <target name="-flatten-resources" depends="-set-profileFile" 
    481341                description="loads all localization bundles in the build for a particular locale, flattens the object, and outputs a preloaded version"> 
  • util/trunk/buildscripts/jslib/buildUtil.js

    r7775 r7780  
    9898        load = function(uri){ 
    9999                try{ 
    100                         var text = removeComments((isWebBuild ? dojo._getText(uri) : readText(uri))); 
     100                        var text = removeComments((isWebBuild ? dojo._getText(uri) : fileUtil.readFile(uri))); 
    101101                        var requires = dojo._getRequiresAndProvides(text); 
    102102                        eval(requires.join(";")); 
     
    467467 
    468468        //Use new String to make sure we have a JS string (not a Java string) 
    469         //readText is from hostenv_rhino.js, so be sure to load Dojo before calling this function. 
    470         var profileText = new String(readText(profileFile)); 
     469        var profileText = new String(fileUtil.readFile(profileFile)); 
    471470        //Get rid of CR and LFs since they seem to mess with the regexp match. 
    472471        //Using the "m" option on the regexp was not enough. 
     
    687686        } 
    688687 
    689         if(bestPrefixPath == "" && resourceName.indexOf("dojo.") == 0){ 
    690                 bestPrefix = "dojo"; 
    691                 bestPrefixPath = "src/"; 
    692         } 
    693          
    694688        //Get rid of matching prefix from resource name. 
    695689        resourceName = resourceName.replace(bestPrefix, ""); 
     
    712706} 
    713707 
    714  
    715 function makeResourceUri(resourceName, templatePath, srcRoot, prefixes){ 
     708buildUtil.makeResourceUri = function(resourceName, templatePath, srcRoot, prefixes){ 
    716709        var bestPrefix = ""; 
    717710        var bestPrefixPath = "" 
     
    751744} 
    752745 
    753 buildUtil.internTemplateStrings = function(profileFile, loader, releaseDir, srcRoot){ 
    754         loader = loader || "default"; 
    755         releaseDir = releaseDir || "../release/dojo"; 
    756         srcRoot = srcRoot || "../"; 
    757          
    758         print("loader: " + loader); 
    759         print("releaseDir - " + releaseDir); 
    760  
    761         //Load Dojo so we can use readText() defined in hostenv_rhino.js. 
    762         //Also gives us the ability to use all the neato toolkit features. 
    763         djConfig={ 
    764                 baseRelativePath: "../" 
    765         }; 
    766         load('../dojo.js'); 
    767         dojo.require("dojo.string.extras"); 
    768         dojo.require("dojo.i18n.common"); 
    769         dojo.require("dojo.json"); 
    770          
    771         //Find the bundles that need to be flattened. 
    772         load("buildUtil.js"); 
    773  
    774         var profile = buildUtil.evalProfile(profileFile); 
    775         var dependencies = profileFile.dependencies; 
    776  
     746buildUtil.internTemplateStrings = function(dependencies, srcRoot){ 
    777747        var prefixes = dependencies["prefixes"] || []; 
    778         //Make sure dojo is in the list. 
    779         var dojoPath = releaseDir.replace(/^.*(\/|\\)release(\/|\\)/, "release/"); 
    780  
    781748        var skiplist = dependencies["internSkipList"] || []; 
    782          
    783         //Intern strings for dojo.js 
    784         buildUtil.internTemplateStringsInFile(loader, releaseDir + "/dojo.js", srcRoot, prefixes, skiplist); 
    785         buildUtil.internTemplateStringsInFile(loader, releaseDir + "/dojo.js.uncompressed.js", srcRoot, prefixes, skiplist); 
    786  
    787         //Intern strings for any other layer files. 
    788         if(dependencies["layers"] && dependencies.layers.length > 0){ 
    789                 for(var i = 0; i < dependencies.layers.length; i++){ 
    790                         buildUtil.internTemplateStringsInFile(loader, releaseDir + "/" + dependencies.layers[i].name, srcRoot, prefixes, skiplist); 
    791                 } 
    792         } 
    793749 
    794750        //Intern strings for all files in widget dir (xdomain and regular files) 
    795         var fileList = fileUtil.getFilteredFileList(releaseDir + "/src/widget", 
    796                 /\.js$/, true); 
    797  
     751        var fileList = fileUtil.getFilteredFileList(srcRoot, /\.js$/, true); 
    798752        if(fileList){ 
    799753                for(var i = 0; i < fileList.length; i++){ 
    800                         buildUtil.internTemplateStringsInFile(loader, fileList[i], srcRoot, prefixes, skiplist) 
    801                 } 
    802         } 
    803 } 
    804  
    805 buildUtil.internTemplateStringsInFile = function(loader, resourceFile, srcRoot, prefixes, skiplist){ 
    806         var resourceContent = new String(readText(resourceFile)); 
    807         resourceContent = buildUtil.interningRegexpMagic(loader, resourceContent, srcRoot, prefixes, skiplist); 
    808         fileUtil.saveUtf8File(resourceFile, resourceContent); 
    809 } 
    810  
    811 buildUtil.interningDojoUriRegExpString = "(((templatePath|templateCssPath)\\s*(=|:)\\s*)|dojo\\.uri\\.cache\\.allow\\(\\s*)dojo\\.uri\\.(dojo|module)?Uri\\(\\s*?[\\\"\\']([\\w\\.\\/]+)[\\\"\\'](([\\,\\s]*)[\\\"\\']([\\w\\.\\/]*)[\\\"\\'])?\\s*\\)"; 
     754                        buildUtil.internTemplateStringsInFile(fileList[i], srcRoot, prefixes, skiplist); 
     755                } 
     756        } 
     757} 
     758 
     759buildUtil.internTemplateStringsInFile = function(resourceFile, srcRoot, prefixes, skiplist){ 
     760        var resourceContent = String(fileUtil.readFile(resourceFile)); 
     761        resourceContent = buildUtil.interningRegexpMagic(resourceContent, srcRoot, prefixes, skiplist); 
     762        fileUtil.saveFile(resourceFile, resourceContent); 
     763} 
     764 
     765buildUtil.interningDojoUriRegExpString = "(((templatePath|templateCssPath)\\s*(=|:)\\s*)|dojo\\.uri\\.cache\\.allow\\(\\s*)dojo\\.(module)?Uri\\(\\s*?[\\\"\\']([\\w\\.\\/]+)[\\\"\\'](([\\,\\s]*)[\\\"\\']([\\w\\.\\/]*)[\\\"\\'])?\\s*\\)"; 
    812766buildUtil.interningGlobalDojoUriRegExp = new RegExp(buildUtil.interningDojoUriRegExpString, "g"); 
    813767buildUtil.interningLocalDojoUriRegExp = new RegExp(buildUtil.interningDojoUriRegExpString); 
    814768 
    815 //WARNING: This function assumes dojo.string.escapeString() has been loaded. 
    816 buildUtil.interningRegexpMagic = function(loader, resourceContent, srcRoot, prefixes, skiplist, isSilent){ 
     769buildUtil.interningRegexpMagic = function(resourceContent, srcRoot, prefixes, skiplist){ 
    817770        return resourceContent.replace(buildUtil.interningGlobalDojoUriRegExp, function(matchString){ 
    818771                var parts = matchString.match(buildUtil.interningLocalDojoUriRegExp); 
     
    820773                var filePath = ""; 
    821774                var resourceNsName = ""; 
    822                 if(parts[5] == "dojo"){ 
    823                         if(parts[6].match(/(\.htm|\.html|\.css)$/)){ 
    824                                 if(!isSilent){ 
    825                                         print("Dojo match: " + parts[6]); 
    826                                 } 
    827                                 filePath = srcRoot + parts[6] 
    828                                 resourceNsName = "dojo:" + parts[6]; 
    829                         } 
     775 
     776                logger.trace("Module match: " + parts[6] + " and " + parts[9]); 
     777                filePath = buildUtil.makeResourceUri(parts[6], parts[9], srcRoot, prefixes); 
     778                resourceNsName = parts[6] + ':' + parts[9];              
     779 
     780                if(!filePath || buildUtil.isValueInArray(resourceNsName, skiplist)){ 
     781                        logger.trace("Skip intern resource: " + filePath); 
    830782                }else{ 
    831                         if(!isSilent){ 
    832                                 print("Module match: " + parts[6] + " and " + parts[9]); 
    833                         } 
    834                         filePath = makeResourceUri(parts[6], parts[9], srcRoot, prefixes); 
    835                         resourceNsName = parts[6] + ':' + parts[9];              
    836                 } 
    837  
    838                 if(!filePath || buildUtil.isValueInArray(resourceNsName, skiplist)){ 
    839                         if(filePath && !isSilent){ 
    840                                 print("Skip intern resource: " + filePath); 
    841                         } 
    842                 }else{ 
    843                         if(!isSilent){ 
    844                                 print("Interning resource path: " + filePath); 
    845                         } 
    846                         //dojo.string.escapeString will add starting and ending double-quotes. 
    847                         var jsEscapedContent = dojo.string.escapeString(new String(readText(filePath))); 
     783                        logger.trace("Interning resource path: " + filePath); 
     784                        //buildUtil.jsEscape will add starting and ending double-quotes. 
     785                        var jsEscapedContent = buildUtil.jsEscape(new String(fileUtil.readFile(filePath))); 
    848786                        if(jsEscapedContent){ 
    849787                                if(matchString.indexOf("dojo.uri.cache.allow") != -1){ 
     
    885823} 
    886824 
     825buildUtil.jsEscape = function(/*string*/str){ 
     826//summary: 
     827//      Adds escape sequences for non-visual characters, double quote and backslash 
     828//      and surrounds with double quotes to form a valid string literal. 
     829//      Take from the old dojo.string.escapeString code. 
     830//      Include it here so we don't have to load dojo. 
     831        return ('"' + str.replace(/(["\\])/g, '\\$1') + '"' 
     832                ).replace(/[\f]/g, "\\f" 
     833                ).replace(/[\b]/g, "\\b" 
     834                ).replace(/[\n]/g, "\\n" 
     835                ).replace(/[\t]/g, "\\t" 
     836                ).replace(/[\r]/g, "\\r"); // string 
     837} 
     838 
    887839buildUtil.isValueInArray = function(/*Object*/value, /*Array*/ary){ 
    888840        //summary: sees if value is in the ary array. Uses == to see if the