Use try/finally to ensure popen streams are always closed

This commit is contained in:
Antoine Mercadal
2015-05-09 10:22:13 -07:00
parent 9bcaef192c
commit c603326e58
10 changed files with 172 additions and 112 deletions
+18 -12
View File
@@ -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("");
}
+14 -12
View File
@@ -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;
};
+14 -12
View File
@@ -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;
};
+14 -9
View File
@@ -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))
+12 -7
View File
@@ -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)
{
@@ -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;
}
+11 -6
View File
@@ -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);
+23 -14
View File
@@ -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"))
{
+24 -15
View File
@@ -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."];
+14 -9
View File
@@ -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();