def test_clone(self):
        """Test GitHandler's `clone` method."""
        with self.assertRaises(StatusError):
            _ = GitHandler.clone(url='https://nonexisting/repo')

        handler = GitHandler.clone(url=TEST_GIT_REPO_URL)

        self.assertIsInstance(handler, GitHandler)
    def test_init(self):
        """Test GitHandler initialization."""
        tmp_dir = tempfile.mkdtemp(prefix='test_', suffix='_init')
        with self.assertRaises(StatusError):
            _ = GitHandler(tmp_dir)

        handler = GitHandler.clone(url=TEST_GIT_REPO_URL)

        self.assertIsInstance(handler, GitHandler)
def get_packages_by_commits(repository: str,
                            commits: list,
                            package_limit=1,
                            ecosystem='maven') -> list:
    """Get package name from git repository and commit hash.

    A git handler is created and modified files are searched
    by the given commit. Package is inferred based on those
    modified files.
    There can be multiple packages, by default only one child
    package is returned.

    *NOTE:* Only usable for git repositories.

    :param repository: str, path to local repository or url

        If url is provided, to repository will be cloned into
        a temporary folder (at /tmp)

    :param commits: list, commit hashes to search the modified files by
    :param package_limit: int or None, limit number of packages

        The limit is applied per modified file.
        If all packages found in the path should be listed,
        provide None or 0

    :param ecosystem: ecosystem the repository belongs to

        {maven, npm, python}, by default 'maven' is assumed
    """
    if repository.startswith('http'):
        print('\nCloning repository...\n', file=sys.stderr)
        handler = GitHandler.clone(url=repository)
    else:
        handler = GitHandler(path=repository)

    with handler as git:
        mod_files = git.get_modified_files(commits=commits)

    mod_files = sorted(mod_files, key=len, reverse=True)
    eco_namespace = _get_namespace_by_eco(ecosystem)

    packages = set()
    for mod_file_path in mod_files:
        root_dir = os.path.dirname(str(mod_file_path))
        found_packages = eco_namespace.find_packages(root_dir, topdown=False)

        for p in found_packages[:[None, package_limit][package_limit]]:
            packages.add(p)

    # the first found package should be the child package belonging to the file
    # which has been modified
    return list(packages)
    def test_exec_cmd(self):
        """Test GitHandler's `exec_cmd` method."""
        with self.assertRaises(ValueError):
            # should raise, command does not start with git
            GitHandler.exec_cmd('echo "Hello Git!"')

        tmp_dir = tempfile.mkdtemp(prefix='test_', suffix='_exec_cmd')

        _, __ = GitHandler.exec_cmd('git clone {repo} {dest}'.format(
            repo=TEST_GIT_REPO_URL, dest=tmp_dir))

        self.assertTrue(any(os.listdir(tmp_dir)))
    def test_get_package_from_spec_exception(self,
                                             mock_find):
        """Test `get_package_from_spec` with missing parent namespace."""
        with GitHandler.clone(TEST_MAVEN_REPO_URL) as git:
            repo_dir = git.repository

            pom_files = Maven.find_pom_files(repo_dir)
            assert any(pom_files)

            with open(pom_files[0], 'r') as pom_spec:
                # set up mock
                mock_find.return_value = None

                package = Maven.get_package_from_spec(pom_spec)

                self.assertIsNotNone(package)
                self.assertTrue(isinstance(package, Package))

                self.assertTrue(
                    all([
                        getattr(package, attr, None) is None
                        for attr in ['aid', 'gid', 'name',
                                     'owner', 'version', 'description']
                    ])
                )
    def test_find_packages(self):
        """Test MavenRepository `find_packages` method."""
        with GitHandler.clone(TEST_MAVEN_REPO_URL) as git:
            repo_dir = git.repository

            packages = Maven.find_packages(repo_dir)

            self.assertIsNotNone(packages)
            self.assertTrue(any(packages))
            self.assertTrue(all([isinstance(f, Package) for f in packages]))
    def test_get_modified_files(self):
        """Test GitHandler's `get_modified_files` method."""
        handler = GitHandler.clone(url=TEST_GIT_REPO_URL)

        mod_file, = handler.get_modified_files(commits=TEST_COMMITS)

        self.assertEqual(os.path.basename(mod_file), 'README.md')

        # test multiple commits
        mod_files = handler.get_modified_files(commits=TEST_COMMITS * 2)

        self.assertEqual(len(mod_files), 2)
Example #8
0
    def test_get_package_from_spec(self):
        """Test MavenRepository `get_package_from_spec` method."""
        with GitHandler.clone(TEST_MAVEN_REPO_URL) as git:
            repo_dir = git.repository

            pom_files = Maven.find_pom_files(repo_dir)
            assert any(pom_files)

            with open(pom_files[0], 'r') as pom_spec:
                package = Maven.get_package_from_spec(pom_spec)

                self.assertIsNotNone(package)
                self.assertTrue(isinstance(package, Package))
                self.assertTrue(
                    all([getattr(package, attr, None)] for attr in
                        ['name', 'owner', 'version', 'description']))
Example #9
0
    def test_find_pom_files(self):
        """Test MavenRepository `find_pom_files` method."""
        with GitHandler.clone(TEST_MAVEN_REPO_URL) as git:
            repo_dir = git.repository

            pom_files = Maven.find_pom_files(repo_dir)

            self.assertIsNotNone(pom_files)
            self.assertTrue(any(pom_files))
            self.assertTrue(all([f.endswith('.xml') for f in pom_files]))

            # try it with reverse search
            child_path = os.path.join(repo_dir, TEST_TRAVERSAL_PATH)
            pom_files = Maven.find_pom_files(child_path, topdown=False)

            self.assertIsNotNone(pom_files)
            self.assertTrue(any(pom_files))
            self.assertTrue(all([f.endswith('.xml') for f in pom_files]))