about summary refs log tree commit diff
path: root/src/hash.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/hash.hh')
-rw-r--r--src/hash.hh19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/hash.hh b/src/hash.hh
index 9d72e66dbdea..13c5275b468a 100644
--- a/src/hash.hh
+++ b/src/hash.hh
@@ -50,6 +50,11 @@ Hash hashFile(const string & fileName);
    follows:
 
    hash(path) = md5(dump(path))
+*/
+Hash hashPath(const string & path);
+
+
+/* Dump a path as follows:
 
    IF path points to a REGULAR FILE:
      dump(path) = attrs(
@@ -60,7 +65,7 @@ Hash hashFile(const string & fileName);
    IF path points to a DIRECTORY:
      dump(path) = attrs(
        [ ("type", "directory")
-       , ("entries", concat(map(f, entries(path))))
+       , ("entries", concat(map(f, sort(entries(path)))))
        ])
        where f(fn) = attrs(
          [ ("name", fn)
@@ -72,17 +77,25 @@ Hash hashFile(const string & fileName);
      attrs(as) = concat(map(attr, as)) + encN(0) 
      attrs((a, b)) = encS(a) + encS(b)
 
-     encS(s) = encN(len(s)) + s
+     encS(s) = encN(len(s)) + s + (padding until next 64-bit boundary)
 
      encN(n) = 64-bit little-endian encoding of n.
 
      contents(path) = the contents of a regular file.
 
+     sort(strings) = lexicographic sort by 8-bit value (strcmp).
+
      entries(path) = the entries of a directory, without `.' and
      `..'.
 
      `+' denotes string concatenation. */
-Hash hashPath(const string & path);
+
+struct DumpSink 
+{
+    virtual void operator () (const unsigned char * data, unsigned int len) = 0;
+};
+
+void dumpPath(const string & path, DumpSink & sink);
 
 
 #endif /* !__HASH_H */