예제 #1
0
	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)
예제 #2
0
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()