From c603326e58e4bbb000e72ff55428e9aa7f5927b9 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Sat, 9 May 2015 10:22:13 -0700 Subject: [PATCH] Use try/finally to ensure popen streams are always closed --- CommonJS/bin/press | 30 ++++++++----- CommonJS/lib/cappuccino/fontinfo.j | 26 ++++++----- CommonJS/lib/cappuccino/imagesize.j | 26 ++++++----- Jakefile | 23 ++++++---- Objective-J/CFHTTPRequest.js | 19 +++++--- .../CommonJS/lib/objective-j/compiler.js | 44 ++++++++++++------- Objective-J/Jakefile | 17 ++++--- Tools/XcodeCapp/Jakefile | 37 ++++++++++------ Tools/nib2cib/Converter.j | 39 +++++++++------- common.jake | 23 ++++++---- 10 files changed, 172 insertions(+), 112 deletions(-) diff --git a/CommonJS/bin/press b/CommonJS/bin/press index 8d6c4c649..b89bb49d4 100755 --- a/CommonJS/bin/press +++ b/CommonJS/bin/press @@ -374,24 +374,30 @@ function pngcrushDirectory(directory) system.stderr.print("Running pngcrush on " + pngs.length + " pngs:"); pngs.forEach(function(dstPath) { - var tmpPath = FILE.path(dstPath+".tmp"), - p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]); + var tmpPath = FILE.path(dstPath+".tmp"); - if (p.wait()) + try { - CPLog.warn("pngcrush failed. Ensure it's installed and on your PATH."); + var p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]); + + if (p.wait()) + { + CPLog.warn("pngcrush failed. Ensure it's installed and on your PATH."); + } + else + { + FILE.move(tmpPath, dstPath); + system.stderr.write(".").flush(); + } } - else + finally { - FILE.move(tmpPath, dstPath); - system.stderr.write(".").flush(); + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); } - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); - }); + system.stderr.print(""); } diff --git a/CommonJS/lib/cappuccino/fontinfo.j b/CommonJS/lib/cappuccino/fontinfo.j index 7fef16a5c..4fb9385a0 100644 --- a/CommonJS/lib/cappuccino/fontinfo.j +++ b/CommonJS/lib/cappuccino/fontinfo.j @@ -3,18 +3,20 @@ var OS = require("os"); exports.fontinfo = function(name, size) { - var p = OS.popen(["fontinfo", "-n", name, size || 12]), - result; + var result; - if (p.wait() === 0) - result = p.stdout.read(); + try + { + var p = OS.popen(["fontinfo", "-n", name, size || 12]); + if (p.wait() === 0) + result = p.stdout.read(); + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + } - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); - - if (result) - return JSON.parse(result); - else - return null; + return result ? JSON.parse(result) : null; }; diff --git a/CommonJS/lib/cappuccino/imagesize.j b/CommonJS/lib/cappuccino/imagesize.j index af17c3cf3..2d88f8085 100644 --- a/CommonJS/lib/cappuccino/imagesize.j +++ b/CommonJS/lib/cappuccino/imagesize.j @@ -3,18 +3,20 @@ var OS = require("os"); exports.imagesize = function(path) { - var p = OS.popen(["imagesize", "-n", path]), - result; + var result; - if (p.wait() === 0) - result = p.stdout.read(); + try + { + var p = OS.popen(["imagesize", "-n", path]); + if (p.wait() === 0) + result = p.stdout.read(); + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + } - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); - - if (result) - return JSON.parse(result); - else - return null; + return result ? JSON.parse(result) : null; }; diff --git a/Jakefile b/Jakefile index a03744328..9bbc5ff57 100644 --- a/Jakefile +++ b/Jakefile @@ -128,17 +128,22 @@ function generateDocs(/* boolean */ noFrame) // If the Doxygen application is installed on Mac OS X, use that if (!doxygen && executableExists("mdfind")) { - var p = OS.popen(["mdfind", "kMDItemContentType == 'com.apple.application-bundle' && kMDItemCFBundleIdentifier == 'org.doxygen'"]); - if (p.wait() === 0) + try { - var doxygenApps = p.stdout.read().split("\n"); - if (doxygenApps[0]) - doxygen = FILE.join(doxygenApps[0], "Contents/Resources/doxygen"); + var p = OS.popen(["mdfind", "kMDItemContentType == 'com.apple.application-bundle' && kMDItemCFBundleIdentifier == 'org.doxygen'"]); + if (p.wait() === 0) + { + var doxygenApps = p.stdout.read().split("\n"); + if (doxygenApps[0]) + doxygen = FILE.join(doxygenApps[0], "Contents/Resources/doxygen"); + } + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); } - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); } if (!doxygen || !FILE.exists(doxygen)) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index c2ccc4629..0d34667f2 100644 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -323,16 +323,21 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress) var aFilePath = aURL.toString().substring(5), OS = require("os"), gccFlags = require("objective-j").currentCompilerFlags(), - gcc = OS.popen("gcc -E -x c -P " + (gccFlags ? gccFlags : "") + " " + OS.enquote(aFilePath), { charset:"UTF-8" }), chunk, fileContents = ""; - while (chunk = gcc.stdout.read()) - fileContents += chunk; - - gcc.stdin.close(); - gcc.stdout.close(); - gcc.stderr.close(); + try + { + var gcc = OS.popen("gcc -E -x c -P " + (gccFlags ? gccFlags : "") + " " + OS.enquote(aFilePath), { charset:"UTF-8" }); + while (chunk = gcc.stdout.read()) + fileContents += chunk; + } + finally + { + gcc.stdin.close(); + gcc.stdout.close(); + gcc.stderr.close(); + } if (fileContents.length > 0) { diff --git a/Objective-J/CommonJS/lib/objective-j/compiler.js b/Objective-J/CommonJS/lib/objective-j/compiler.js index 3bf18c5f2..34416cde0 100644 --- a/Objective-J/CommonJS/lib/objective-j/compiler.js +++ b/Objective-J/CommonJS/lib/objective-j/compiler.js @@ -46,27 +46,39 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc if (!shouldObjjPreprocess) { - var p = OS.popen("which gcc"); - if (p.stdout.read().length === 0) - fileContents = FILE.read(aFilePath, { charset:"UTF-8" }); - else + try { - // GCC preprocess the file. - var gcc = OS.popen("gcc -E -x c -P " + (gccFlags ? gccFlags.join(" ") : "") + " " + OS.enquote(aFilePath), { charset:"UTF-8" }), - chunk = ""; + var p = OS.popen("which gcc"); - while (chunk = gcc.stdout.read()) - fileContents += chunk; + if (p.stdout.read().length === 0) + { + fileContents = FILE.read(aFilePath, { charset:"UTF-8" }); + } + else + { + try + { + var gcc = OS.popen("gcc -E -x c -P " + (gccFlags ? gccFlags.join(" ") : "") + " " + OS.enquote(aFilePath), { charset:"UTF-8" }), + chunk = ""; - gcc.stdin.close(); - gcc.stdout.close(); - gcc.stderr.close(); + while (chunk = gcc.stdout.read()) + fileContents += chunk; + } + finally + { + gcc.stdin.close(); + gcc.stdout.close(); + gcc.stderr.close(); + } + } + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); } - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); - return fileContents; } diff --git a/Objective-J/Jakefile b/Objective-J/Jakefile index 289cbacb0..2c83a5562 100644 --- a/Objective-J/Jakefile +++ b/Objective-J/Jakefile @@ -120,14 +120,19 @@ function gcc(inputFilePath, outputFilePath, flags, compress) // GCC preprocess the file. var cmd = ["gcc", "-E", "-x", "c", "-P"].concat(flags, inputFilePath).join(" "), - gcc = OS.popen(cmd, { charset:"UTF-8" }), contents = FILE.read("header.txt", { charset : "UTF-8" }); - contents += gcc.stdout.read(); - - gcc.stdin.close(); - gcc.stdout.close(); - gcc.stderr.close(); + try + { + var gcc = OS.popen(cmd, { charset:"UTF-8" }); + contents += gcc.stdout.read(); + } + finally + { + gcc.stdin.close(); + gcc.stdout.close(); + gcc.stderr.close(); + } if (FILE.extension(inputFilePath) === ".js" && compress) contents = compressor(contents); diff --git a/Tools/XcodeCapp/Jakefile b/Tools/XcodeCapp/Jakefile index 28245665b..dc08dd52c 100644 --- a/Tools/XcodeCapp/Jakefile +++ b/Tools/XcodeCapp/Jakefile @@ -13,25 +13,34 @@ task ("build", function() OS.exit(0); // No building on 10.6 - var p = OS.popen(["sw_vers", "-productVersion"]); - - if (p.wait() === 0) + try { - var versions = p.stdout.read().split("."), - majorVersion = parseInt(versions[0], 10), - minorVersion = parseInt(versions[1], 10), - buildVersion = parseInt(versions[2], 10); + var p = OS.popen(["sw_vers", "-productVersion"]); - if (majorVersion < 10 || minorVersion < 7) + if (p.wait() === 0) { - colorPrint("XcodeCapp can only be built on Mac OS X 10.7+. You can download the binary here: https://www.dropbox.com/sh/gxdgm356gyb9tqc/rFNyl8hcVG", "red"); - OS.exit(0); + var versions = p.stdout.read().split("."), + majorVersion = parseInt(versions[0], 10), + minorVersion = parseInt(versions[1], 10), + buildVersion = parseInt(versions[2], 10); + + if (majorVersion < 10 || minorVersion < 7) + { + colorPrint("XcodeCapp can only be built on Mac OS X 10.7+. You can download the binary here: https://www.dropbox.com/sh/gxdgm356gyb9tqc/rFNyl8hcVG", "red"); + + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + OS.exit(0); + } } } - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + } if (executableExists("xcodebuild")) { diff --git a/Tools/nib2cib/Converter.j b/Tools/nib2cib/Converter.j index 58a2eedbf..09407a086 100644 --- a/Tools/nib2cib/Converter.j +++ b/Tools/nib2cib/Converter.j @@ -119,14 +119,19 @@ ConverterConversionException = @"ConverterConversionException"; // Compile xib or nib to make sure we have a non-new format nib. temporaryNibFilePath = FILE.join("/tmp", FILE.basename(aFilePath) + ".tmp.nib"); - var p = OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]); + try + { + var p = OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]); + if (p.wait() === 1) + [CPException raise:ConverterConversionException reason:@"Could not compile file: " + aFilePath]; + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + } - if (p.wait() === 1) - [CPException raise:ConverterConversionException reason:@"Could not compile file: " + aFilePath]; - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); } else { @@ -136,14 +141,18 @@ ConverterConversionException = @"ConverterConversionException"; // Convert from binary plist to XML plist var temporaryPlistFilePath = FILE.join("/tmp", FILE.basename(aFilePath) + ".tmp.plist"); - var p = OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]); - - if (p.wait() === 1) - [CPException raise:ConverterConversionException reason:@"Could not convert to xml plist for file: " + aFilePath]; - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); + try + { + var p = OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]); + if (p.wait() === 1) + [CPException raise:ConverterConversionException reason:@"Could not convert to xml plist for file: " + aFilePath]; + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); + } if (!FILE.isReadable(temporaryPlistFilePath)) [CPException raise:ConverterConversionException reason:@"Unable to convert nib file."]; diff --git a/common.jake b/common.jake index 103e658c4..f50b85b11 100644 --- a/common.jake +++ b/common.jake @@ -378,16 +378,21 @@ global.setPackageMetadata = function(packagePath) { var pkg = JSON.parse(FILE.read(packagePath, { charset : "UTF-8" })); - var p = OS.popen(["git", "rev-parse", "--verify", "HEAD"]); - if (p.wait() === 0) { - var sha = p.stdout.read().split("\n")[0]; - if (sha.length === 40) - pkg["cappuccino-revision"] = sha; + try + { + var p = OS.popen(["git", "rev-parse", "--verify", "HEAD"]); + if (p.wait() === 0) { + var sha = p.stdout.read().split("\n")[0]; + if (sha.length === 40) + pkg["cappuccino-revision"] = sha; + } + } + finally + { + p.stdin.close(); + p.stdout.close(); + p.stderr.close(); } - - p.stdin.close(); - p.stdout.close(); - p.stderr.close(); pkg["cappuccino-timestamp"] = new Date().getTime(); pkg["version"] = getCappuccinoVersion();