예제 #1
0
 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)
예제 #2
0
파일: job.py 프로젝트: mkitza/sisyphus
    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