Exemplo n.º 1
0
	def __init__(self, config_name):
		self.roots = []

		progress_dlg = ProgressDlg('2sync - Read data', 'startup')
		progress_dlg.show_all()
		TSPolicy.set_transient_for(progress_dlg.dlg)
		transient_for = progress_dlg.dlg

		try:
			progress_dlg.update('load config', 0.01)
			cfg = config.Config(config_name) # Expected exceptions: PermissionError, FileNotFoundError
			
			progress_dlg.update('load saved data', 0.02)
			self.pdata = data.PersistenceData(cfg) # Expected exceptions: FileNotFoundError, PermissionError, EOFError (File corrupt)

			if cfg.roots[0].startswith('ssh://'):
				progress_dlg.update('connect to %s' % cfg.roots[0], 0.05)
				self.roots.append(data.SSHData(cfg.roots[0], cfg, progress_dlg.update, TSPolicy)) # Expected exceptions: paramiko.ssh_exception.SSHException, socket.gaierror, ConnectionRefusedError
			else:
				progress_dlg.update('read data from %s' % cfg.roots[0], 0.05)
				self.roots.append(data.FSData(cfg.roots[0], cfg, progress_dlg.update)) # Expected exceptions: PermissionError

			if cfg.roots[1].startswith('ssh://'):
				progress_dlg.update('connect to %s' % cfg.roots[1], 0.50)
				self.roots.append(data.SSHData(cfg.roots[1], cfg, progress_dlg.update, TSPolicy)) # Expected exceptions: paramiko.ssh_exception.SSHException, socket.gaierror, ConnectionRefusedError
			else:
				progress_dlg.update('read data from %s' % cfg.roots[1], 0.50)
				self.roots.append(data.FSData(cfg.roots[1], cfg, progress_dlg.update)) # Expected exceptions: PermissionError

			progress_dlg.update('analyse data', 0.95)
			changes, conflicts = utils.find_changes(self.pdata, self.roots[0], self.roots[1])

			main_win = MainWin(self.pdata, self.roots)
			main_win.do_update_liststore(changes)
			main_win.show_all()

			transient_for = main_win.win

			progress_dlg.close()

		# except paramiko.ssh_exception.SSHException as e:
		# 	error_dlg = ErrorDlg('2sync - Error', str(e), transient_for)
		# 	error_dlg.run()

		except socket.timeout as e:
			error_dlg = ErrorDlg('2sync - Error', 'Connection timeout', transient_for)
			error_dlg.run()
			# raise

		except Exception as e:
			error_dlg = ErrorDlg('2sync - Error', str(e), transient_for)
			error_dlg.run()
Exemplo n.º 2
0
	def do_sync(self):
		def update_callback(now, max_, path=None):
			if progress_dlg.dlg.get_visible():
				progress_dlg.update(path, now/max_)
			else:
				raise InterruptedError

		buf = []
		rows = []

		progress_dlg = ProgressDlg('2sync - sync data', 'prepare sync', self.win)
		progress_dlg.set_btn_close_event(progress_dlg.close)
		progress_dlg.show_all()

		progress_dlg.update('prepare', 0.1)

		# Get all rows from first level and save in buf
		for row in self.treestore:
			buf.append(row)

		# Get one row from buf and save it in rows
		# Save all childs to buf and loop
		while len(buf) > 0:
			row = buf.pop()
			rows.append(row)
			child_iter = row.iterchildren()
			for child_row in child_iter:
				buf.append(child_row)

		synclist = []
		for row in rows:
			if row[2] == Gtk.STOCK_CLOSE:
				continue
			elif row[2] == "go-previous":
				synclist.append((row[0], self.roots[1], self.roots[0]))
			elif row[2] == "go-next":
				synclist.append((row[0], self.roots[0], self.roots[1]))

		sync = data.SyncData(synclist)
		synced = []
		while not sync.finished():
			try:
				synced.append(sync.sync_next(update_callback))
			except InterruptedError:
				break

			except socket.timeout as e:
				error_dlg = ErrorDlg('2sync - Error', 'Connection timeout', progress_dlg.dlg)
				error_dlg.set_btn_close_event(error_dlg.close)
				error_dlg.run()

			except Exception as e:
				error_dlg = ErrorDlg('2sync - Error', str(e), progress_dlg.dlg)
				error_dlg.set_btn_close_event(error_dlg.close)
				error_dlg.run()

		for sync in synclist:
			if sync[0] in synced:
				self.pdata.add(sync[0], sync[1][sync[0]])
				sync[2].add(sync[0], sync[1][sync[0]])

		GLib.idle_add(self.treestore.clear)
		changes, conflicts = utils.find_changes(self.pdata, self.roots[0], self.roots[1])
		self.do_update_liststore(changes)
		
		# Check if still shown
		if progress_dlg.dlg.get_visible():
			progress_dlg.close()