diff options
author | Lars Wirzenius <liw@liw.fi> | 2015-08-01 11:13:37 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2015-08-01 11:13:37 +0300 |
commit | 5a52f89bb88d3ebfa0fc0927b02b4f25be725960 (patch) | |
tree | bcf6ec3017f889a54166fac9ce120866e0dd1304 | |
parent | 38e9590005509ef13d3460b30a247b7c30a91b67 (diff) | |
download | obnam-5a52f89bb88d3ebfa0fc0927b02b4f25be725960.tar.gz |
Refactor forget plugin code for clarity
-rw-r--r-- | obnamlib/plugins/forget_plugin.py | 82 |
1 files changed, 43 insertions, 39 deletions
diff --git a/obnamlib/plugins/forget_plugin.py b/obnamlib/plugins/forget_plugin.py index 860cd116..08c35987 100644 --- a/obnamlib/plugins/forget_plugin.py +++ b/obnamlib/plugins/forget_plugin.py @@ -36,9 +36,7 @@ class ForgetPlugin(obnamlib.ObnamPlugin): self.app.settings.require('repository') self.app.settings.require('client-name') - self.app.ts['gen'] = None - self.app.ts['gens'] = [] - self.app.ts.format('forgetting generations: %Index(gen,gens) done') + self.setup_progress_reporting() self.repo = self.app.get_repository_object() @@ -77,43 +75,14 @@ class ForgetPlugin(obnamlib.ObnamPlugin): self.app.dump_memory_profile('at beginning') client_name = self.app.settings['client-name'] if args: - self.app.ts['gens'] = args - for genspec in args: - self.app.ts['gen'] = genspec - genid = self.repo.interpret_generation_spec( - client_name, genspec) - self.app.ts.notify( - 'Forgetting generation %s' % - self.repo.make_generation_spec(genid)) - self.remove(genid) - self.app.dump_memory_profile( - 'after removing %s' % - self.repo.make_generation_spec(genid)) + removeids = self.get_genids_to_remove_from_args(client_name, args) elif self.app.settings['keep']: - genlist = [] - dt = datetime.datetime(1970, 1, 1, 0, 0, 0) - for genid in self.repo.get_client_generation_ids(client_name): - start = self.repo.get_generation_key( - genid, obnamlib.REPO_GENERATION_STARTED) - end = self.repo.get_generation_key( - genid, obnamlib.REPO_GENERATION_ENDED) - genlist.append((genid, dt.fromtimestamp(end))) - - fp = obnamlib.ForgetPolicy() - rules = fp.parse(self.app.settings['keep']) - keeplist = fp.match(rules, genlist) - keepids = set(genid for genid, dt in keeplist) - removeids = [genid - for genid, dt in genlist - if genid not in keepids] - - self.app.ts['gens'] = removeids - for genid in removeids: - self.app.ts['gen'] = genid - self.remove(genid) - self.app.dump_memory_profile( - 'after removing %s' % - self.repo.make_generation_spec(genid)) + genlist = self.get_all_generations(client_name) + removeids = self.choose_genids_to_remove_using_keep_policy(genlist) + else: + removeids = [] + + self.remove_generations(removeids) # Commit or unlock everything. self.repo.flush_chunks() @@ -124,6 +93,41 @@ class ForgetPlugin(obnamlib.ObnamPlugin): self.repo.close() self.app.ts.finish() + def setup_progress_reporting(self): + self.app.ts['gen'] = None + self.app.ts['gens'] = [] + self.app.ts.format('forgetting generations: %Index(gen,gens) done') + + def get_genids_to_remove_from_args(self, client_name, args): + return [ + self.repo.interpret_generation_spec(client_name, genspec) + for genspec in args] + + def get_all_generations(self, client_name): + genlist = [] + dt = datetime.datetime(1970, 1, 1, 0, 0, 0) + for genid in self.repo.get_client_generation_ids(client_name): + end = self.repo.get_generation_key( + genid, obnamlib.REPO_GENERATION_ENDED) + genlist.append((genid, dt.fromtimestamp(end))) + return genlist + + def choose_genids_to_remove_using_keep_policy(self, genlist): + fp = obnamlib.ForgetPolicy() + rules = fp.parse(self.app.settings['keep']) + keeplist = fp.match(rules, genlist) + keepids = set(genid for genid, dt in keeplist) + return [genid for genid, dt in genlist if genid not in keepids] + + def remove_generations(self, removeids): + self.app.ts['gens'] = removeids + for genid in removeids: + self.app.ts['gen'] = genid + self.remove(genid) + self.app.dump_memory_profile( + 'after removing %s' % + self.repo.make_generation_spec(genid)) + def remove(self, genid): if self.app.settings['pretend']: self.app.ts.notify( |