diff options
Diffstat (limited to 'src/hash.hh')
-rw-r--r-- | src/hash.hh | 19 |
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 */ |