#include <map>
#include <string>
-#include "format.h"
#include "ref.h"
#include "statcache.h"
+#include "util.h"
using std::list;
using std::map;
return pathcmp(slash1 + 1, slash2 + 1);
}
-void StatCache::Open(const char *path, const char *snapshot_name)
+void StatCache::Open(const char *path, const char *snapshot_name,
+ const char *snapshot_scheme)
{
oldpath = path;
oldpath += "/statcache";
+ if (snapshot_scheme != NULL)
+ oldpath = oldpath + "-" + snapshot_scheme;
newpath = oldpath + "." + snapshot_name;
oldcache = new ifstream(oldpath.c_str());
old_mtime = -1;
old_ctime = -1;
old_inode = -1;
+ old_size = -1;
old_checksum = "";
old_contents.clear();
- /* First, read in the filename. TODO: Unescaping. */
+ /* First, read in the filename. */
getline(cache, old_name);
if (!cache) {
end_of_cache = true;
return;
}
+ old_name = uri_decode(old_name);
/* Start reading in the fields which follow the filename. */
string field = "";
old_ctime = parse_int(fields["ctime"]);
if (fields.count("inode"))
old_inode = parse_int(fields["inode"]);
+ if (fields.count("size"))
+ old_size = parse_int(fields["size"]);
old_checksum = fields["checksum"];
return false;
if ((long long)stat_buf->st_ino != old_inode)
return false;
+ if (stat_buf->st_size != old_size)
+ return false;
/* File looks to be unchanged. */
return true;
*newcache << "mtime: " << encode_int(stat_buf->st_mtime) << "\n"
<< "ctime: " << encode_int(stat_buf->st_ctime) << "\n"
<< "inode: " << encode_int(stat_buf->st_ino) << "\n"
+ << "size: " << encode_int(stat_buf->st_size) << "\n"
<< "checksum: " << checksum << "\n";
*newcache << "blocks:";