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 setUp(self): try: shutil.rmtree(_TEST_DIR1) except: pass try: shutil.rmtree(_TEST_DIR2) except: pass try: shutil.rmtree(_TEST_TMP) except: pass os.makedirs(_TEST_DIR1) os.makedirs(_TEST_DIR2) os.makedirs(_TEST_TMP) self.dir_info1 = file_info.load_rel_dir_info(_TEST_DIR1) self.test_dir1_level1 = os.path.join(_TEST_DIR1, _TEST_CASE_DIR) os.makedirs(self.test_dir1_level1) f = open(os.path.join(self.test_dir1_level1, _TEST_CASE_FILE1), 'w') f.write(_TEST_INITIAL_CONTENT) f.close() f = open(os.path.join(self.test_dir1_level1, _TEST_CASE_FILE2), 'w') f.write(_TEST_INITIAL_CONTENT) f.close() self.test_dir1_level_empty = os.path.join(_TEST_DIR1, _TEST_CASE_DIR_EMPTY) os.makedirs(self.test_dir1_level_empty) self.dir_info1 = change_entry.apply_dir_changes_to_dir_info( '.', # use current dir as base dir change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_DIR1), self.dir_info1, root_dir=_TEST_DIR1, tmp_dir=_TEST_TMP)) self.dir_info2 = file_info.load_rel_dir_info(_TEST_DIR2) self.test_dir2_level1 = os.path.join(_TEST_DIR2, _TEST_CASE_DIR) os.makedirs(self.test_dir2_level1) f = open(os.path.join(self.test_dir2_level1, _TEST_CASE_FILE1), 'w') f.write(_TEST_INITIAL_CONTENT) f.close() f = open(os.path.join(self.test_dir2_level1, _TEST_CASE_FILE2), 'w') f.write(_TEST_INITIAL_CONTENT) f.close() self.test_dir2_level_empty = os.path.join(_TEST_DIR2, _TEST_CASE_DIR_EMPTY) os.makedirs(self.test_dir2_level_empty) self.dir_info2 = change_entry.apply_dir_changes_to_dir_info( '.', # use current dir as base dir change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_DIR2), self.dir_info2, root_dir=_TEST_DIR2, tmp_dir=_TEST_TMP)) try: shutil.rmtree(_TEST_TMP) except: pass os.mkdir(_TEST_TMP)
def _test_get_file_info_list_after_sync(self): self.dir_info = change_entry.apply_dir_changes_to_dir_info( '.', change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_SRC), self.dir_info, root_dir=_TEST_SRC, tmp_dir=_TEST_TMP)) self.file_info_list = [x for x in self.dir_info.flat_file_info_list()]
def setUp(self): try: shutil.rmtree(_TEST_SRC) except: pass try: shutil.rmtree(_TEST_TMP) except: pass os.makedirs(_TEST_SRC) os.makedirs(_TEST_TMP) self.dir_info = file_info.load_rel_dir_info(_TEST_SRC) f = open(os.path.join(_TEST_SRC, _TEST_CASE_FILE), 'w') f.write(_TEST_INITIAL_CONTENT) f.close() self.dir_info = change_entry.apply_dir_changes_to_dir_info( '.', # use current dir as base dir change_entry.get_dir_changes( file_info.load_rel_dir_info(_TEST_SRC), self.dir_info, root_dir=_TEST_SRC, tmp_dir=_TEST_TMP)) self.file_info_list = [x for x in self.dir_info.flat_file_info_list()] try: shutil.rmtree(_TEST_TMP) except: pass os.mkdir(_TEST_TMP)
def test_change_entry_applied_to_dir_info(self): os.chdir(_TEST_DEST) di_new = file_info.load_dir_info('.', calculate_hash=True) os.chdir(_TEST_SRC) di_old = file_info.load_dir_info('.', calculate_hash=True) dc = change_entry.get_dir_changes(di_new, di_old) di_final = change_entry.apply_dir_changes_to_dir_info('.', dc) dc_final = change_entry.get_dir_changes(di_new, di_final) self._assertDirChanges(dc_final)
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]