* Move parseHash16or32 into libutil, and use in nix-hash.

This commit is contained in:
Eelco Dolstra 2011-12-02 11:47:06 +00:00
parent b12b21825c
commit 49f59dceca
5 changed files with 23 additions and 22 deletions

View file

@ -401,17 +401,7 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v)
HashType ht = parseHashType(outputHashAlgo); HashType ht = parseHashType(outputHashAlgo);
if (ht == htUnknown) if (ht == htUnknown)
throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo); throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo);
Hash h(ht); Hash h = parseHash16or32(ht, outputHash);
if (outputHash.size() == h.hashSize * 2)
/* hexadecimal representation */
h = parseHash(ht, outputHash);
else if (outputHash.size() == hashLength32(h))
/* base-32 representation */
h = parseHash32(ht, outputHash);
else
throw Error(format("hash `%1%' has wrong length for hash type `%2%'")
% outputHash % outputHashAlgo);
string s = outputHash;
outputHash = printHash(h); outputHash = printHash(h);
if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo;

View file

@ -204,6 +204,22 @@ Hash parseHash32(HashType ht, const string & s)
} }
Hash parseHash16or32(HashType ht, const string & s)
{
Hash hash(ht);
if (s.size() == hash.hashSize * 2)
/* hexadecimal representation */
hash = parseHash(ht, s);
else if (s.size() == hashLength32(hash))
/* base-32 representation */
hash = parseHash32(ht, s);
else
throw Error(format("hash `%1%' has wrong length for hash type `%2%'")
% s % printHashType(ht));
return hash;
}
bool isHash(const string & s) bool isHash(const string & s)
{ {
if (s.length() != 32) return false; if (s.length() != 32) return false;

View file

@ -58,6 +58,9 @@ string printHash32(const Hash & hash);
/* Parse a base-32 representation of a hash code. */ /* Parse a base-32 representation of a hash code. */
Hash parseHash32(HashType ht, const string & s); Hash parseHash32(HashType ht, const string & s);
/* Parse a base-16 or base-32 representation of a hash code. */
Hash parseHash16or32(HashType ht, const string & s);
/* Verify that the given string is a valid hash code. */ /* Verify that the given string is a valid hash code. */
bool isHash(const string & s); bool isHash(const string & s);

View file

@ -43,7 +43,7 @@ void run(Strings args)
} }
if (op == opHash) { if (op == opHash) {
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) { foreach (Strings::iterator, i, ss) {
Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i).first; Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i).first;
if (truncate && h.hashSize > 20) h = compressHash(h, 20); if (truncate && h.hashSize > 20) h = compressHash(h, 20);
std::cout << format("%1%\n") % std::cout << format("%1%\n") %
@ -52,8 +52,8 @@ void run(Strings args)
} }
else { else {
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) { foreach (Strings::iterator, i, ss) {
Hash h = op == opTo16 ? parseHash32(ht, *i) : parseHash(ht, *i); Hash h = parseHash16or32(ht, *i);
std::cout << format("%1%\n") % std::cout << format("%1%\n") %
(op == opTo16 ? printHash(h) : printHash32(h)); (op == opTo16 ? printHash(h) : printHash32(h));
} }

View file

@ -133,14 +133,6 @@ static void opAddFixed(Strings opFlags, Strings opArgs)
} }
static Hash parseHash16or32(HashType ht, const string & s)
{
return s.size() == Hash(ht).hashSize * 2
? parseHash(ht, s)
: parseHash32(ht, s);
}
/* Hack to support caching in `nix-prefetch-url'. */ /* Hack to support caching in `nix-prefetch-url'. */
static void opPrintFixedPath(Strings opFlags, Strings opArgs) static void opPrintFixedPath(Strings opFlags, Strings opArgs)
{ {