def _merge_for_test(self, verbose=False): self.dir_changes1 = change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_DIR1), self.dir_info1, root_dir=_TEST_DIR1, tmp_dir=_TEST_TMP, verbose=verbose) self.dir_changes2 = change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_DIR2), self.dir_info2, root_dir=_TEST_DIR2, tmp_dir=_TEST_TMP, verbose=verbose) result = merge.merge(self.dir_changes1, self.dir_changes2) self.dc_new1 = result[0] self.changes_new1 = [x for x in self.dc_new1.flat_changes()] self.di_new1 = change_entry.apply_dir_changes_to_dir_info('.', self.dc_new1) self.dc_old1 = result[1] self.changes_old1 = [x for x in self.dc_old1.flat_changes()] self.di_old1 = change_entry.apply_dir_changes_to_dir_info('.', self.dc_old1) self.dc_new2 = result[2] self.changes_new2 = [x for x in self.dc_new2.flat_changes()] self.di_new2 = change_entry.apply_dir_changes_to_dir_info('.', self.dc_new2) self.dc_old2 = result[3] self.changes_old2 = [x for x in self.dc_old2.flat_changes()] self.di_old2 = change_entry.apply_dir_changes_to_dir_info('.', self.dc_old2) self.dc_conflict = result[4] self.changes_conflict = [x for x in self.dc_conflict.flat_changes()]
def sync(self, old_dir_info, debug=False, verbose=False): tstart = time.time() cwd = os.getcwd() working_old_di = old_dir_info cloud_old_di = self._extract_compressed_dir_info(old_dir_info) if debug: print '============== Latency till extract input dir info : %s s' % ( time.time() - tstart) if verbose: phase = 1 print 'Phase %s: Examine changes on working_dir at %s' % ( phase, self.working_dir) os.chdir(self.working_dir) working_cur_di = file_info.load_dir_info('.', calculate_hash=True) working_dc = change_entry.get_dir_changes(working_cur_di, working_old_di, root_dir=self.working_dir, tmp_dir=self.tmp_dir, verbose=verbose) is_working_no_change = self._is_no_change(working_dc) working_dc = self._generate_compressed_dir_changes(working_dc) if debug: print '============== Latency after examing working_dir: %s s' % ( time.time() - tstart) self._print_changes('********** working_dc', working_dc) if verbose: phase += 1 print 'Phase %s: Examine changes on wrap_dir at %s' % ( phase, self.cloud_dir) os.chdir(self.cloud_dir) cloud_cur_di = file_info.load_dir_info( '.', calculate_hash=True, key=self.compression_key) cloud_dc = change_entry.get_dir_changes(cloud_cur_di, cloud_old_di, root_dir=self.cloud_dir, tmp_dir=self.tmp_dir, verbose=verbose) is_cloud_no_change = self._is_no_change(cloud_dc) cloud_dc_result = self._generate_original_dir_changes(cloud_dc) cloud_dc = cloud_dc_result[0] invalid_archives_dc_working = cloud_dc_result[1] invalid_archives_dc_cloud = cloud_dc_result[2] if invalid_archives_dc_working: if debug: self._print_changes('************ invalid_archives_dc', invalid_archives_dc_working) # Apply invalid_archives_dc to working dir because they are not # compressed. These files will be compressed and sync after next sync. change_entry.apply_dir_changes_to_dir(self.working_dir, invalid_archives_dc_working, verbose=verbose) change_entry.apply_dir_changes_to_dir(self.cloud_dir, invalid_archives_dc_cloud, verbose=verbose) if debug: print '============== Latency after examing wrap_dir: %s s' % ( time.time() - tstart) has_changes = not is_working_no_change or not is_cloud_no_change if has_changes and verbose: phase += 1 print 'Phase %s: Merge changes on both dirs' % phase result = merge.merge(working_dc, cloud_dc) working_dc_new = result[0] working_dc_old = result[1] cloud_dc_new = self._extract_compressed_dir_changes(result[2]) cloud_dc_old = result[3] working_dc_conflict = result[4] cloud_dc_conflict = self._extract_compressed_dir_changes( working_dc_conflict) if debug: print '============== Latency after merge: %s s' % (time.time() - tstart) self._print_changes('********** working_dc_conflict', working_dc_conflict) self._print_changes('********** cloud_dc_conflict', cloud_dc_conflict) if has_changes and verbose: phase += 1 print 'Phase %s: Apply merged changes on working_dir at %s' % ( phase, self.working_dir) change_entry.apply_dir_changes_to_dir(self.working_dir, working_dc_new, verbose=verbose) change_entry.apply_dir_changes_to_dir( self.working_dir, working_dc_conflict, force_conflict=change_entry.CONFLICT_NEW, verbose=verbose) working_di = change_entry.apply_dir_changes_to_dir_info('.', working_dc_old) if debug: print '============== Latency after applying merged changes on working_dir: %s' % (time.time() - tstart) if has_changes and verbose: phase += 1 print 'Phase %s: Apply merged changes on wrap_dir at %s' % ( phase, self.cloud_dir) change_entry.apply_dir_changes_to_dir(self.cloud_dir, cloud_dc_new, verbose=verbose) change_entry.apply_dir_changes_to_dir( self.cloud_dir, cloud_dc_conflict, force_conflict=change_entry.CONFLICT_NEW, verbose=verbose) cloud_di = change_entry.apply_dir_changes_to_dir_info('.', cloud_dc_old) if debug: print '============== Latency after applying merged changes on wrap_dir: %s' % (time.time() - tstart) os.chdir(cwd) return [has_changes, working_di, cloud_di]