From 07b4399fb6f04d0cae58b8cf0a13efeeaf9d590b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 2 Mar 2005 15:57:06 +0000 Subject: [PATCH] * `nix-store -q --hash' to quickly query the hash of the contents of a store path (which is stored in the database). --- src/libstore/store.cc | 8 ++++++++ src/libstore/store.hh | 3 +++ src/nix-store/main.cc | 23 +++++++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/libstore/store.cc b/src/libstore/store.cc index 946be5e02b..9f50e597eb 100644 --- a/src/libstore/store.cc +++ b/src/libstore/store.cc @@ -509,6 +509,14 @@ static Hash queryHash(const Transaction & txn, const Path & storePath) } +Hash queryPathHash(const Path & path) +{ + if (!isValidPath(path)) + throw Error(format("path `%1%' is not valid") % path); + return queryHash(noTxn, path); +} + + void registerValidPath(const Transaction & txn, const Path & _path, const Hash & hash, const PathSet & references, const Path & deriver) diff --git a/src/libstore/store.hh b/src/libstore/store.hh index 3b18664de6..d5d8ea81ea 100644 --- a/src/libstore/store.hh +++ b/src/libstore/store.hh @@ -89,6 +89,9 @@ void canonicalisePathMetaData(const Path & path); /* Checks whether a path is valid. */ bool isValidPath(const Path & path); +/* Queries the hash of a valid path. */ +Hash queryPathHash(const Path & path); + /* Sets the set of outgoing FS references for a store path. Use with care! */ void setReferences(const Transaction & txn, const Path & storePath, diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc index 6e590ba06f..543a84210b 100644 --- a/src/nix-store/main.cc +++ b/src/nix-store/main.cc @@ -228,8 +228,9 @@ static void printDrvTree(const Path & drvPath, /* Perform various sorts of queries. */ static void opQuery(Strings opFlags, Strings opArgs) { - enum { qOutputs, qRequisites, qReferences, qReferers, - qReferersClosure, qDeriver, qBinding, qTree, qGraph } query = qOutputs; + enum { qOutputs, qRequisites, qReferences, qReferers + , qReferersClosure, qDeriver, qBinding, qHash + , qTree, qGraph } query = qOutputs; bool useOutput = false; bool includeOutputs = false; bool forceRealise = false; @@ -250,6 +251,7 @@ static void opQuery(Strings opFlags, Strings opArgs) opArgs.pop_front(); query = qBinding; } + else if (*i == "--hash") query = qHash; else if (*i == "--tree") query = qTree; else if (*i == "--graph") query = qGraph; else if (*i == "--use-output" || *i == "-u") useOutput = true; @@ -279,8 +281,7 @@ static void opQuery(Strings opFlags, Strings opArgs) for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); i++) { - *i = fixPath(*i); - Path path = maybeUseOutput(*i, useOutput, forceRealise); + Path path = maybeUseOutput(fixPath(*i), useOutput, forceRealise); if (query == qRequisites) storePathRequisites(path, includeOutputs, paths); else if (query == qReferences) queryReferences(noTxn, path, paths); @@ -295,8 +296,7 @@ static void opQuery(Strings opFlags, Strings opArgs) for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); i++) { - *i = fixPath(*i); - Path deriver = queryDeriver(noTxn, *i); + Path deriver = queryDeriver(noTxn, fixPath(*i)); cout << format("%1%\n") % (deriver == "" ? "unknown-deriver" : deriver); } @@ -316,6 +316,17 @@ static void opQuery(Strings opFlags, Strings opArgs) } break; + case qHash: + for (Strings::iterator i = opArgs.begin(); + i != opArgs.end(); i++) + { + Path path = maybeUseOutput(fixPath(*i), useOutput, forceRealise); + Hash hash = queryPathHash(path); + assert(hash.type == htSHA256); + cout << format("sha256:%1%\n") % printHash32(hash); + } + break; + case qTree: { PathSet done; for (Strings::iterator i = opArgs.begin();