about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-01-13T15·44+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-01-13T15·44+0000
commit73992371a3bc16b27b22e53d5f7ae600dea9cf60 (patch)
treed1e5db8cea5caacff34ac4e9b61195b97dbd9ceb
parentd46b4262dc84689c3916583b91ed9fc6dafefdd6 (diff)
* Refactoring to support SHA-1.
-rw-r--r--src/libexpr/primops.cc6
-rw-r--r--src/libstore/store.cc2
-rw-r--r--src/libutil/hash.cc20
-rw-r--r--src/libutil/hash.hh16
-rw-r--r--src/nix-env/main.cc4
-rw-r--r--src/nix-store/dotgraph.cc6
6 files changed, 36 insertions, 18 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 41b444b20d44..fe9a601ea107 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 f545d52eecab..cb5967182aa8 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 752b269125cb..1a44c85341e4 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 0062f987c021..0b5e46cc6b65 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 c2f5cdccb8c8..5321b294ab71 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<Path, DrvInfo> DrvInfos;
diff --git a/src/nix-store/dotgraph.cc b/src/nix-store/dotgraph.cc
index c670bf19e4c5..b13846c049c1 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;
 }