about summary refs log tree commit diff
path: root/src/nix-hash/nix-hash.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-hash/nix-hash.cc')
-rw-r--r--src/nix-hash/nix-hash.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/nix-hash/nix-hash.cc b/src/nix-hash/nix-hash.cc
new file mode 100644
index 000000000000..af3dda4ad7b8
--- /dev/null
+++ b/src/nix-hash/nix-hash.cc
@@ -0,0 +1,64 @@
+#include "hash.hh"
+#include "shared.hh"
+
+#include <iostream>
+
+
+using namespace nix;
+
+
+void printHelp()
+{
+    showManPage("nix-hash");
+}
+
+
+void run(Strings args)
+{
+    HashType ht = htMD5;
+    bool flat = false;
+    bool base32 = false;
+    bool truncate = false;
+    enum { opHash, opTo32, opTo16 } op = opHash;
+
+    Strings ss;
+
+    for (Strings::iterator i = args.begin();
+         i != args.end(); i++)
+    {
+        if (*i == "--flat") flat = true;
+        else if (*i == "--base32") base32 = true;
+        else if (*i == "--truncate") truncate = true;
+        else if (*i == "--type") {
+            ++i;
+            if (i == args.end()) throw UsageError("`--type' requires an argument");
+            ht = parseHashType(*i);
+            if (ht == htUnknown)
+                throw UsageError(format("unknown hash type `%1%'") % *i);
+        }
+        else if (*i == "--to-base16") op = opTo16;
+        else if (*i == "--to-base32") op = opTo32;
+        else ss.push_back(*i);
+    }
+
+    if (op == opHash) {
+        foreach (Strings::iterator, i, ss) {
+            Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i).first;
+            if (truncate && h.hashSize > 20) h = compressHash(h, 20);
+            std::cout << format("%1%\n") %
+                (base32 ? printHash32(h) : printHash(h));
+        }
+    }
+
+    else {
+        foreach (Strings::iterator, i, ss) {
+            Hash h = parseHash16or32(ht, *i);
+            std::cout << format("%1%\n") %
+                (op == opTo16 ? printHash(h) : printHash32(h));
+        }
+    }
+}
+
+
+string programId = "nix-hash";
+