FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
pre-commit/pre_commit/parse_shebang.py at main · pre-commit/pre-commit · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
pre-commit
/
pre-commit
Public
Uh oh!
There was an error while loading.
Please reload this page
.
Notifications
You must be signed in to change notification settings
Fork
1k
Star
15.5k
Code
Issues
18
Pull requests
8
Actions
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Security and quality
Insights
Expand file tree
Breadcrumbs
pre-commit
/
pre_commit
/
parse_shebang.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
85 lines (65 loc) · 2.42 KB
Breadcrumbs
pre-commit
/
pre_commit
/
parse_shebang.py
Copy path
File metadata and controls
85 lines (65 loc) · 2.42 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
from
__future__
import
annotations
import
os
.
path
from
collections
.
abc
import
Mapping
from
typing
import
NoReturn
from
identify
.
identify
import
parse_shebang_from_file
class
ExecutableNotFoundError
(
OSError
):
def
to_output
(
self
)
->
tuple
[
int
,
bytes
,
None
]:
return
(
1
,
self
.
args
[
0
].
encode
(),
None
)
def
parse_filename
(
filename
:
str
)
->
tuple
[
str
, ...]:
if
not
os
.
path
.
exists
(
filename
):
return
()
else
:
return
parse_shebang_from_file
(
filename
)
def
find_executable
(
exe
:
str
,
*
,
env
:
Mapping
[
str
,
str
]
|
None
=
None
,
)
->
str
|
None
:
exe
=
os
.
path
.
normpath
(
exe
)
if
os
.
sep
in
exe
:
return
exe
environ
=
env
if
env
is
not
None
else
os
.
environ
if
'PATHEXT'
in
environ
:
exts
=
environ
[
'PATHEXT'
].
split
(
os
.
pathsep
)
possible_exe_names
=
tuple
(
f'
{
exe
}
{
ext
}
'
for
ext
in
exts
)
+
(
exe
,)
else
:
possible_exe_names
=
(
exe
,)
for
path
in
environ
.
get
(
'PATH'
,
''
).
split
(
os
.
pathsep
):
for
possible_exe_name
in
possible_exe_names
:
joined
=
os
.
path
.
join
(
path
,
possible_exe_name
)
if
os
.
path
.
isfile
(
joined
)
and
os
.
access
(
joined
,
os
.
X_OK
):
return
joined
else
:
return
None
def
normexe
(
orig
:
str
,
*
,
env
:
Mapping
[
str
,
str
]
|
None
=
None
)
->
str
:
def
_error
(
msg
:
str
)
->
NoReturn
:
raise
ExecutableNotFoundError
(
f'Executable `
{
orig
}
`
{
msg
}
'
)
if
os
.
sep
not
in
orig
and
(
not
os
.
altsep
or
os
.
altsep
not
in
orig
):
exe
=
find_executable
(
orig
,
env
=
env
)
if
exe
is
None
:
_error
(
'not found'
)
return
exe
elif
os
.
path
.
isdir
(
orig
):
_error
(
'is a directory'
)
elif
not
os
.
path
.
isfile
(
orig
):
_error
(
'not found'
)
elif
not
os
.
access
(
orig
,
os
.
X_OK
):
# pragma: win32 no cover
_error
(
'is not executable'
)
else
:
return
orig
def
normalize_cmd
(
cmd
:
tuple
[
str
, ...],
*
,
env
:
Mapping
[
str
,
str
]
|
None
=
None
,
)
->
tuple
[
str
, ...]:
"""Fixes for the following issues on windows
- https://bugs.python.org/issue8557
- windows does not parse shebangs
This function also makes deep-path shebangs work just fine
"""
# Use PATH to determine the executable
exe
=
normexe
(
cmd
[
0
],
env
=
env
)
# Figure out the shebang from the resulting command
cmd
=
parse_filename
(
exe
)
+
(
exe
,)
+
cmd
[
1
:]
# This could have given us back another bare executable
exe
=
normexe
(
cmd
[
0
],
env
=
env
)
return
(
exe
,)
+
cmd
[
1
:]
Back
|
FazBrowse Home
|
New Git URL