# # add_file "fs_http.py" # # patch "dumb.py" # from [528fa3913c0f2e157f322668847e2d65458f4cbd] # to [e13ab5bf2026025a1b559f02fc88f164e23cf686] # # patch "fs.py" # from [7db22b570330d6be8190323f9a3af6333e458aa7] # to [ea1a06ff477257b93d3e620fe0fdf02e488db4fe] # # patch "fs_http.py" # from [] # to [b5c05a4be6317cf55e146da0646dde0599ecd381] # # patch "merkle_dir.py" # from [d62f79494aabfa58b47e3dece80f4f025b4440d5] # to [fa38d11914a8107a2fb7c9de37b002cb0053579f] # ======================================================================== --- dumb.py 528fa3913c0f2e157f322668847e2d65458f4cbd +++ dumb.py e13ab5bf2026025a1b559f02fc88f164e23cf686 @@ -7,6 +7,10 @@ from fs import readable_fs_for_url, writeable_fs_for_url import zlib +def do_rollback(url): + md = MerkleDir(writeable_fs_for_url(url)) + md.rollback() + def do_full_import(monotone, url): monotone.ensure_db() md = MerkleDir(readable_fs_for_url(url)) @@ -106,3 +110,9 @@ print "Pulled and imported %s packets from %s" % (pulled, other_url) print "Pushed %s packets to %s" % (pushed, other_url) +def main(name, args): + + +if __name__ = __main__: + import sys + main(sys.argv[0], sys.argv[1:]) ======================================================================== --- fs.py 7db22b570330d6be8190323f9a3af6333e458aa7 +++ fs.py ea1a06ff477257b93d3e620fe0fdf02e488db4fe @@ -36,10 +36,7 @@ def _real_fetch_bytes(self, filename, bytes): raise NotImplementedError - def exists(self, filename): - raise NotImplementedError - class WriteableFS (ReadableFS): # returns an object that supports write(), flush(), close() with standard # file object semantics @@ -73,6 +70,9 @@ def rmdir(self, filename): raise NotImplementedError + # ensure that the directory that this fs is running over exists, etc. + def ensure_dir(self): + raise NotImplementedError class LocalReadableFS(ReadableFS): def __init__(self, dir): @@ -101,9 +101,6 @@ f.seek(offset) yield ((offset, length), f.read(length)) - def exists(self, filename): - return os.path.exists(self._fname(filename)) - def size(self, filename): try: return os.stat(self._fname(filename)).st_size @@ -135,3 +132,9 @@ def rmdir(self, filename): os.rmdir(self._fname(filename)) + + def ensure_dir(self): + name = self._fname("") + if os.path.exists(name): + return + os.mkdirs(name) ======================================================================== --- fs_http.py +++ fs_http.py b5c05a4be6317cf55e146da0646dde0599ecd381 @@ -0,0 +1,29 @@ +# we need urlgrabber to do range fetches +import fs +import urlparse +import urlgrabber + +class HTTPReadableFS(fs.ReadableFS): + def __init__(self, url): + self.url = url + + def _url(self, filename): + return FIXME + + def open_read(self, filename): + return urlgrabber.urlopen(self._url(filename)) + + def fetch(self, filenames): + files = {} + for fn in filenames: + try: + files[fn] = urlgrabber.urlread(self._url(fn)) + except urlgrabber.URLGrabError: + files[fn] = None + return files + + def _real_fetch_bytes(self, filename, bytes): + url = self._url(filename) + for offset, length in bytes: + yield urlgrabber.urlread(url, range=(offset, offset+length)) + ======================================================================== --- merkle_dir.py d62f79494aabfa58b47e3dece80f4f025b4440d5 +++ merkle_dir.py fa38d11914a8107a2fb7c9de37b002cb0053579f @@ -171,6 +171,7 @@ def begin(self): if not self._locked: + self._fs.ensure_dir() if not self._fs.mkdir(self._lock_file): raise LockError # okay, we succeeded in getting the write lock. Let's open things