diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-04-19 13:46:58 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-04-19 13:46:58 +0000 |
commit | efc7a579e880ec15ebe9afc0d8766c85c7d53ec2 (patch) | |
tree | c83d553fcdc3f3497b6645baa198288d499054a1 /src/libstore | |
parent | 55b5ddd3ca1ff4dfe4cfbfab92a4025d88ef6443 (diff) |
* Don't use the ATerm library for parsing/printing .drv files.
Diffstat (limited to 'src/libstore')
-rw-r--r-- | src/libstore/Makefile.am | 7 | ||||
-rw-r--r-- | src/libstore/derivations-ast.def | 10 | ||||
-rw-r--r-- | src/libstore/derivations.cc | 223 | ||||
-rw-r--r-- | src/libstore/derivations.hh | 11 | ||||
-rw-r--r-- | src/libstore/local-store.cc | 2 | ||||
-rw-r--r-- | src/libstore/misc.cc | 6 |
6 files changed, 117 insertions, 142 deletions
diff --git a/src/libstore/Makefile.am b/src/libstore/Makefile.am index 863871519..47681242f 100644 --- a/src/libstore/Makefile.am +++ b/src/libstore/Makefile.am @@ -12,12 +12,5 @@ pkginclude_HEADERS = \ libstore_la_LIBADD = ../libutil/libutil.la ../boost/format/libformat.la @ADDITIONAL_NETWORK_LIBS@ -BUILT_SOURCES = derivations-ast.cc derivations-ast.hh - -EXTRA_DIST = derivations-ast.def derivations-ast.cc - AM_CXXFLAGS = -Wall \ -I$(srcdir)/.. ${aterm_include} -I$(srcdir)/../libutil - -derivations-ast.cc derivations-ast.hh: ../aterm-helper.pl derivations-ast.def - $(perl) $(srcdir)/../aterm-helper.pl derivations-ast.hh derivations-ast.cc < $(srcdir)/derivations-ast.def diff --git a/src/libstore/derivations-ast.def b/src/libstore/derivations-ast.def deleted file mode 100644 index 574529ae7..000000000 --- a/src/libstore/derivations-ast.def +++ /dev/null @@ -1,10 +0,0 @@ -init initDerivationsHelpers - -Derive | ATermList ATermList ATermList string string ATermList ATermList | ATerm | - -| string string | ATerm | EnvBinding | -| string ATermList | ATerm | DerivationInput | -| string string string string | ATerm | DerivationOutput | - -Closure | ATermList ATermList | ATerm | OldClosure | -| string ATermList | ATerm | OldClosureElem | diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index bc2ec1f90..3d0f1eb42 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -1,22 +1,12 @@ #include "derivations.hh" #include "store-api.hh" -#include "aterm.hh" #include "globals.hh" #include "util.hh" -#include "derivations-ast.hh" -#include "derivations-ast.cc" - namespace nix { -Hash hashTerm(ATerm t) -{ - return hashString(htSHA256, atPrint(t)); -} - - Path writeDerivation(const Derivation & drv, const string & name) { PathSet references; @@ -27,137 +17,150 @@ Path writeDerivation(const Derivation & drv, const string & name) (that can be missing (of course) and should not necessarily be held during a garbage collection). */ string suffix = name + drvExtension; - string contents = atPrint(unparseDerivation(drv)); + string contents = unparseDerivation(drv); return readOnlyMode ? computeStorePathForText(suffix, contents, references) : store->addTextToStore(suffix, contents, references); } -static void checkPath(const string & s) +static Path parsePath(std::istream & str) { + string s = parseString(str); if (s.size() == 0 || s[0] != '/') throw Error(format("bad path `%1%' in derivation") % s); + return s; } -static void parseStrings(ATermList paths, StringSet & out, bool arePaths) +static StringSet parseStrings(std::istream & str, bool arePaths) { - for (ATermIterator i(paths); i; ++i) { - if (ATgetType(*i) != AT_APPL) - throw badTerm("not a path", *i); - string s = aterm2String(*i); - if (arePaths) checkPath(s); - out.insert(s); - } + StringSet res; + while (!endOfList(str)) + res.insert(arePaths ? parsePath(str) : parseString(str)); + return res; } + - -/* Shut up warnings. */ -void throwBadDrv(ATerm t) __attribute__ ((noreturn)); - -void throwBadDrv(ATerm t) -{ - throw badTerm("not a valid derivation", t); -} - - -Derivation parseDerivation(ATerm t) +Derivation parseDerivation(const string & s) { Derivation drv; - ATermList outs, inDrvs, inSrcs, args, bnds; - ATerm builder, platform; + std::istringstream str(s); + expect(str, "Derive(["); - if (!matchDerive(t, outs, inDrvs, inSrcs, platform, builder, args, bnds)) - throwBadDrv(t); - - for (ATermIterator i(outs); i; ++i) { - ATerm id, path, hashAlgo, hash; - if (!matchDerivationOutput(*i, id, path, hashAlgo, hash)) - throwBadDrv(t); + /* Parse the list of outputs. */ + while (!endOfList(str)) { DerivationOutput out; - out.path = aterm2String(path); - checkPath(out.path); - out.hashAlgo = aterm2String(hashAlgo); - out.hash = aterm2String(hash); - drv.outputs[aterm2String(id)] = out; + expect(str, "("); string id = parseString(str); + expect(str, ","); out.path = parsePath(str); + expect(str, ","); out.hashAlgo = parseString(str); + expect(str, ","); out.hash = parseString(str); + expect(str, ")"); + drv.outputs[id] = out; } - for (ATermIterator i(inDrvs); i; ++i) { - ATerm drvPath; - ATermList ids; - if (!matchDerivationInput(*i, drvPath, ids)) - throwBadDrv(t); - Path drvPath2 = aterm2String(drvPath); - checkPath(drvPath2); - StringSet ids2; - parseStrings(ids, ids2, false); - drv.inputDrvs[drvPath2] = ids2; + /* Parse the list of input derivations. */ + expect(str, ",["); + while (!endOfList(str)) { + expect(str, "("); + Path drvPath = parsePath(str); + expect(str, ",["); + drv.inputDrvs[drvPath] = parseStrings(str, false); + expect(str, ")"); } - - parseStrings(inSrcs, drv.inputSrcs, true); - drv.builder = aterm2String(builder); - drv.platform = aterm2String(platform); - - for (ATermIterator i(args); i; ++i) { - if (ATgetType(*i) != AT_APPL) - throw badTerm("string expected", *i); - drv.args.push_back(aterm2String(*i)); + expect(str, ",["); drv.inputSrcs = parseStrings(str, true); + expect(str, ","); drv.platform = parseString(str); + expect(str, ","); drv.builder = parseString(str); + + /* Parse the builder arguments. */ + expect(str, ",["); + while (!endOfList(str)) + drv.args.push_back(parseString(str)); + + /* Parse the environment variables. */ + expect(str, ",["); + while (!endOfList(str)) { + expect(str, "("); string name = parseString(str); + expect(str, ","); string value = parseString(str); + expect(str, ")"); + drv.env[name] = value; } + + expect(str, ")"); + return drv; +} - for (ATermIterator i(bnds); i; ++i) { - ATerm s1, s2; - if (!matchEnvBinding(*i, s1, s2)) - throw badTerm("tuple of strings expected", *i); - drv.env[aterm2String(s1)] = aterm2String(s2); - } - return drv; +void printString(std::ostream & str, const string & s) +{ + str << "\""; + for (const char * i = s.c_str(); *i; i++) + if (*i == '\"' || *i == '\\') str << "\\" << *i; + else if (*i == '\n') str << "\\n"; + else if (*i == '\r') str << "\\r"; + else if (*i == '\t') str << "\\t"; + else str << *i; + str << "\""; } -ATerm unparseDerivation(const Derivation & drv) +template<class ForwardIterator> +void printStrings(std::ostream & str, ForwardIterator i, ForwardIterator j) { - ATermList outputs = ATempty; - for (DerivationOutputs::const_reverse_iterator i = drv.outputs.rbegin(); - i != drv.outputs.rend(); ++i) - outputs = ATinsert(outputs, - makeDerivationOutput( - toATerm(i->first), - toATerm(i->second.path), - toATerm(i->second.hashAlgo), - toATerm(i->second.hash))); - - ATermList inDrvs = ATempty; - for (DerivationInputs::const_reverse_iterator i = drv.inputDrvs.rbegin(); - i != drv.inputDrvs.rend(); ++i) - inDrvs = ATinsert(inDrvs, - makeDerivationInput( - toATerm(i->first), - toATermList(i->second))); + str << "["; + bool first = true; + for ( ; i != j; ++i) { + if (first) first = false; else str << ","; + printString(str, *i); + } + str << "]"; +} + + +string unparseDerivation(const Derivation & drv) +{ + std::ostringstream str; + str << "Derive(["; + + bool first = true; + foreach (DerivationOutputs::const_iterator, i, drv.outputs) { + if (first) first = false; else str << ","; + str << "("; printString(str, i->first); + str << ","; printString(str, i->second.path); + str << ","; printString(str, i->second.hashAlgo); + str << ","; printString(str, i->second.hash); + str << ")"; + } + + str << "],["; + first = true; + foreach (DerivationInputs::const_iterator, i, drv.inputDrvs) { + if (first) first = false; else str << ","; + str << "("; printString(str, i->first); + str << ","; printStrings(str, i->second.begin(), i->second.end()); + str << ")"; + } + + str << "],"; + printStrings(str, drv.inputSrcs.begin(), drv.inputSrcs.end()); + + str << ","; printString(str, drv.platform); + str << ","; printString(str, drv.builder); + str << ","; printStrings(str, drv.args.begin(), drv.args.end()); + + str << ",["; + first = true; + foreach (StringPairs::const_iterator, i, drv.env) { + if (first) first = false; else str << ","; + str << "("; printString(str, i->first); + str << ","; printString(str, i->second); + str << ")"; + } + + str << "])"; - ATermList args = ATempty; - for (Strings::const_reverse_iterator i = drv.args.rbegin(); - i != drv.args.rend(); ++i) - args = ATinsert(args, toATerm(*i)); - - ATermList env = ATempty; - for (StringPairs::const_reverse_iterator i = drv.env.rbegin(); - i != drv.env.rend(); ++i) - env = ATinsert(env, - makeEnvBinding( - toATerm(i->first), - toATerm(i->second))); - - return makeDerive( - outputs, - inDrvs, - toATermList(drv.inputSrcs), - toATerm(drv.platform), - toATerm(drv.builder), - args, - env); + return str.str(); } diff --git a/src/libstore/derivations.hh b/src/libstore/derivations.hh index 042f4738d..95e49d42c 100644 --- a/src/libstore/derivations.hh +++ b/src/libstore/derivations.hh @@ -1,8 +1,6 @@ #ifndef __DERIVATIONS_H #define __DERIVATIONS_H -#include <aterm1.h> - #include "hash.hh" #include <map> @@ -53,17 +51,14 @@ struct Derivation }; -/* Hash an aterm. */ -Hash hashTerm(ATerm t); - /* Write a derivation to the Nix store, and return its path. */ Path writeDerivation(const Derivation & drv, const string & name); /* Parse a derivation. */ -Derivation parseDerivation(ATerm t); +Derivation parseDerivation(const string & s); -/* Parse a derivation. */ -ATerm unparseDerivation(const Derivation & drv); +/* Print a derivation. */ +string unparseDerivation(const Derivation & drv); /* Check whether a file name ends with the extensions for derivations. */ diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index a83ba55e2..2c0aa3579 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -3,8 +3,6 @@ #include "globals.hh" #include "archive.hh" #include "pathlocks.hh" -#include "aterm.hh" -#include "derivations-ast.hh" #include "worker-protocol.hh" #include <iostream> diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index 2d7d13a0e..f2cc20626 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -2,8 +2,6 @@ #include "store-api.hh" #include "local-store.hh" -#include <aterm2.h> - namespace nix { @@ -12,9 +10,7 @@ Derivation derivationFromPath(const Path & drvPath) { assertStorePath(drvPath); store->ensurePath(drvPath); - ATerm t = ATreadFromNamedFile(drvPath.c_str()); - if (!t) throw Error(format("cannot read aterm from `%1%'") % drvPath); - return parseDerivation(t); + return parseDerivation(readFile(drvPath)); } |