Support URLs in $NIX_PATH
This didn't work (despite claims in the manual), because the colon in "http://" was parsed as a element separator. So handle "://" specially.
This commit is contained in:
parent
0d4d92fcf9
commit
65f17cd330
3 changed files with 32 additions and 1 deletions
|
@ -234,6 +234,18 @@ void initGC()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Very hacky way to parse $NIX_PATH, which is colon-separated, but
|
||||||
|
can contain URLs (e.g. "nixpkgs=https://bla...:foo=https://"). */
|
||||||
|
static Strings parseNixPath(const string & in)
|
||||||
|
{
|
||||||
|
string marker = "\001//";
|
||||||
|
auto res = tokenizeString<Strings>(replaceStrings(in, "://", marker), ":");
|
||||||
|
for (auto & s : res)
|
||||||
|
s = replaceStrings(s, marker, "://");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EvalState::EvalState(const Strings & _searchPath)
|
EvalState::EvalState(const Strings & _searchPath)
|
||||||
: sWith(symbols.create("<with>"))
|
: sWith(symbols.create("<with>"))
|
||||||
, sOutPath(symbols.create("outPath"))
|
, sOutPath(symbols.create("outPath"))
|
||||||
|
@ -266,7 +278,7 @@ EvalState::EvalState(const Strings & _searchPath)
|
||||||
assert(gcInitialised);
|
assert(gcInitialised);
|
||||||
|
|
||||||
/* Initialise the Nix expression search path. */
|
/* Initialise the Nix expression search path. */
|
||||||
Strings paths = tokenizeString<Strings>(getEnv("NIX_PATH", ""), ":");
|
Strings paths = parseNixPath(getEnv("NIX_PATH", ""));
|
||||||
for (auto & i : _searchPath) addToSearchPath(i, true);
|
for (auto & i : _searchPath) addToSearchPath(i, true);
|
||||||
for (auto & i : paths) addToSearchPath(i);
|
for (auto & i : paths) addToSearchPath(i);
|
||||||
addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs");
|
addToSearchPath("nix=" + settings.nixDataDir + "/nix/corepkgs");
|
||||||
|
|
|
@ -1095,6 +1095,20 @@ string trim(const string & s, const string & whitespace)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string replaceStrings(const std::string & s,
|
||||||
|
const std::string & from, const std::string & to)
|
||||||
|
{
|
||||||
|
if (from.empty()) return s;
|
||||||
|
string res = s;
|
||||||
|
size_t pos = 0;
|
||||||
|
while ((pos = res.find(from, pos)) != std::string::npos) {
|
||||||
|
res.replace(pos, from.size(), to);
|
||||||
|
pos += to.size();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
string statusToString(int status)
|
string statusToString(int status)
|
||||||
{
|
{
|
||||||
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
||||||
|
|
|
@ -341,6 +341,11 @@ string chomp(const string & s);
|
||||||
string trim(const string & s, const string & whitespace = " \n\r\t");
|
string trim(const string & s, const string & whitespace = " \n\r\t");
|
||||||
|
|
||||||
|
|
||||||
|
/* Replace all occurrences of a string inside another string. */
|
||||||
|
string replaceStrings(const std::string & s,
|
||||||
|
const std::string & from, const std::string & to);
|
||||||
|
|
||||||
|
|
||||||
/* Convert the exit status of a child as returned by wait() into an
|
/* Convert the exit status of a child as returned by wait() into an
|
||||||
error string. */
|
error string. */
|
||||||
string statusToString(int status);
|
string statusToString(int status);
|
||||||
|
|
Loading…
Reference in a new issue