diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 043913be6..53ee8fe74 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -440,8 +440,13 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args) startNest(nest, lvlVomit, format("processing statedir attribute `%1%'") % statekey); try { string s = coerceToString(state, statevalue, context, true); - - if (statekey == "dir") { dir.path = s; } + if (statekey == "dir") { + //Add a / to the end if it's not there + if(s[s.length() - 1] != '/') + dir.path = s + "/"; + else + dir.path = s; + } else if (statekey == "type") { dir.type = s; } else if (statekey == "interval") { dir.interval = s; } else throw EvalError(format("invalid subattirbute `%1%' for attribute dirs") % statekey); diff --git a/src/libstore/build.cc b/src/libstore/build.cc index d10382ef2..d511e041b 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1381,7 +1381,7 @@ void DerivationGoal::startBuilder() //We only create state dirs when state is enabled and when the dirs need to be created before the installation if(drv.stateOutputs.size() != 0) if(drv.stateOutputs.find("state")->second.getCreateDirsBeforeInstall()) - createStateDirs(drv.stateOutputDirs, drv.stateOutputs); + createStateDirs(drv.stateOutputDirs, drv.stateOutputs, drv.env); /* For convenience, set an environment pointing to the top build directory. */ @@ -1616,7 +1616,7 @@ void DerivationGoal::computeClosure() //We create state dirs only when state is enabled and when the dirs need to be created after the installation if(drv.stateOutputs.size() != 0) if(!drv.stateOutputs.find("state")->second.getCreateDirsBeforeInstall()) - createStateDirs(drv.stateOutputDirs, drv.stateOutputs); + createStateDirs(drv.stateOutputDirs, drv.stateOutputs, drv.env); /* Check whether the output paths were created, and grep each output path to determine what other paths it references. Also make all diff --git a/src/libstore/derivations.hh b/src/libstore/derivations.hh index 9fe1d3914..da50c8a9b 100644 --- a/src/libstore/derivations.hh +++ b/src/libstore/derivations.hh @@ -40,8 +40,8 @@ struct DerivationStateOutput string hashAlgo; string hash; string enabled; - string shared; - string synchronization; + string shared; //none, full, group + string synchronization; //none, ... ? string createDirsBeforeInstall; DerivationStateOutput() { @@ -69,8 +69,8 @@ struct DerivationStateOutput struct DerivationStateOutputDir { string path; - string type; - string interval; + string type; //none, manual, interval, full + string interval; //type int DerivationStateOutputDir() { } diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index 91f88eab5..2e65df36d 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -29,7 +29,6 @@ bool readOnlyMode = false; string thisSystem = "unset"; unsigned int maxSilentTime = 0; - static bool settingsRead = false; static std::map settings; diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index d37b56469..75cfe83ce 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -75,7 +75,6 @@ extern string thisSystem; infinity. */ extern unsigned int maxSilentTime; - Strings querySetting(const string & name, const Strings & def); string querySetting(const string & name, const string & def); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index b878751a7..a555b8051 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -92,7 +92,18 @@ Path makeStatePath(const string & type, const Hash & hash, const string & suffix + "-" + suffix; } +Path makeStateReposPath(const string & type, const Hash & hash, const string & suffix) +{ + /* e.g., "source:sha256:1abc...:/nix/store:foo.tar.gz" */ + string s = type + ":sha256:" + printHash(hash) + ":" + + nixStoreState + ":" + suffix; + checkStoreName(suffix); //should this be here? + + return nixStoreStateRepos + "/" + + printHash32(compressHash(hashString(htSHA256, s), 20)) + + "-" + suffix; +} Path makeFixedOutputPath(bool recursive, string hashAlgo, Hash hash, string name) diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index e71c81d0e..321f09133 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -207,6 +207,9 @@ Path makeFixedOutputPath(bool recursive, /* Constructs a unique store state path name. */ Path makeStatePath(const string & type, const Hash & hash, const string & suffix); +/* Constructs a unique store state repos path name. */ +Path makeStateReposPath(const string & type, const Hash & hash, const string & suffix); + /* This is the preparatory part of addToStore() and addToStoreFixed(); it computes the store path to which srcPath is to be copied.