Ejemplo n.º 1
0
    def run(self, version: ProjectVersion):
        logger = logging.getLogger("tasks.checkout")

        try:
            checkout = version.get_checkout(self.checkouts_path)
        except ValueError as e:
            raise UserWarning("Checkout data corrupted: %s", e)

        if self.force_checkout:
            checkout.delete()
        checkout_exists = checkout.exists()
        logger.debug("Checkout exists = %r", checkout_exists)
        if checkout_exists:
            logger.debug("Already checked out %s.", version)
        else:
            logger.info("Fetching %s from %s...", version, checkout)
            if self.use_temp_dir:
                temp_dir = mkdtemp(prefix="mubench-checkout_")
                temp_checkout = version.get_checkout(temp_dir)
                temp_checkout.create(self.run_timestamp)
                logger.debug("Copying checkout to persistent directory...")
                copy_tree(temp_dir, self.checkouts_path)
                remove_tree(temp_dir)
            else:
                checkout.create(self.run_timestamp)

        return checkout
Ejemplo n.º 2
0
 def create(self):
     if not exists(self.checkout_dir):
         self._logger.debug("Create checkout directory %s", self.checkout_dir)
         makedirs(self.checkout_dir)
     if not listdir(self.checkout_dir):
         self._logger.debug("Copy from %s", self.url)
         copy_tree(self.url, self.checkout_dir)
Ejemplo n.º 3
0
    def test_copies_empty_directory(self):
        src = join(self.temp_dir, "src")
        makedirs(join(src, "empty"))

        copy_tree(src, self.temp_dir)

        assert exists(join(self.temp_dir, "empty"))
Ejemplo n.º 4
0
    def test_copy_creates_destination(self):
        src = join(self.temp_dir, "src")
        makedirs(src)

        dst = join(self.temp_dir, "dst")
        copy_tree(src, dst)

        assert exists(dst)
Ejemplo n.º 5
0
    def test_copies_tree(self):
        src = join(self.temp_dir, "src")
        file1 = join("dir1", "dir2", "file1")
        file2 = join("dir1", "file2")
        file3 = join("file3")
        create_file(join(src, file1))
        create_file(join(src, file2))
        create_file(join(src, file3))

        copy_tree(src, self.temp_dir)

        assert exists(join(self.temp_dir, file1))
        assert exists(join(self.temp_dir, file2))
        assert exists(join(self.temp_dir, file3))
Ejemplo n.º 6
0
    def run(self, version: ProjectVersion, checkout: ProjectCheckout):
        logger = logging.getLogger("task.compile")

        version_compile = version.get_compile(self.compiles_base_path)

        build_path = mkdtemp(prefix='mubench-compile_') if self.use_temp_dir else version_compile.build_dir

        if self.force_compile or checkout.timestamp > version_compile.timestamp:
            logger.debug("Force compile - removing previous compiles...")
            version_compile.delete()

        try:
            if not version.is_compilable:
                raise UserWarning("Skipping compilation: not configured.")

            if version_compile.needs_compile():
                logger.info("Compiling %s...", version)
                logger.debug("Copying checkout to build directory...")
                checkout_path = checkout.checkout_dir
                copy_tree(checkout_path, build_path)
                logger.debug("Copying additional resources...")
                self.__copy_additional_compile_sources(version, build_path)

                logger.debug("Compiling project...")
                self._compile(version.compile_commands,
                              build_path,
                              version_compile.dependencies_path,
                              self.compiles_base_path,
                              logger)
                logger.debug("Create project jar...")
                zip_dir_contents(version_compile.original_classes_paths, version_compile.original_classpath)

                version_compile.save(self.run_timestamp)

            if self.use_temp_dir:
                logger.debug("Moving complete build to persistent directory...")
                copy_tree(build_path, version_compile.build_dir)
                remove_tree(build_path)
        except Exception:
            version_compile.delete()
            raise

        return version_compile
Ejemplo n.º 7
0
    def run(self, misuse: Misuse, version_compile: VersionCompile):
        logger = logging.getLogger("task.compile_patterns")

        misuse_compile = misuse.get_misuse_compile(self.compile_base_path)

        if self.force_compile or version_compile.timestamp > misuse_compile.timestamp:
            misuse_compile.delete()

        if not exists(misuse_compile.misuse_source_path):
            logger.debug("Copying misuse sources...")
            for source_path in version_compile.original_sources_paths:
                CompileMisuseTask._copy_misuse_sources(source_path, misuse, misuse_compile.misuse_source_path)

        if not exists(misuse_compile.misuse_classes_path):
            logger.debug("Copying misuse classes...")
            for classes_path in version_compile.original_classes_paths:
                CompileMisuseTask._copy_misuse_classes(classes_path, misuse, misuse_compile.misuse_classes_path)

        try:
            if misuse_compile.needs_copy_sources() or misuse_compile.needs_compile():
                logger.info("Compiling correct usage for %s...", misuse)

            if misuse_compile.needs_copy_sources():
                logger.debug("Copying correct-usage sources...")
                copy_tree(misuse.correct_usage_path, misuse_compile.correct_usage_sources_path)

            if misuse_compile.needs_compile():
                logger.debug("Compiling correct usages...")
                CompileMisuseTask._compile_correct_usages(misuse_compile.correct_usage_sources_path,
                                                    misuse_compile.correct_usage_classes_path,
                                                    version_compile.get_full_classpath())
                misuse_compile.save(self.run_timestamp)
            elif misuse.correct_usages:
                logger.info("Correct usage already compiled.")
        except Exception:
            misuse_compile.delete()
            raise

        return misuse_compile
