[GH-632] confirming that each journal can be parsed during upgrade, and aborting upgrade if not

This commit is contained in:
Micah Jerome Ellison 2019-08-24 13:50:10 -07:00
parent ec1b2c63b9
commit 3bfd9f487b
5 changed files with 52 additions and 29 deletions

View file

@ -84,9 +84,20 @@ class Journal(object):
def write(self, filename=None):
"""Dumps the journal into the config file, overwriting it"""
filename = filename or self.config['journal']
text = "\n".join([e.__unicode__() for e in self.entries])
text = self._to_text()
self._store(filename, text)
def validate_parsing(self):
"""Confirms that the jrnl is still parsed correctly after being dumped to text."""
new_entries = self._parse(self._to_text())
for i, entry in enumerate(self.entries):
if entry != new_entries[i]:
return False
return True
def _to_text(self):
return "\n".join([e.__unicode__() for e in self.entries])
def _load(self, filename):
raise NotImplementedError

View file

@ -44,6 +44,7 @@ older versions of jrnl anymore.
encrypted_journals = {}
plain_journals = {}
other_journals = {}
all_journals = []
for journal_name, journal_conf in config['journals'].items():
if isinstance(journal_conf, dict):
@ -85,17 +86,27 @@ older versions of jrnl anymore.
util.prompt("\nUpgrading encrypted '{}' journal stored in {}...".format(journal_name, path))
backup(path, binary=True)
old_journal = Journal.open_journal(journal_name, util.scope_config(config, journal_name), legacy=True)
new_journal = EncryptedJournal.from_journal(old_journal)
new_journal.write()
util.prompt(" Done.")
all_journals.append(EncryptedJournal.from_journal(old_journal))
for journal_name, path in plain_journals.items():
util.prompt("\nUpgrading plain text '{}' journal stored in {}...".format(journal_name, path))
backup(path)
old_journal = Journal.open_journal(journal_name, util.scope_config(config, journal_name), legacy=True)
new_journal = Journal.PlainJournal.from_journal(old_journal)
new_journal.write()
util.prompt(" Done.")
all_journals.append(Journal.PlainJournal.from_journal(old_journal))
# loop through lists to validate
failed_journals = [j for j in all_journals if not j.validate_parsing()]
if len(failed_journals) > 0:
util.prompt("\nThe following journal{} failed to upgrade:\n{}".format(
's' if len(failed_journals) > 1 else '', "\n".join(j.name for j in failed_journals))
)
util.prompt("Aborting upgrade.")
return
# write all journals - or - don't
for j in all_journals:
j.write()
util.prompt("\nUpgrading config...")
backup(config_path)