aboutsummaryrefslogtreecommitdiff
path: root/src/nix-hash/nix-hash.cc
blob: 8035162aea37a53575ab73b77da321d2d1f11ce7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "hash.hh"
#include "shared.hh"

#include <iostream>

using namespace nix;


int main(int argc, char * * argv)
{
    HashType ht = htMD5;
    bool flat = false;
    bool base32 = false;
    bool truncate = false;
    enum { opHash, opTo32, opTo16 } op = opHash;

    Strings ss;

    return handleExceptions(argv[0], [&]() {
        initNix();

        parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
            if (*arg == "--help")
                showManPage("nix-hash");
            else if (*arg == "--version")
                printVersion("nix-hash");
            else if (*arg == "--flat") flat = true;
            else if (*arg == "--base32") base32 = true;
            else if (*arg == "--truncate") truncate = true;
            else if (*arg == "--type") {
                string s = getArg(*arg, arg, end);
                ht = parseHashType(s);
                if (ht == htUnknown)
                    throw UsageError(format("unknown hash type ‘%1%’") % s);
            }
            else if (*arg == "--to-base16") op = opTo16;
            else if (*arg == "--to-base32") op = opTo32;
            else if (*arg != "" && arg->at(0) == '-')
                return false;
            else
                ss.push_back(*arg);
            return true;
        });

        if (op == opHash) {
            for (auto & 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 {
            for (auto & i : ss) {
                Hash h = parseHash16or32(ht, i);
                std::cout << format("%1%\n") %
                    (op == opTo16 ? printHash(h) : printHash32(h));
            }
        }
    });
}