summaryrefslogtreecommitdiff
path: root/test/lib/ansible_test/_internal/provider/source/unversioned.py
blob: 601972808353de3a9fdedf06778e5115df9b833c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""Fallback source provider when no other provider matches the content root."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

import os

from ... import types as t

from ...constants import (
    TIMEOUT_PATH,
)

from ...encoding import (
    to_bytes,
)

from . import (
    SourceProvider,
)


class UnversionedSource(SourceProvider):
    """Fallback source provider when no other provider matches the content root."""
    sequence = 0  # disable automatic detection

    @staticmethod
    def is_content_root(path):  # type: (str) -> bool
        """Return True if the given path is a content root for this provider."""
        return False

    def get_paths(self, path):  # type: (str) -> t.List[str]
        """Return the list of available content paths under the given path."""
        paths = []

        kill_any_dir = (
            '.idea',
            '.pytest_cache',
            '__pycache__',
            'ansible.egg-info',
        )

        kill_sub_dir = {
            'test': (
                'results',
                'cache',
                'output',
            ),
            'tests': (
                'output',
            ),
            'docs/docsite': (
                '_build',
            ),
        }

        kill_sub_file = {
            '': (
                TIMEOUT_PATH,
            ),
        }

        kill_extensions = (
            '.pyc',
            '.pyo',
            '.retry',
        )

        for root, dir_names, file_names in os.walk(path):
            rel_root = os.path.relpath(root, path)

            if rel_root == '.':
                rel_root = ''

            for kill in kill_any_dir + kill_sub_dir.get(rel_root, ()):
                if kill in dir_names:
                    dir_names.remove(kill)

            kill_files = kill_sub_file.get(rel_root, ())

            paths.extend([os.path.join(rel_root, file_name) for file_name in file_names
                          if not os.path.splitext(file_name)[1] in kill_extensions and file_name not in kill_files])

            # include directory symlinks since they will not be traversed and would otherwise go undetected
            paths.extend([os.path.join(rel_root, dir_name) + os.path.sep for dir_name in dir_names if os.path.islink(to_bytes(dir_name))])

        return paths