def init_vcs(self, vcs): dir = self._get_notebook_dir() if vcs == 'bzr': from zim.plugins.versioncontrol.bzr import BazaarVCS self.vcs = BazaarVCS(dir) else: assert False, 'Unkown VCS: %s' % vcs if self.vcs: self.vcs.init() self.actiongroup.get_action('show_versions').set_sensitive(True)
class VersionControlPlugin(PluginClass): plugin_info = { 'name': _('Version Control'), # T: plugin name 'description': _('''\ This plugin adds version control for notebooks. This plugin is based on the Bazaar version control system. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Version Control', } plugin_preferences = ( ('autosave', 'bool', _('Autosave version on regular intervals'), False), # T: Label for plugin preference ) def __init__(self, ui): PluginClass.__init__(self, ui) self.vcs = None if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.actiongroup.get_action('show_versions').set_sensitive(False) if self.ui.notebook: self.detect_vcs() else: self.ui.connect_after('open-notebook', lambda o, n: self.detect_vcs() ) def on_quit(o): if self.preferences['autosave']: self.autosave() self.ui.connect('quit', on_quit) def detect_vcs(self): dir = self._get_notebook_dir() self.vcs = self._detect_vcs(dir) if self.vcs: self.actiongroup.get_action('show_versions').set_sensitive(True) if self.preferences['autosave']: self.autosave() def _get_notebook_dir(self): notebook = self.ui.notebook if notebook.dir: return notebook.dir elif notebook.file: return notebook.file.dir else: assert 'Notebook is not based on a file or folder' @staticmethod def _detect_vcs(dir): # split off because it is easier to test this way vcs = None for path in reversed(list(dir)): if path.subdir('.bzr').exists(): from zim.plugins.versioncontrol.bzr import BazaarVCS vcs = BazaarVCS(path) #~ elif path.subdir('.svn'): #~ elif path.subdir('CVS'): else: continue if vcs: logger.info('VCS detected: %s', vcs) else: logger.info('No VCS detected') return vcs def autosave(self): assert self.vcs if self.ui.page and self.ui.page.modified: self.ui.save_page() if self.vcs.modified: logger.info('Automatically saving version') self.vcs.commit(_('Automatically saved version from zim')) # T: default version comment for auto-saved versions else: logger.debug('No autosave version needed - no changes') def save_version(self): if not self.vcs: # TODO choice from multiple version control systems if QuestionDialog(self, ( _("Enable Version Control?"), # T: Question dialog _("Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" ) # T: Detailed question ) ).run(): self.init_vcs('bzr') if self.ui.page.modified: self.ui.save_page() SaveVersionDialog(self.ui, self.vcs).run() def init_vcs(self, vcs): dir = self._get_notebook_dir() if vcs == 'bzr': from zim.plugins.versioncontrol.bzr import BazaarVCS self.vcs = BazaarVCS(dir) else: assert False, 'Unkown VCS: %s' % vcs if self.vcs: self.vcs.init() self.actiongroup.get_action('show_versions').set_sensitive(True) def show_versions(self): dialog = VersionsDialog.unique(self, self.ui, self.vcs) dialog.present()