diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 250441c..be9efa5 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -335,7 +335,7 @@ 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); } @@ -347,7 +347,7 @@ 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); } @@ -488,11 +488,7 @@ 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); } diff --git a/source/dub/package_.d b/source/dub/package_.d index ce00e08..87d2aee 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -631,58 +631,24 @@ 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); - } + return environment + .get("DUB_PACKAGES_USED", "") + .splitter(",") + .canFind(pack); +} - // Load from envar if not already loaded - private static void ensureLoaded() - { - if (!loaded) - load(); - } +void storeRecursiveInvokations(string[string] env, string[] packs) +{ + import std.process : environment; + + env["DUB_PACKAGES_USED"] = environment + .get("DUB_PACKAGES_USED", "") + .splitter(",") + .chain(packs) + .join(","); }