Redesign the fix's implementation as per suggestion in PR.
1 parent 5dc1083 commit e025934922fded68e5eb0e57ab9aa07166f7e56c
@Nick Sabalausky Nick Sabalausky authored on 15 Sep 2015
Showing 2 changed files
View
16
source/dub/generators/generator.d
*/
private void prepareGeneration(in Package pack, in Project proj, in GeneratorSettings settings,
in BuildSettings buildsettings)
{
if (buildsettings.preGenerateCommands.length && !PackagesUsed.has(pack.name)) {
if (buildsettings.preGenerateCommands.length && !isRecursiveInvocation(pack.name)) {
logInfo("Running pre-generate commands for %s...", pack.name);
runBuildCommands(buildsettings.preGenerateCommands, pack, proj, settings, buildsettings);
}
}
*/
private void finalizeGeneration(in Package pack, in Project proj, in GeneratorSettings settings,
in BuildSettings buildsettings, Path target_path, bool generate_binary)
{
if (buildsettings.postGenerateCommands.length && !PackagesUsed.has(pack.name)) {
if (buildsettings.postGenerateCommands.length && !isRecursiveInvocation(pack.name)) {
logInfo("Running post-generate commands for %s...", pack.name);
runBuildCommands(buildsettings.postGenerateCommands, pack, proj, settings, buildsettings);
}
 
env["DUB_PARALLEL_BUILD"] = settings.parallelBuild? "TRUE" : "";
 
env["DUB_RUN_ARGS"] = (cast(string[])settings.runArgs).map!(escapeShellFileName).join(" ");
PackagesUsed.add(proj.rootPackage.name);
foreach (dep; proj.dependencies)
PackagesUsed.add(dep.name);
PackagesUsed.store(env);
PackagesUsed.load(); // Refresh internal list from actual current environment
auto depNames = proj.dependencies.map!((a) => a.name).array();
storeRecursiveInvokations(env, proj.rootPackage.name ~ depNames);
runCommands(commands, env);
}
View
115
source/dub/package_.d
}
 
return null;
}
 
/// All packages being used by all parent DUB processes (if any).
/// Used to avoid infinite process recursion.
static class PackagesUsed
bool isRecursiveInvocation(string pack)
{
import std.process : environment;
private static bool loaded = false;
private static bool[string] packageNames;
private enum envVarName = "DUB_PACKAGES_USED";
static void add(string pack)
{
ensureLoaded();
packageNames[pack] = true;
}
static void add(string[] packs)
{
ensureLoaded();
foreach (p; packs)
packageNames[p] = true;
}
static bool has(string pack)
{
ensureLoaded();
return !!(pack in packageNames);
}
// Store in envvar
static void store(string[string] env)
{
auto commaList = packageNames.keys.sort().join(",");
env[envVarName] = commaList;
}
// Load from envvar
static void load()
{
auto commaList = environment.get(envVarName);
loaded = true;
 
packageNames = null;
foreach (name; commaList.split(","))
add(name);
}
 
// Load from envar if not already loaded
private static void ensureLoaded()
{
if (!loaded)
load();
}
 
return environment
.get("DUB_PACKAGES_USED", "")
.splitter(",")
.canFind(pack);
}
 
void storeRecursiveInvokations(string[string] env, string[] packs)
{
import std.process : environment;
 
env["DUB_PACKAGES_USED"] = environment
.get("DUB_PACKAGES_USED", "")
.splitter(",")
.chain(packs)
.join(",");
}