about summary refs log tree commit diff
path: root/src/hash.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-06-16T16·16+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-06-16T16·16+0000
commit727beb798a701ff546adc65030f1562b87283947 (patch)
tree35d7efad8474d2da096dd1026c784df5d585e9b7 /src/hash.cc
parent2f04e7102eaad3159073019af96e6e5c4f2c9bcf (diff)
* Canonicalization: when hashing directories, sort the directory
  entries by name.

Diffstat (limited to 'src/hash.cc')
-rw-r--r--src/hash.cc20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/hash.cc b/src/hash.cc
index 9558d36705f3..37f6104fb0d6 100644
--- a/src/hash.cc
+++ b/src/hash.cc
@@ -154,24 +154,30 @@ static void dumpEntries(const string & path, DumpSink & sink)
 {
     DIR * dir = opendir(path.c_str());
     if (!dir) throw SysError("opening directory " + path);
-    
-    struct dirent * dirent;
 
-    /* !!! sort entries */
+    Strings names;
 
+    struct dirent * dirent;
     while (errno = 0, dirent = readdir(dir)) {
         string name = dirent->d_name;
         if (name == "." || name == "..") continue;
+        names.push_back(name);
+    }
+    if (errno) throw SysError("reading directory " + path);
+
+    sort(names.begin(), names.end());
+
+    for (Strings::iterator it = names.begin();
+         it != names.end(); it++)
+    {
         writeString("entry", sink);
         writeString("(", sink);
         writeString("name", sink);
-        writeString(name, sink);
+        writeString(*it, sink);
         writeString("file", sink);
-        dumpPath(path + "/" + name, sink);
+        dumpPath(path + "/" + *it, sink);
         writeString(")", sink);
     }
-
-    if (errno) throw SysError("reading directory " + path);
     
     closedir(dir); /* !!! close on exception */
 }