forked from pre-commit/pre-commit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.py
More file actions
134 lines (104 loc) · 3.28 KB
/
util.py
File metadata and controls
134 lines (104 loc) · 3.28 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from __future__ import unicode_literals
import contextlib
import os.path
import sys
import pytest
from pre_commit import parse_shebang
from pre_commit.languages.docker import docker_is_running
from pre_commit.languages.pcre import GREP
from pre_commit.util import cmd_output
from testing.auto_namedtuple import auto_namedtuple
TESTING_DIR = os.path.abspath(os.path.dirname(__file__))
def get_resource_path(path):
return os.path.join(TESTING_DIR, 'resources', path)
def cmd_output_mocked_pre_commit_home(*args, **kwargs):
# keyword-only argument
tempdir_factory = kwargs.pop('tempdir_factory')
pre_commit_home = kwargs.pop('pre_commit_home', tempdir_factory.get())
# Don't want to write to the home directory
env = dict(kwargs.pop('env', os.environ), PRE_COMMIT_HOME=pre_commit_home)
return cmd_output(*args, env=env, **kwargs)
skipif_cant_run_docker = pytest.mark.skipif(
docker_is_running() is False,
reason='Docker isn\'t running or can\'t be accessed',
)
skipif_cant_run_swift = pytest.mark.skipif(
parse_shebang.find_executable('swift') is None,
reason='swift isn\'t installed or can\'t be found',
)
xfailif_windows_no_ruby = pytest.mark.xfail(
os.name == 'nt',
reason='Ruby support not yet implemented on windows.',
)
def broken_deep_listdir(): # pragma: no cover (platform specific)
if sys.platform != 'win32':
return False
try:
os.listdir(str('\\\\?\\') + os.path.abspath(str('.')))
except OSError:
return True
try:
os.listdir(b'\\\\?\\C:' + b'\\' * 300)
except TypeError:
return True
except OSError:
return False
xfailif_broken_deep_listdir = pytest.mark.xfail(
broken_deep_listdir(),
reason='Node on windows requires deep listdir',
)
def platform_supports_pcre():
output = cmd_output(GREP, '-P', "name='pre", 'setup.py', retcode=None)
return output[0] == 0 and "name='pre_commit'," in output[1]
xfailif_no_pcre_support = pytest.mark.xfail(
not platform_supports_pcre(),
reason='grep -P is not supported on this platform',
)
xfailif_no_symlink = pytest.mark.xfail(
not hasattr(os, 'symlink'),
reason='Symlink is not supported on this platform',
)
def supports_venv(): # pragma: no cover (platform specific)
try:
__import__('ensurepip')
__import__('venv')
return True
except ImportError:
return False
xfailif_no_venv = pytest.mark.xfail(
not supports_venv(), reason='Does not support venv module',
)
def run_opts(
all_files=False,
files=(),
color=False,
verbose=False,
hook=None,
origin='',
source='',
hook_stage='commit',
show_diff_on_failure=False,
commit_msg_filename='',
):
# These are mutually exclusive
assert not (all_files and files)
return auto_namedtuple(
all_files=all_files,
files=files,
color=color,
verbose=verbose,
hook=hook,
origin=origin,
source=source,
hook_stage=hook_stage,
show_diff_on_failure=show_diff_on_failure,
commit_msg_filename=commit_msg_filename,
)
@contextlib.contextmanager
def cwd(path):
original_cwd = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(original_cwd)