* Print a better error message for wrong hashes (NIX-49).

This commit is contained in:
Eelco Dolstra 2006-09-20 16:15:32 +00:00
parent 22d13d6ec2
commit 0623359fbc
3 changed files with 16 additions and 4 deletions

View file

@ -353,13 +353,16 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
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; Hash h(ht);
if (outputHash.size() == Hash(ht).hashSize * 2) if (outputHash.size() == h.hashSize * 2)
/* hexadecimal representation */ /* hexadecimal representation */
h = parseHash(ht, outputHash); h = parseHash(ht, outputHash);
else else if (outputHash.size() == hashLength32(h))
/* base-32 representation */ /* base-32 representation */
h = parseHash32(ht, outputHash); h = parseHash32(ht, outputHash);
else
throw Error(format("hash `%1%' has wrong length for hash type `%2%'")
% outputHash % outputHashAlgo);
string s = outputHash; string s = outputHash;
outputHash = printHash(h); outputHash = printHash(h);
if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo;

View file

@ -120,6 +120,12 @@ static unsigned char divMod(unsigned char * bytes, unsigned char y)
} }
unsigned int hashLength32(const Hash & hash)
{
return (hash.hashSize * 8 - 1) / 5 + 1;
}
// omitted: E O U T // omitted: E O U T
const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz"; const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
@ -127,7 +133,7 @@ const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
string printHash32(const Hash & hash) string printHash32(const Hash & hash)
{ {
Hash hash2(hash); Hash hash2(hash);
unsigned int len = (hash.hashSize * 8 - 1) / 5 + 1; unsigned int len = hashLength32(hash);
const char * chars = base32Chars.c_str(); const char * chars = base32Chars.c_str();

View file

@ -49,6 +49,9 @@ string printHash(const Hash & hash);
/* Parse a hexadecimal representation of a hash code. */ /* Parse a hexadecimal representation of a hash code. */
Hash parseHash(HashType ht, const string & s); Hash parseHash(HashType ht, const string & s);
/* Returns the length of a base-32 hash representation. */
unsigned int hashLength32(const Hash & hash);
/* Convert a hash to a base-32 representation. */ /* Convert a hash to a base-32 representation. */
string printHash32(const Hash & hash); string printHash32(const Hash & hash);