def test_copy(self): src = 'test/recipe' dst = 'test/recipe_copy_test' hardlink_or_copy(src, dst) for i, j in zip(os.walk(src), os.walk(dst)): self.assertEqual(i[1:], j[1:]) self.assertEqual(i[0][len(src):], j[0][len(dst):]) shutil.rmtree(dst)
def _sis_migrate_directory(self, src, mode='link'): """ Migrate from previously finished directory TODO: a lot duplicated code with _sis_import_from_dirs """ dst = self._sis_path() if dst.startswith("./"): dst = dst[2:] # don't do anything if it's the same directory if src == dst: return False assert not os.path.isfile(dst), "Target directory is a file, remove it: %s" % dst # skip if current directory already exists if os.path.isdir(dst): logging.warning('Don\'t migrate since directory already exists: %s to %s' % (src, dst)) return False if os.path.islink(dst): if os.path.isdir(dst): logging.warning('Don\'t migrate since directory already linked: %s to %s' % (src, dst)) return False else: logging.warning('Remove broken link: %s' % dst) os.unlink(dst) # only migrate finished jobs if not job_finished(src): logging.warning('Don\'t migrate since src directory is not finished: %s to %s' % (src, dst)) return False logging.info('%s: %s to %s' % (mode.title().replace('_', ' '), src, dst)) # make sure the main directory exists if not os.path.isdir(os.path.dirname(dst)) and mode != 'fake': os.makedirs(os.path.dirname(dst)) if mode == 'dryrun': print("%s -> %s" % (src, dst)) elif mode == 'link': os.symlink(os.path.abspath(src), dst) elif mode == 'copy': shutil.copytree(src, dst, symlinks=True) elif mode == 'move': os.rename(src, dst) elif mode == 'move_and_link': os.rename(src, dst) os.symlink(os.path.abspath(dst), src) elif mode == 'hardlink_or_copy': tools.hardlink_or_copy(src, dst) elif mode == 'hardlink_or_link': tools.hardlink_or_copy(src, dst, use_symlink_instead_of_copy=True) else: assert False, "Unknown mode: %s" % mode return True