diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 0e81f7b72..66173cdaf 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -401,17 +401,7 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v) HashType ht = parseHashType(outputHashAlgo); if (ht == htUnknown) throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo); - Hash h(ht); - 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; + Hash h = parseHash16or32(ht, outputHash); outputHash = printHash(h); if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc index b9e784699..533423441 100644 --- a/src/libutil/hash.cc +++ b/src/libutil/hash.cc @@ -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) { if (s.length() != 32) return false; diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh index 13740954d..cbdcf4c8d 100644 --- a/src/libutil/hash.hh +++ b/src/libutil/hash.hh @@ -58,6 +58,9 @@ string printHash32(const Hash & hash); /* Parse a base-32 representation of a hash code. */ 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. */ bool isHash(const string & s); diff --git a/src/nix-hash/nix-hash.cc b/src/nix-hash/nix-hash.cc index 4867234bf..5b35ccd9d 100644 --- a/src/nix-hash/nix-hash.cc +++ b/src/nix-hash/nix-hash.cc @@ -43,7 +43,7 @@ void run(Strings args) } 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; if (truncate && h.hashSize > 20) h = compressHash(h, 20); std::cout << format("%1%\n") % @@ -52,8 +52,8 @@ void run(Strings args) } else { - for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) { - Hash h = op == opTo16 ? parseHash32(ht, *i) : parseHash(ht, *i); + foreach (Strings::iterator, i, ss) { + Hash h = parseHash16or32(ht, *i); std::cout << format("%1%\n") % (op == opTo16 ? printHash(h) : printHash32(h)); } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 84d3da032..740033b45 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -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'. */ static void opPrintFixedPath(Strings opFlags, Strings opArgs) {