From eb07a4f1ee532833407b40a9992bfe65c8a4d1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 31 Mar 2010 08:29:01 +0000 Subject: [PATCH 1/7] Escape `>' signs in the XML output. * src/libutil/xml-writer.cc (nix::XMLWriter::writeAttrs): Escape `>'. --- src/libutil/xml-writer.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libutil/xml-writer.cc b/src/libutil/xml-writer.cc index 20351e2c3..7d698bf6a 100644 --- a/src/libutil/xml-writer.cc +++ b/src/libutil/xml-writer.cc @@ -91,6 +91,7 @@ void XMLWriter::writeAttrs(const XMLAttrs & attrs) char c = i->second[j]; if (c == '"') output << """; else if (c == '<') output << "<"; + else if (c == '>') output << ">"; else if (c == '&') output << "&"; /* Escape newlines to prevent attribute normalisation (see XML spec, section 3.3.3. */ From 471419d1fac21412dea9a47eff200d44cd75d825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 31 Mar 2010 08:29:05 +0000 Subject: [PATCH 2/7] Add source location information to the XML output. * src/libexpr/expr-to-xml.cc (nix::showAttrs): Dereference the attribute RHS. Add "path", "line", and "column" XML attributes to the node when source location information is available. (nix::printTermAsXML): Likewise for functions. --- src/libexpr/expr-to-xml.cc | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index e401001ea..4ca71c889 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -34,8 +34,25 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) names.insert(aterm2String(i->key)); for (StringSet::iterator i = names.begin(); i != names.end(); ++i) { - XMLOpenElement _(doc, "attr", singletonAttrs("name", *i)); - printTermAsXML(attrs.get(toATerm(*i)), doc, context, drvsSeen); + ATerm attrRHS = attrs.get(toATerm(*i)); + ATerm attr; + Pos pos; + XMLAttrs xmlAttrs; + + xmlAttrs["name"] = *i; + if(matchAttrRHS(attrRHS, attr, pos)) { + ATerm path; + int line, column; + if (matchPos(pos, path, line, column)) { + xmlAttrs["path"] = aterm2String(path); + xmlAttrs["line"] = (format("%1%") % line).str(); + xmlAttrs["column"] = (format("%1%") % column).str(); + } + } else + abort(); // Should not happen. + + XMLOpenElement _(doc, "attr", xmlAttrs); + printTermAsXML(attr, doc, context, drvsSeen); } } @@ -97,9 +114,12 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, else if (matchAttrs(e, as)) { ATermMap attrs; - queryAllAttrs(e, attrs); + queryAllAttrs(e, attrs, true); - Expr a = attrs.get(toATerm("type")); + Expr aRHS = attrs.get(toATerm("type")); + Expr a = NULL; + if (aRHS) + matchAttrRHS(aRHS, a, pos); if (a && matchStr(a, s, context) && s == "derivation") { XMLAttrs xmlAttrs; @@ -135,7 +155,15 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, } else if (matchFunction(e, pat, body, pos)) { - XMLOpenElement _(doc, "function"); + ATerm path; + int line, column; + XMLAttrs xmlAttrs; + if (matchPos(pos, path, line, column)) { + xmlAttrs["path"] = aterm2String(path); + xmlAttrs["line"] = (format("%1%") % line).str(); + xmlAttrs["column"] = (format("%1%") % column).str(); + } + XMLOpenElement _(doc, "function", xmlAttrs); printPatternAsXML(pat, doc); } From 09381cccffe675ccbc8d183f043788f99dc018cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 31 Mar 2010 12:38:31 +0000 Subject: [PATCH 3/7] Make source location info in the XML output optional. * src/libexpr/expr-to-xml.cc (nix::showAttrs): Add `location' parameter. Provide location XML attributes when it's true. Update callers. (nix::printTermAsXML): Likewise. * src/libexpr/expr-to-xml.hh (nix::printTermAsXML): Update prototype; have `location' default to `false'. * src/nix-instantiate/nix-instantiate.cc (printResult, processExpr): Add `location' parameter; update callers. (run): Add support for `--no-location'. * src/nix-instantiate/help.txt: Update accordingly. * tests/lang.sh: Invoke `nix-instantiate' with `--no-location' for the XML tests. * tests/lang/eval-okay-toxml.exp, tests/lang/eval-okay-to-xml.nix: New files. --- src/libexpr/expr-to-xml.cc | 22 +++++++++++----------- src/libexpr/expr-to-xml.hh | 2 +- src/nix-instantiate/help.txt | 2 ++ src/nix-instantiate/nix-instantiate.cc | 15 +++++++++------ tests/lang.sh | 3 ++- tests/lang/eval-okay-toxml.exp | 1 + tests/lang/eval-okay-toxml.nix | 3 +++ 7 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 tests/lang/eval-okay-toxml.exp create mode 100644 tests/lang/eval-okay-toxml.nix diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index 4ca71c889..5857537d7 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -24,11 +24,11 @@ typedef set ExprSet; static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen); + ExprSet & drvsSeen, bool location); static void showAttrs(const ATermMap & attrs, XMLWriter & doc, - PathSet & context, ExprSet & drvsSeen) + PathSet & context, ExprSet & drvsSeen, bool location) { StringSet names; for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) @@ -43,7 +43,7 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, if(matchAttrRHS(attrRHS, attr, pos)) { ATerm path; int line, column; - if (matchPos(pos, path, line, column)) { + if (location && matchPos(pos, path, line, column)) { xmlAttrs["path"] = aterm2String(path); xmlAttrs["line"] = (format("%1%") % line).str(); xmlAttrs["column"] = (format("%1%") % column).str(); @@ -52,7 +52,7 @@ static void showAttrs(const ATermMap & attrs, XMLWriter & doc, abort(); // Should not happen. XMLOpenElement _(doc, "attr", xmlAttrs); - printTermAsXML(attr, doc, context, drvsSeen); + printTermAsXML(attr, doc, context, drvsSeen, location); } } @@ -83,7 +83,7 @@ static void printPatternAsXML(Pattern pat, XMLWriter & doc) static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen) + ExprSet & drvsSeen, bool location) { XMLAttrs attrs; string s; @@ -137,28 +137,28 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, if (drvsSeen.find(e) == drvsSeen.end()) { drvsSeen.insert(e); - showAttrs(attrs, doc, context, drvsSeen); + showAttrs(attrs, doc, context, drvsSeen, location); } else doc.writeEmptyElement("repeated"); } else { XMLOpenElement _(doc, "attrs"); - showAttrs(attrs, doc, context, drvsSeen); + showAttrs(attrs, doc, context, drvsSeen, location); } } else if (matchList(e, es)) { XMLOpenElement _(doc, "list"); for (ATermIterator i(es); i; ++i) - printTermAsXML(*i, doc, context, drvsSeen); + printTermAsXML(*i, doc, context, drvsSeen, location); } else if (matchFunction(e, pat, body, pos)) { ATerm path; int line, column; XMLAttrs xmlAttrs; - if (matchPos(pos, path, line, column)) { + if (location && matchPos(pos, path, line, column)) { xmlAttrs["path"] = aterm2String(path); xmlAttrs["line"] = (format("%1%") % line).str(); xmlAttrs["column"] = (format("%1%") % column).str(); @@ -172,12 +172,12 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, } -void printTermAsXML(Expr e, std::ostream & out, PathSet & context) +void printTermAsXML(Expr e, std::ostream & out, PathSet & context, bool location) { XMLWriter doc(true, out); XMLOpenElement root(doc, "expr"); ExprSet drvsSeen; - printTermAsXML(e, doc, context, drvsSeen); + printTermAsXML(e, doc, context, drvsSeen, location); } diff --git a/src/libexpr/expr-to-xml.hh b/src/libexpr/expr-to-xml.hh index 36b8e4042..de9d55f32 100644 --- a/src/libexpr/expr-to-xml.hh +++ b/src/libexpr/expr-to-xml.hh @@ -9,7 +9,7 @@ namespace nix { -void printTermAsXML(Expr e, std::ostream & out, PathSet & context); +void printTermAsXML(Expr e, std::ostream & out, PathSet & context, bool location = false); } diff --git a/src/nix-instantiate/help.txt b/src/nix-instantiate/help.txt index fa0a4590e..21822132a 100644 --- a/src/nix-instantiate/help.txt +++ b/src/nix-instantiate/help.txt @@ -22,6 +22,8 @@ Options: For --eval-only / --parse-only: --xml: print an XML representation of the abstract syntax tree + --no-location: don't provide source location information in the + output XML tree For --eval-only: diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index 3822de5c6..21f352f25 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -38,13 +38,13 @@ static bool indirectRoot = false; static void printResult(EvalState & state, Expr e, - bool evalOnly, bool xmlOutput, const ATermMap & autoArgs) + bool evalOnly, bool xmlOutput, bool location, const ATermMap & autoArgs) { PathSet context; if (evalOnly) if (xmlOutput) - printTermAsXML(e, std::cout, context); + printTermAsXML(e, std::cout, context, location); else std::cout << format("%1%\n") % canonicaliseExpr(e); @@ -67,7 +67,7 @@ static void printResult(EvalState & state, Expr e, void processExpr(EvalState & state, const Strings & attrPaths, bool parseOnly, bool strict, const ATermMap & autoArgs, - bool evalOnly, bool xmlOutput, Expr e) + bool evalOnly, bool xmlOutput, bool location, Expr e) { for (Strings::const_iterator i = attrPaths.begin(); i != attrPaths.end(); ++i) { Expr e2 = findAlongAttrPath(state, *i, autoArgs, e); @@ -76,7 +76,7 @@ void processExpr(EvalState & state, const Strings & attrPaths, e2 = strictEvalExpr(state, e2); else e2 = evalExpr(state, e2); - printResult(state, e2, evalOnly, xmlOutput, autoArgs); + printResult(state, e2, evalOnly, xmlOutput, location, autoArgs); } } @@ -89,6 +89,7 @@ void run(Strings args) bool evalOnly = false; bool parseOnly = false; bool xmlOutput = false; + bool xmlOutputSourceLocation = true; bool strict = false; Strings attrPaths; ATermMap autoArgs(128); @@ -124,6 +125,8 @@ void run(Strings args) indirectRoot = true; else if (arg == "--xml") xmlOutput = true; + else if (arg == "--no-location") + xmlOutputSourceLocation = false; else if (arg == "--strict") strict = true; else if (arg[0] == '-') @@ -139,7 +142,7 @@ void run(Strings args) if (readStdin) { Expr e = parseStdin(state); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, e); + evalOnly, xmlOutput, xmlOutputSourceLocation, e); } for (Strings::iterator i = files.begin(); @@ -148,7 +151,7 @@ void run(Strings args) Path path = absPath(*i); Expr e = parseExprFromFile(state, path); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, e); + evalOnly, xmlOutput, xmlOutputSourceLocation, e); } printEvalStats(state); diff --git a/tests/lang.sh b/tests/lang.sh index 18eb0278c..54f010763 100644 --- a/tests/lang.sh +++ b/tests/lang.sh @@ -54,7 +54,8 @@ for i in lang/eval-okay-*.nix; do fi if test -e lang/$i.exp.xml; then - if ! $nixinstantiate --eval-only --xml --strict lang/$i.nix > lang/$i.out.xml; then + if ! $nixinstantiate --eval-only --xml --no-location --strict \ + lang/$i.nix > lang/$i.out.xml; then echo "FAIL: $i should evaluate" fail=1 elif ! cmp -s lang/$i.out.xml lang/$i.exp.xml; then diff --git a/tests/lang/eval-okay-toxml.exp b/tests/lang/eval-okay-toxml.exp new file mode 100644 index 000000000..379f3c076 --- /dev/null +++ b/tests/lang/eval-okay-toxml.exp @@ -0,0 +1 @@ +Str("\n\n \n \n \n \n \n\n",[]) diff --git a/tests/lang/eval-okay-toxml.nix b/tests/lang/eval-okay-toxml.nix new file mode 100644 index 000000000..068c97a6c --- /dev/null +++ b/tests/lang/eval-okay-toxml.nix @@ -0,0 +1,3 @@ +# Make sure the expected XML output is produced; in particular, make sure it +# doesn't contain source location information. +builtins.toXML { a = "s"; } From aac5fcfbb54ff64c593d8919f7f52025415ea996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 9 Apr 2010 21:30:55 +0000 Subject: [PATCH 4/7] Re-add `drvPath' and `outPath' attributes to XML nodes. This fixes a regression introduced in r20882 ("Add source location information to the XML output."). * src/libexpr/expr-to-xml.cc (nix::printTermAsXML): Dereference the attribute RHS from "drvPath" and "outPath". --- src/libexpr/expr-to-xml.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc index 5857537d7..1e59eebfc 100644 --- a/src/libexpr/expr-to-xml.cc +++ b/src/libexpr/expr-to-xml.cc @@ -124,15 +124,17 @@ static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, XMLAttrs xmlAttrs; Path outPath, drvPath; - - a = attrs.get(toATerm("drvPath")); + + aRHS = attrs.get(toATerm("drvPath")); + matchAttrRHS(aRHS, a, pos); if (matchStr(a, drvPath, context)) xmlAttrs["drvPath"] = drvPath; - - a = attrs.get(toATerm("outPath")); + + aRHS = attrs.get(toATerm("outPath")); + matchAttrRHS(aRHS, a, pos); if (matchStr(a, outPath, context)) xmlAttrs["outPath"] = outPath; - + XMLOpenElement _(doc, "derivation", xmlAttrs); if (drvsSeen.find(e) == drvsSeen.end()) { From d77331d32f33cc17398d3e1422d0114309ef62de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sun, 25 Apr 2010 20:52:49 +0000 Subject: [PATCH 5/7] Fixing a typo in the nix-store manual, that could confuse a bit too much (--delete/--gc) --- doc/manual/nix-store.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/nix-store.xml b/doc/manual/nix-store.xml index 566c75bf3..10bb3eda5 100644 --- a/doc/manual/nix-store.xml +++ b/doc/manual/nix-store.xml @@ -342,7 +342,7 @@ $ nix-store --gc --max-freed $((100 * 1024 * 1024)) nix-store - + paths From 4bab25a28d32f0551ac20b8b9b33e79af5decf0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Mon, 3 May 2010 13:13:38 +0000 Subject: [PATCH 6/7] buildenv: Special-case Python's `easy-install.pth' files. * corepkgs/buildenv/builder.pl.in (createLinks): Skip `easy-install.pth' files. Comment the hack. --- corepkgs/buildenv/builder.pl.in | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/corepkgs/buildenv/builder.pl.in b/corepkgs/buildenv/builder.pl.in index 9932ea577..4101f66a4 100755 --- a/corepkgs/buildenv/builder.pl.in +++ b/corepkgs/buildenv/builder.pl.in @@ -29,10 +29,16 @@ sub createLinks { $baseName =~ s/^.*\///g; # strip directory my $dstFile = "$dstDir/$baseName"; + # The files below are special-cased so that they don't show up + # in user profiles, either because they are useless, or + # because they would cause pointless collisions (e.g., each + # Python package brings its own + # `$out/lib/pythonX.Y/site-packages/easy-install.pth'.) # Urgh, hacky... - if ($srcFile =~ /\/propagated-build-inputs$/ || + if ($srcFile =~ /\/propagated-build-inputs$/ || $srcFile =~ /\/nix-support$/ || $srcFile =~ /\/perllocal.pod$/ || + $srcFile =~ /\/easy-install.pth$/ || $srcFile =~ /\/info\/dir$/ || $srcFile =~ /\/log$/) { From 4750065ada362bd46e85879975a3148e18df5b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 5 May 2010 20:46:41 +0000 Subject: [PATCH 7/7] buildenv: Special-case Python's `site.py' and `site.pyc'. * corepkgs/buildenv/builder.pl.in (createLinks): Skip `site.py' and `site.pyc' files. --- corepkgs/buildenv/builder.pl.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/corepkgs/buildenv/builder.pl.in b/corepkgs/buildenv/builder.pl.in index 4101f66a4..4a52df65e 100755 --- a/corepkgs/buildenv/builder.pl.in +++ b/corepkgs/buildenv/builder.pl.in @@ -39,6 +39,8 @@ sub createLinks { $srcFile =~ /\/nix-support$/ || $srcFile =~ /\/perllocal.pod$/ || $srcFile =~ /\/easy-install.pth$/ || + $srcFile =~ /\/site.py$/ || + $srcFile =~ /\/site.pyc$/ || $srcFile =~ /\/info\/dir$/ || $srcFile =~ /\/log$/) {