From 330df4b4dbb363b69e10fa96d1e22f62088bfc96 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 19 Jan 2012 23:08:47 +0000 Subject: [PATCH] * Allow comparisons between derivations by comparing the outPath attributes. --- src/libexpr/eval.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 1e3f42edcc..9ebf6293bb 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1245,11 +1245,23 @@ bool EvalState::eqValues(Value & v1, Value & v2) return true; case tAttrs: { + /* If both attribute sets denote a derivation (type = + "derivation"), then compare their outPaths. */ + if (isDerivation(v1) && isDerivation(v2)) { + Bindings::iterator i = v1.attrs->find(sOutPath); + Bindings::iterator j = v2.attrs->find(sOutPath); + if (i != v1.attrs->end() && j != v2.attrs->end()) + return eqValues(*i->value, *j->value); + } + if (v1.attrs->size() != v2.attrs->size()) return false; - Bindings::iterator i = v1.attrs->begin(), j = v2.attrs->begin(); - for ( ; i != v1.attrs->end(); ++i, ++j) + + /* Otherwise, compare the attributes one by one. */ + Bindings::iterator i, j; + for (i = v1.attrs->begin(), j = v2.attrs->begin(); i != v1.attrs->end(); ++i, ++j) if (i->name != j->name || !eqValues(*i->value, *j->value)) return false; + return true; }