mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-06 10:53:42 +00:00
FIXED: Closes all streams after a OS.popen()
Previously, when popen was called, the 3 streams (stdin, stderr and stdourt) where never closed. This was the reason of the having an impossible number of open files. This patch ensure all streams are closed after using them. This means that the ulimit trick is no more necessary
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
|
||||
require("../common.jake");
|
||||
|
||||
checkUlimit();
|
||||
|
||||
var framework = require("objective-j/jake").framework,
|
||||
BundleTask = require("objective-j/jake").BundleTask;
|
||||
|
||||
|
||||
+17
-8
@@ -366,22 +366,31 @@ function pressEnvironment(rootPath, outputFiles, environment, options) {
|
||||
return {executable:includedBytes, data:dataBytes, mhtml:mhtmlBytes};
|
||||
}
|
||||
|
||||
function pngcrushDirectory(directory) {
|
||||
var directoryPath = FILE.path(directory);
|
||||
var pngs = directoryPath.glob("**/*.png");
|
||||
function pngcrushDirectory(directory)
|
||||
{
|
||||
var directoryPath = FILE.path(directory),
|
||||
pngs = directoryPath.glob("**/*.png");
|
||||
|
||||
system.stderr.print("Running pngcrush on " + pngs.length + " pngs:");
|
||||
pngs.forEach(function(dstPath) {
|
||||
var tmpPath = FILE.path(dstPath+".tmp");
|
||||
pngs.forEach(function(dstPath)
|
||||
{
|
||||
var tmpPath = FILE.path(dstPath+".tmp"),
|
||||
p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]);
|
||||
|
||||
var p = OS.popen(["pngcrush", "-rem", "alla", "-reduce", /*"-brute",*/ dstPath, tmpPath]);
|
||||
if (p.wait()) {
|
||||
if (p.wait())
|
||||
{
|
||||
CPLog.warn("pngcrush failed. Ensure it's installed and on your PATH.");
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
FILE.move(tmpPath, dstPath);
|
||||
system.stderr.write(".").flush();
|
||||
}
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
});
|
||||
system.stderr.print("");
|
||||
}
|
||||
|
||||
@@ -3,10 +3,18 @@ var OS = require("os");
|
||||
|
||||
exports.fontinfo = function(name, size)
|
||||
{
|
||||
var p = OS.popen(["fontinfo", "-n", name, size || 12]);
|
||||
var p = OS.popen(["fontinfo", "-n", name, size || 12]),
|
||||
result;
|
||||
|
||||
if (p.wait() === 0)
|
||||
return JSON.parse(p.stdout.read());
|
||||
result = p.stdout.read();
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
if (result)
|
||||
return JSON.parse(result);
|
||||
else
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -3,10 +3,18 @@ var OS = require("os");
|
||||
|
||||
exports.imagesize = function(path)
|
||||
{
|
||||
var p = OS.popen(["imagesize", "-n", path]);
|
||||
var p = OS.popen(["imagesize", "-n", path]),
|
||||
result;
|
||||
|
||||
if (p.wait() === 0)
|
||||
return JSON.parse(p.stdout.read());
|
||||
result = p.stdout.read();
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
if (result)
|
||||
return JSON.parse(result);
|
||||
else
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -135,6 +135,10 @@ function generateDocs(/* boolean */ noFrame)
|
||||
if (doxygenApps[0])
|
||||
doxygen = FILE.join(doxygenApps[0], "Contents/Resources/doxygen");
|
||||
}
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
}
|
||||
|
||||
if (!doxygen || !FILE.exists(doxygen))
|
||||
|
||||
@@ -277,12 +277,12 @@ CFHTTPRequest.prototype.removeEventListener = function(/*String*/ anEventName, /
|
||||
this._eventDispatcher.removeEventListener(anEventName, anEventListener);
|
||||
};
|
||||
|
||||
CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials)
|
||||
CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials)
|
||||
{
|
||||
this._nativeRequest.withCredentials = willSendWithCredentials;
|
||||
};
|
||||
|
||||
CFHTTPRequest.prototype.withCredentials = function()
|
||||
CFHTTPRequest.prototype.withCredentials = function()
|
||||
{
|
||||
return this._nativeRequest.withCredentials;
|
||||
};
|
||||
@@ -330,6 +330,10 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress)
|
||||
while (chunk = gcc.stdout.read())
|
||||
fileContents += chunk;
|
||||
|
||||
gcc.stdin.close();
|
||||
gcc.stdout.close();
|
||||
gcc.stderr.close();
|
||||
|
||||
if (fileContents.length > 0)
|
||||
{
|
||||
request._nativeRequest.responseText = fileContents;
|
||||
|
||||
@@ -46,7 +46,8 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc
|
||||
|
||||
if (!shouldObjjPreprocess)
|
||||
{
|
||||
if (OS.popen("which gcc").stdout.read().length === 0)
|
||||
var p = OS.popen("which gcc");
|
||||
if (p.stdout.read().length === 0)
|
||||
fileContents = FILE.read(aFilePath, { charset:"UTF-8" });
|
||||
else
|
||||
{
|
||||
@@ -57,7 +58,15 @@ function compileWithResolvedFlags(aFilePath, objjcFlags, gccFlags, asPlainJavasc
|
||||
while (chunk = gcc.stdout.read())
|
||||
fileContents += chunk;
|
||||
|
||||
gcc.stdin.close();
|
||||
gcc.stdout.close();
|
||||
gcc.stderr.close();
|
||||
}
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
return fileContents;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
var FILE = require("file");
|
||||
|
||||
|
||||
var BUNDLE_TASK = require("objective-j/jake/bundletask");
|
||||
|
||||
exports.BundleTask = BUNDLE_TASK.BundleTask;
|
||||
|
||||
@@ -40,8 +40,8 @@ $BROWSER_FILES = new FileList($BROWSER_FILE).include($OBJECTIVEJ_FILES);
|
||||
|
||||
filedir($BUILD_BROWSER_FILE, $BROWSER_FILES, function(aTask)
|
||||
{
|
||||
gcc($BROWSER_FILE,
|
||||
$BUILD_BROWSER_FILE,
|
||||
gcc($BROWSER_FILE,
|
||||
$BUILD_BROWSER_FILE,
|
||||
environmentFlags("Browser", "ObjJ").concat($INCLUDE_FLAGS, $DEBUG_FLAGS), $CONFIGURATION !== "Debug");
|
||||
});
|
||||
|
||||
@@ -119,12 +119,16 @@ function gcc(inputFilePath, outputFilePath, flags, compress)
|
||||
stream.print("Building... \0green(" + outputFilePath +"\0)");
|
||||
|
||||
// GCC preprocess the file.
|
||||
var cmd = ["gcc", "-E", "-x", "c", "-P"].concat(flags, inputFilePath).join(" ");
|
||||
var gcc = OS.popen(cmd, { charset:"UTF-8" });
|
||||
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" });
|
||||
|
||||
var contents = FILE.read("header.txt", { charset : "UTF-8" });
|
||||
contents += gcc.stdout.read();
|
||||
|
||||
gcc.stdin.close();
|
||||
gcc.stdout.close();
|
||||
gcc.stderr.close();
|
||||
|
||||
if (FILE.extension(inputFilePath) === ".js" && compress)
|
||||
contents = compressor(contents);
|
||||
|
||||
|
||||
@@ -25,11 +25,14 @@ task ("build", function()
|
||||
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");
|
||||
|
||||
OS.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
if (executableExists("xcodebuild"))
|
||||
{
|
||||
var args = "-sdk macosx -alltargets -configuration Release",
|
||||
|
||||
@@ -119,8 +119,14 @@ 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");
|
||||
|
||||
if (OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]).wait() === 1)
|
||||
var p = OS.popen(["/usr/bin/ibtool", aFilePath, "--compile", temporaryNibFilePath]);
|
||||
|
||||
if (p.wait() === 1)
|
||||
[CPException raise:ConverterConversionException reason:@"Could not compile file: " + aFilePath];
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -130,9 +136,15 @@ ConverterConversionException = @"ConverterConversionException";
|
||||
// Convert from binary plist to XML plist
|
||||
var temporaryPlistFilePath = FILE.join("/tmp", FILE.basename(aFilePath) + ".tmp.plist");
|
||||
|
||||
if (OS.popen(["/usr/bin/plutil", "-convert", "xml1", temporaryNibFilePath, "-o", temporaryPlistFilePath]).wait() === 1)
|
||||
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();
|
||||
|
||||
if (!FILE.isReadable(temporaryPlistFilePath))
|
||||
[CPException raise:ConverterConversionException reason:@"Unable to convert nib file."];
|
||||
|
||||
|
||||
@@ -28,27 +28,7 @@ var OS = require("os"),
|
||||
|
||||
function main(args)
|
||||
{
|
||||
checkUlimit();
|
||||
|
||||
var nib2cib = [[Nib2Cib alloc] initWithArgs:args];
|
||||
|
||||
[nib2cib run];
|
||||
}
|
||||
|
||||
function checkUlimit()
|
||||
{
|
||||
var minUlimit = 1024,
|
||||
p = OS.popen(["ulimit", "-n"]);
|
||||
|
||||
if (p.wait() === 0)
|
||||
{
|
||||
var limit = p.stdout.read().split("\n")[0];
|
||||
|
||||
if (Number(limit) < minUlimit)
|
||||
{
|
||||
stream.print("\0red(\0bold(WARNING:\0)\0) nib2cib may need to open more files than this terminal session currently allows (" + limit + "). Add the following line to your login configuration file (.bash_profile, .bashrc, etc.), start a new terminal session, then try again:\n");
|
||||
stream.print("ulimit -n " + minUlimit);
|
||||
OS.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-25
@@ -385,6 +385,10 @@ global.setPackageMetadata = function(packagePath)
|
||||
pkg["cappuccino-revision"] = sha;
|
||||
}
|
||||
|
||||
p.stdin.close();
|
||||
p.stdout.close();
|
||||
p.stderr.close();
|
||||
|
||||
pkg["cappuccino-timestamp"] = new Date().getTime();
|
||||
pkg["version"] = getCappuccinoVersion();
|
||||
|
||||
@@ -577,31 +581,6 @@ global.colorPrint = function(/* String */ message, /* String */ color)
|
||||
stream.print(colorize(message, color));
|
||||
};
|
||||
|
||||
var minUlimit = 1024;
|
||||
|
||||
global.checkUlimit = function()
|
||||
{
|
||||
var ulimitPath = executableExists("ulimit");
|
||||
|
||||
if (!ulimitPath)
|
||||
return;
|
||||
|
||||
var p = OS.popen([ulimitPath, "-n"]);
|
||||
|
||||
if (p.wait() === 0)
|
||||
{
|
||||
var limit = p.stdout.read().split("\n")[0];
|
||||
|
||||
if (Number(limit) < minUlimit)
|
||||
{
|
||||
stream.print("\0red(\0bold(ERROR:\0)\0) Cappuccino may need to open more files than this terminal session currently allows (" + limit + "). Add the following line to your login configuration file (.bash_profile, .bashrc, etc.), start a new terminal session, then try again:\n");
|
||||
stream.print("ulimit -n " + minUlimit);
|
||||
OS.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// built in tasks
|
||||
|
||||
task ("build");
|
||||
|
||||
Reference in New Issue
Block a user