Ejemplo n.º 8
0
    def process_project_version(self, project: Project,
                                version: ProjectVersion) -> List[str]:
        logger = logging.getLogger("checkout")

        try:
            checkout = version.get_checkout(self.checkouts_path)
        except ValueError as e:
            logger.error("Checkout data corrupted: %s", e)
            return self.skip(version)

        try:
            if self.force_checkout:
                checkout.delete()
            checkout_exists = checkout.exists()
            logger.debug("Checkout exists = %r", checkout_exists)
            if checkout_exists:
                logger.debug("Already checked out %s.", version)
            else:
                logger.info("Fetching %s from %s...", version, checkout)
                if self.use_temp_dir:
                    temp_dir = mkdtemp(prefix="mubench-checkout_")
                    temp_checkout = version.get_checkout(temp_dir)
                    temp_checkout.create()
                    logger.debug("Copying checkout to persistent directory...")
                    copy_tree(temp_dir, self.checkouts_path)
                    remove_tree(temp_dir)
                else:
                    checkout.create()

            return self.ok()

        except CommandFailedError as e:
            logger.error("Checkout failed: %s", e)
            return self.skip(version)
        except IOError:
            logger.error("Checkout failed.", exc_info=True)
            return self.skip(version)
    def test_exists(self):
        uut = GitProjectCheckout(self.git_url, self.checkouts_dir, "-project-",
                                 "-id-", "HEAD")
        copy_tree(self.git_url, uut.checkout_dir)

        assert uut.exists()
Ejemplo n.º 10
0
 def __copy_additional_compile_sources(version: ProjectVersion, checkout_dir: str):
     additional_sources = version.additional_compile_sources
     if exists(additional_sources):
         copy_tree(additional_sources, checkout_dir)
Ejemplo n.º 11
0
 def _create(self) -> None:
     if not exists(self.checkout_dir):
         self._logger.debug("Create checkout directory %s", self.checkout_dir)
         makedirs(self.checkout_dir)
         copy_tree(join(self.data_path, "repo"), self.checkout_dir)
Ejemplo n.º 12
0
    def process_project_version(self, project: Project,
                                version: ProjectVersion):
        logger = logging.getLogger("compile")
        logger.info("Compiling %s...", version)
        logger = logging.getLogger("compile.tasks")

        project_compile = version.get_compile(self.compiles_base_path)

        build_path = mkdtemp(
            prefix='mubench-compile_'
        ) if self.use_temp_dir else project_compile.build_dir

        sources_path = join(build_path, version.source_dir)
        classes_path = join(build_path, version.classes_dir)

        if self.force_compile:
            logger.debug("Force compile - removing previous compiles...")
            project_compile.delete()

        try:
            needs_copy_sources = project_compile.needs_copy_sources()
            needs_compile = project_compile.needs_compile()

            if needs_copy_sources or needs_compile:
                logger.debug("Copying checkout to build directory...")
                checkout_path = version.get_checkout(
                    self.checkouts_base_path).checkout_dir
                copy_tree(checkout_path, build_path)
                logger.debug("Copying additional resources...")
                self.__copy_additional_compile_sources(version, build_path)

            if not needs_copy_sources:
                logger.debug("Already copied source.")
            else:
                logger.info("Copying sources...")
                logger.debug("Copying project sources...")
                copy_tree(sources_path, project_compile.original_sources_path)
                logger.debug("Copying misuse sources...")
                self.__copy_misuse_sources(sources_path, version.misuses,
                                           project_compile.misuse_source_path)
                logger.info("Copying pattern sources...")
                self.__copy_pattern_sources(version.misuses, project_compile)

            if not version.compile_commands:
                logger.warning("Skipping compilation: not configured.")
                return self.skip(version)

            if not needs_compile:
                logger.debug("Already compiled project.")
            else:
                logger.info("Compiling project...")
                logger.debug("Copying patterns to source directory...")
                self.__copy(version.patterns, sources_path)
                self._compile(version.compile_commands, build_path,
                              project_compile.dependencies_path,
                              self.compiles_base_path, logger)
                logger.debug("Move pattern classes...")
                self.__copy_pattern_classes(version.misuses, classes_path,
                                            project_compile)
                self.__remove_pattern_classes(version.misuses, classes_path)
                logger.debug("Copy project classes...")
                copy_tree(classes_path, project_compile.original_classes_path)
                logger.debug("Create project jar...")
                self.__create_jar(project_compile.original_classes_path,
                                  project_compile.original_classpath)
                logger.debug("Copy misuse classes...")
                self.__copy_misuse_classes(classes_path, version.misuses,
                                           project_compile.misuse_classes_path)

            if self.use_temp_dir:
                logger.debug(
                    "Moving complete build to persistent directory...")
                copy_tree(build_path, project_compile.build_dir)
                remove_tree(build_path)
        except Exception as e:
            logger.error("Compilation failed: %s", e)
            project_compile.delete()
            return self.skip(version)

        return self.ok()
Ejemplo n.º 13
0
 def test_copy_fails_if_source_misssing(self):
     src = join(self.temp_dir, "src")
     with assert_raises(FileNotFoundError):
         copy_tree(src, "-irrelevant-")
Ejemplo n.º 14
0
 def __clean_copy(sources_path: str, destination: str):
     remove_tree(destination)
     copy_tree(sources_path, destination)