Example #1
0
class LocalStorage(object):
    def __init__(self, cp, target_dir):
        self.cp = cp
        self.cache = FileCache(cp)

        self.target_dir = target_dir
        self.trees_dir = os.path.join(target_dir, 'trees')
        self.archives_dir = os.path.join(target_dir, 'archives')

        mkdir_p(self.trees_dir)
        mkdir_p(self.archives_dir)

    def get_stored_info(self, target):
        tree_fns = (os.path.join(self.trees_dir, fn) for fn in os.listdir(self.trees_dir))
        return RemoteStoredInfo([LocalStorageKey(fn) for fn in tree_fns
                    if os.path.isfile(fn) and not fn.endswith('.meta')])

    def save_tree(self, target, new_tree):
        now_dt = datetime.utcnow()
        now_dt_str = now_dt.strftime(TREE_DT_FMT)
        tree_local_fname = os.path.join(self.trees_dir,
                '{}-{}'.format(target, now_dt_str))
        with open(tree_local_fname, 'wb') as f:
            tree.save_tree(new_tree, f)
        with open('{}.meta'.format(tree_local_fname), 'wb') as f:
            json.dump({'pf:target': target, 'pf:saved_dt': now_dt_str}, f)

    def save_archive(self, filename):
        archive_id = hashlib.sha224(filename).hexdigest()
        shutil.copy(filename, os.path.join(self.archives_dir, archive_id))
        return archive_id

    def load_archive(self, ar_name):
        if self.cache.hasfile(ar_name):
            return self.cache.getfile(ar_name)
        afile = self.cache.newfile(ar_name)
        shutil.copy(os.path.join(self.archives_dir, ar_name), afile.fullpath())
        return afile