mirror of
https://github.com/NixOS/nix.git
synced 2025-12-06 00:51:00 +01:00
* Get Fix and Nix to work again.
This commit is contained in:
parent
7b3f44e05b
commit
d41d085b77
6 changed files with 93 additions and 268 deletions
265
src/fstate.cc
265
src/fstate.cc
|
|
@ -194,228 +194,6 @@ static FSId storeSuccessor(const FSId & id1, FState sc)
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static FState realise(FState fs, StringSet & paths)
|
||||
{
|
||||
char * s1, * s2, * s3;
|
||||
Content content;
|
||||
ATermList refs, ins, bnds;
|
||||
|
||||
/* First repeatedly try to substitute $fs$ by any known successors
|
||||
in order to speed up the rewrite process. */
|
||||
{
|
||||
string fsHash, scHash;
|
||||
while (queryDB(nixDB, dbSuccessors, fsHash = hashTerm(fs), scHash)) {
|
||||
debug(format("successor %1% -> %2%") % (string) fsHash % scHash);
|
||||
string path;
|
||||
FState fs2 = termFromHash(parseHash(scHash), &path);
|
||||
paths.insert(path);
|
||||
if (fs == fs2) {
|
||||
debug(format("successor cycle detected in %1%") % printTerm(fs));
|
||||
break;
|
||||
}
|
||||
fs = fs2;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fall through. */
|
||||
|
||||
if (ATmatch(fs, "Include(<str>)", &s1)) {
|
||||
string path;
|
||||
fs = termFromHash(parseHash(s1), &path);
|
||||
paths.insert(path);
|
||||
return realise(fs, paths);
|
||||
}
|
||||
|
||||
else if (ATmatch(fs, "Path(<str>, <term>, [<list>])", &s1, &content, &refs)) {
|
||||
string path(s1);
|
||||
|
||||
msg(format("realising atomic path %1%") % path);
|
||||
Nest nest(true);
|
||||
|
||||
if (path[0] != '/')
|
||||
throw Error(format("path `%1% is not absolute") % path);
|
||||
|
||||
/* Realise referenced paths. */
|
||||
ATermList refs2 = ATempty;
|
||||
while (!ATisEmpty(refs)) {
|
||||
refs2 = ATinsert(refs2, realise(ATgetFirst(refs), paths));
|
||||
refs = ATgetNext(refs);
|
||||
}
|
||||
refs2 = ATreverse(refs2);
|
||||
|
||||
if (!ATmatch(content, "Hash(<str>)", &s1))
|
||||
throw badTerm("hash expected", content);
|
||||
Hash hash = parseHash(s1);
|
||||
|
||||
/* Normal form. */
|
||||
ATerm nf = ATmake("Path(<str>, <term>, <term>)",
|
||||
path.c_str(), content, refs2);
|
||||
|
||||
/* Register the normal form. */
|
||||
nf = storeSuccessor(fs, nf, paths);
|
||||
|
||||
/* Expand the hash into the target path. */
|
||||
expandHash(hash, path);
|
||||
|
||||
return nf;
|
||||
}
|
||||
|
||||
else if (ATmatch(fs, "Derive(<str>, <str>, [<list>], <str>, [<list>])",
|
||||
&s1, &s2, &ins, &s3, &bnds))
|
||||
{
|
||||
string platform(s1), builder(s2), outPath(s3);
|
||||
|
||||
msg(format("realising derivate path %1%") % outPath);
|
||||
Nest nest(true);
|
||||
|
||||
checkPlatform(platform);
|
||||
|
||||
/* Realise inputs. */
|
||||
Strings inPaths;
|
||||
ATermList ins2 = ATempty;
|
||||
while (!ATisEmpty(ins)) {
|
||||
FState in = realise(ATgetFirst(ins), paths);
|
||||
inPaths.push_back(fstatePath(in));
|
||||
ins2 = ATinsert(ins2, in);
|
||||
ins = ATgetNext(ins);
|
||||
}
|
||||
ins = ATreverse(ins2);
|
||||
|
||||
/* Build the environment. */
|
||||
Environment env;
|
||||
while (!ATisEmpty(bnds)) {
|
||||
ATerm bnd = ATgetFirst(bnds);
|
||||
if (!ATmatch(bnd, "(<str>, <str>)", &s1, &s2))
|
||||
throw badTerm("tuple of strings expected", bnd);
|
||||
env[s1] = s2;
|
||||
bnds = ATgetNext(bnds);
|
||||
}
|
||||
|
||||
/* Check whether the target already exists. */
|
||||
if (pathExists(outPath))
|
||||
deleteFromStore(outPath);
|
||||
// throw Error(format("path %1% already exists") % outPath);
|
||||
|
||||
/* Run the builder. */
|
||||
runProgram(builder, env);
|
||||
|
||||
/* Check whether the result was created. */
|
||||
if (!pathExists(outPath))
|
||||
throw Error(format("program %1% failed to create a result in %2%")
|
||||
% builder % outPath);
|
||||
|
||||
#if 0
|
||||
/* Remove write permission from the value. */
|
||||
int res = system(("chmod -R -w " + targetPath).c_str()); // !!! escaping
|
||||
if (WEXITSTATUS(res) != 0)
|
||||
throw Error("cannot remove write permission from " + targetPath);
|
||||
#endif
|
||||
|
||||
/* Hash the result. */
|
||||
Hash outHash = hashPath(outPath);
|
||||
|
||||
/* Register targetHash -> targetPath. !!! this should be in
|
||||
values.cc. */
|
||||
registerPath(outPath, outHash);
|
||||
|
||||
/* Filter out inputs that are not referenced in the output. */
|
||||
for (Strings::iterator i = inPaths.begin();
|
||||
i != inPaths.end(); i++)
|
||||
debug(format("in: %1%") % *i);
|
||||
|
||||
Strings outPaths = filterReferences(outPath, inPaths);
|
||||
|
||||
for (Strings::iterator i = outPaths.begin();
|
||||
i != outPaths.end(); i++)
|
||||
debug(format("out: %1%") % *i);
|
||||
|
||||
ins2 = ATempty;
|
||||
while (!ATisEmpty(ins)) {
|
||||
FState in = ATgetFirst(ins);
|
||||
string path = fstatePath(in);
|
||||
for (Strings::iterator i = outPaths.begin();
|
||||
i != outPaths.end(); i++)
|
||||
if (path.find(*i) != string::npos) {
|
||||
debug(format("out2: %1%") % path);
|
||||
ins2 = ATinsert(ins2, in);
|
||||
}
|
||||
ins = ATgetNext(ins);
|
||||
}
|
||||
ins = ATreverse(ins2);
|
||||
|
||||
/* Register the normal form of fs. */
|
||||
FState nf = ATmake("Path(<str>, Hash(<str>), <term>)",
|
||||
outPath.c_str(), ((string) outHash).c_str(), ins);
|
||||
nf = storeSuccessor(fs, nf, paths);
|
||||
|
||||
return nf;
|
||||
}
|
||||
|
||||
throw badTerm("bad fstate expression", fs);
|
||||
}
|
||||
|
||||
|
||||
FState realiseFState(FState fs, StringSet & paths)
|
||||
{
|
||||
return realise(fs, paths);
|
||||
}
|
||||
|
||||
|
||||
string fstatePath(FState fs)
|
||||
{
|
||||
char * s1, * s2, * s3;
|
||||
FState e1, e2;
|
||||
if (ATmatch(fs, "Path(<str>, <term>, [<list>])", &s1, &e1, &e2))
|
||||
return s1;
|
||||
else if (ATmatch(fs, "Derive(<str>, <str>, [<list>], <str>, [<list>])",
|
||||
&s1, &s2, &e1, &s3, &e2))
|
||||
return s3;
|
||||
else if (ATmatch(fs, "Include(<str>)", &s1))
|
||||
return fstatePath(termFromHash(parseHash(s1)));
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
void fstateRefs2(FState fs, StringSet & paths)
|
||||
{
|
||||
char * s1, * s2, * s3;
|
||||
FState e1, e2;
|
||||
ATermList refs, ins;
|
||||
|
||||
if (ATmatch(fs, "Path(<str>, <term>, [<list>])", &s1, &e1, &refs)) {
|
||||
paths.insert(s1);
|
||||
|
||||
while (!ATisEmpty(refs)) {
|
||||
fstateRefs2(ATgetFirst(refs), paths);
|
||||
refs = ATgetNext(refs);
|
||||
}
|
||||
}
|
||||
|
||||
else if (ATmatch(fs, "Derive(<str>, <str>, [<list>], <str>, [<list>])",
|
||||
&s1, &s2, &ins, &s3, &e2))
|
||||
{
|
||||
while (!ATisEmpty(ins)) {
|
||||
fstateRefs2(ATgetFirst(ins), paths);
|
||||
ins = ATgetNext(ins);
|
||||
}
|
||||
}
|
||||
|
||||
else if (ATmatch(fs, "Include(<str>)", &s1))
|
||||
fstateRefs2(termFromHash(parseHash(s1)), paths);
|
||||
|
||||
else throw badTerm("bad fstate expression", fs);
|
||||
}
|
||||
|
||||
|
||||
void fstateRefs(FState fs, StringSet & paths)
|
||||
{
|
||||
fstateRefs2(fs, paths);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void parseIds(ATermList ids, FSIds & out)
|
||||
{
|
||||
while (!ATisEmpty(ids)) {
|
||||
|
|
@ -424,7 +202,6 @@ static void parseIds(ATermList ids, FSIds & out)
|
|||
if (!ATmatch(id, "<str>", &s))
|
||||
throw badTerm("not an id", id);
|
||||
out.push_back(parseHash(s));
|
||||
debug(s);
|
||||
ids = ATgetNext(ids);
|
||||
}
|
||||
}
|
||||
|
|
@ -691,3 +468,45 @@ void realiseSlice(const Slice & slice)
|
|||
expandId(elem.id, elem.path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Strings fstatePaths(FSId id)
|
||||
{
|
||||
Strings paths;
|
||||
|
||||
FState fs = termFromId(id);
|
||||
|
||||
ATermList outs, ins, bnds;
|
||||
char * builder;
|
||||
char * platform;
|
||||
|
||||
if (ATgetType(fs) == AT_APPL &&
|
||||
(string) ATgetName(ATgetAFun(fs)) == "Slice")
|
||||
{
|
||||
Slice slice = parseSlice(fs);
|
||||
|
||||
/* !!! fix complexity */
|
||||
for (FSIds::const_iterator i = slice.roots.begin();
|
||||
i != slice.roots.end(); i++)
|
||||
for (SliceElems::const_iterator j = slice.elems.begin();
|
||||
j != slice.elems.end(); j++)
|
||||
if (*i == j->id) paths.push_back(j->path);
|
||||
}
|
||||
|
||||
else if (ATmatch(fs, "Derive([<list>], [<list>], <str>, <str>, [<list>])",
|
||||
&outs, &ins, &builder, &platform, &bnds))
|
||||
{
|
||||
while (!ATisEmpty(outs)) {
|
||||
ATerm t = ATgetFirst(outs);
|
||||
char * s1, * s2;
|
||||
if (!ATmatch(t, "(<str>, <str>)", &s1, &s2))
|
||||
throw badTerm("string expected", t);
|
||||
paths.push_back(s1);
|
||||
outs = ATgetNext(outs);
|
||||
}
|
||||
}
|
||||
|
||||
else throw badTerm("in fstatePaths", fs);
|
||||
|
||||
return paths;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue