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()
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()