From 73992371a3bc16b27b22e53d5f7ae600dea9cf60 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 13 Jan 2005 15:44:44 +0000 Subject: [PATCH] * Refactoring to support SHA-1. --- src/libexpr/primops.cc | 6 +++--- src/libstore/store.cc | 2 +- src/libutil/hash.cc | 20 ++++++++++++-------- src/libutil/hash.hh | 16 +++++++++++++--- src/nix-env/main.cc | 4 ++++ src/nix-store/dotgraph.cc | 6 +++--- 6 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 41b444b20..fe9a601ea 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -60,7 +60,7 @@ static Path copyAtom(EvalState & state, const Path & srcPath) Hash drvHash = hashDerivation(state, ne); Path drvPath = writeTerm(unparseStoreExpr(ne), ""); - state.drvHashes[drvPath] = drvHash; + state.drvHashes.insert(make_pair(drvPath, drvHash)); state.drvRoots[drvPath] = ne.closure.roots; @@ -118,7 +118,7 @@ static void processBinding(EvalState & state, Expr e, StoreExpr & ne, PathSet drvRoots; drvRoots.insert(evalPath(state, a)); - state.drvHashes[drvPath] = drvHash; + state.drvHashes.insert(make_pair(drvPath, drvHash)); state.drvRoots[drvPath] = drvRoots; ss.push_back(addInput(state, drvPath, ne)); @@ -188,7 +188,7 @@ static Expr primDerivation(EvalState & state, const ATermVector & _args) ne.type = StoreExpr::neDerivation; string drvName; - Hash outHash; + Hash outHash(htMD5); bool outHashGiven = false; for (ATermIterator i(attrs.keys()); i; ++i) { diff --git a/src/libstore/store.cc b/src/libstore/store.cc index f545d52ee..cb5967182 100644 --- a/src/libstore/store.cc +++ b/src/libstore/store.cc @@ -416,7 +416,7 @@ Path addToStore(const Path & _srcPath) Path srcPath(absPath(_srcPath)); debug(format("adding `%1%' to the store") % srcPath); - Hash h; + Hash h(htMD5); { SwitchToOriginalUser sw; h = hashPath(srcPath); diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc index 752b26912..1a44c8534 100644 --- a/src/libutil/hash.cc +++ b/src/libutil/hash.cc @@ -8,14 +8,18 @@ extern "C" { #include "archive.hh" -Hash::Hash() +Hash::Hash(HashType type) { - memset(hash, 0, sizeof(hash)); + this->type = type; + if (type == htMD5) hashSize = md5HashSize; + else if (type == htSHA1) hashSize = sha1HashSize; + memset(hash, 0, hashSize); } bool Hash::operator == (const Hash & h2) const { + if (hashSize != h2.hashSize) return false; for (unsigned int i = 0; i < hashSize; i++) if (hash[i] != h2.hash[i]) return false; return true; @@ -52,10 +56,10 @@ Hash::operator string() const Hash parseHash(const string & s) { - Hash hash; - if (s.length() != Hash::hashSize * 2) + Hash hash(htMD5); + if (s.length() != hash.hashSize * 2) throw Error(format("invalid hash `%1%'") % s); - for (unsigned int i = 0; i < Hash::hashSize; i++) { + for (unsigned int i = 0; i < hash.hashSize; i++) { string s2(s, i * 2, 2); if (!isxdigit(s2[0]) || !isxdigit(s2[1])) throw Error(format("invalid hash `%1%'") % s); @@ -83,7 +87,7 @@ bool isHash(const string & s) Hash hashString(const string & s) { - Hash hash; + Hash hash(htMD5); md5_buffer(s.c_str(), s.length(), hash.hash); return hash; } @@ -91,7 +95,7 @@ Hash hashString(const string & s) Hash hashFile(const Path & path) { - Hash hash; + Hash hash(htMD5); FILE * file = fopen(path.c_str(), "rb"); if (!file) throw SysError(format("file `%1%' does not exist") % path); @@ -115,7 +119,7 @@ struct HashSink : DumpSink Hash hashPath(const Path & path) { - Hash hash; + Hash hash(htMD5); HashSink sink; md5_init_ctx(&sink.ctx); dumpPath(path, sink); diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh index 0062f987c..0b5e46cc6 100644 --- a/src/libutil/hash.hh +++ b/src/libutil/hash.hh @@ -8,13 +8,23 @@ using namespace std; +typedef enum { htMD5, htSHA1 } HashType; + + +const int md5HashSize = 16; +const int sha1HashSize = 20; + + struct Hash { - static const unsigned int hashSize = 16; - unsigned char hash[hashSize]; + static const unsigned int maxHashSize = 20; + unsigned int hashSize; + unsigned char hash[maxHashSize]; + + HashType type; /* Create a zeroed hash object. */ - Hash(); + Hash(HashType type); /* Check whether two hash are equal. */ bool operator == (const Hash & h2) const; diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index c2f5cdccb..5321b294a 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -34,6 +34,10 @@ struct DrvInfo Path drvPath; Path outPath; Hash drvHash; + + DrvInfo() : drvHash(htMD5) + { + } }; typedef map DrvInfos; diff --git a/src/nix-store/dotgraph.cc b/src/nix-store/dotgraph.cc index c670bf19e..b13846c04 100644 --- a/src/nix-store/dotgraph.cc +++ b/src/nix-store/dotgraph.cc @@ -39,9 +39,9 @@ static string makeNode(const string & id, const string & label, static string symbolicName(const string & path) { string p = baseNameOf(path); - if (isHash(string(p, 0, Hash::hashSize * 2)) && - p[Hash::hashSize * 2] == '-') - p = string(p, Hash::hashSize * 2 + 1); + if (isHash(string(p, 0, md5HashSize * 2)) && + p[md5HashSize * 2] == '-') + p = string(p, md5HashSize * 2 + 1); return p; }