about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/store.cc8
-rw-r--r--src/libstore/store.hh3
-rw-r--r--src/nix-store/main.cc23
3 files changed, 28 insertions, 6 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 946be5e02b7b..9f50e597eb34 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 3b18664de646..d5d8ea81eae8 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 6e590ba06f9c..543a84210bd2 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();