forked from zulip/zulip
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck-py3
executable file
·134 lines (123 loc) · 4.29 KB
/
check-py3
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
#!/bin/bash
set -e
fixers="
lib2to3.fixes.fix_apply
lib2to3.fixes.fix_except
lib2to3.fixes.fix_exitfunc
lib2to3.fixes.fix_funcattrs
lib2to3.fixes.fix_has_key
lib2to3.fixes.fix_idioms
lib2to3.fixes.fix_intern
lib2to3.fixes.fix_isinstance
lib2to3.fixes.fix_methodattrs
lib2to3.fixes.fix_ne
lib2to3.fixes.fix_numliterals
lib2to3.fixes.fix_paren
lib2to3.fixes.fix_reduce
lib2to3.fixes.fix_renames
lib2to3.fixes.fix_repr
lib2to3.fixes.fix_standarderror
lib2to3.fixes.fix_sys_exc
lib2to3.fixes.fix_throw
lib2to3.fixes.fix_tuple_params
lib2to3.fixes.fix_types
lib2to3.fixes.fix_ws_comma
lib2to3.fixes.fix_xreadlines
libfuturize.fixes.fix_absolute_import
libfuturize.fixes.fix_future_standard_library_urllib
libfuturize.fixes.fix_next_call
libfuturize.fixes.fix_print_with_import
libfuturize.fixes.fix_raise
libmodernize.fixes.fix_basestring
libfuturize.fixes.fix_division_safe
libmodernize.fixes.fix_file
libmodernize.fixes.fix_filter
libmodernize.fixes.fix_imports_six
libmodernize.fixes.fix_input_six
libmodernize.fixes.fix_int_long_tuple
libmodernize.fixes.fix_map
libmodernize.fixes.fix_raise_six
libmodernize.fixes.fix_xrange_six
libmodernize.fixes.fix_zip
libmodernize.fixes.fix_unicode_type
libpasteurize.fixes.fix_newstyle
"
echo; echo "Testing for additions of Python 2 patterns we've removed as part of moving towards Python 3 compatibility."; echo
if [ -n "$(git status --porcelain)" ]; then
echo "The repository is not clean. check-py3 can only be run if the repository is clean."
echo "Displaying output from 'git status --porcelain' to help debug"
git status --porcelain
exit 1
fi
script_dir=$(dirname "$0")
lister_path="$script_dir/lister.py"
python_files="$($lister_path -f py)"
if [ -z "$python_files" ]; then
echo "There are no python files to check in the current directory."
exit 0
fi
quick=1
if [ "$1" == "--find-fixers" ]; then
quick=0
fi
fixer_options=""
for fixer in $fixers; do
fixer_options+="-f $fixer "
done
failed=0
# run quick check
echo "Running quick Python 3 compatibility test"
echo "$python_files" | xargs futurize $fixer_options -j4 -n -w >/dev/null 2>/dev/null
if ! git diff --exit-code; then
# Clear the output from this one
git reset --hard >/dev/null
failed=1
fi
# run slow check
if [ "$failed" = "1" -a "$quick" == "0" ]; then
echo "Running each fixer separately to find out which fixers need to be applied"
for fixer in $fixers; do
echo "Running Python 3 compatibility test $fixer"
echo "$python_files" | xargs futurize -f $fixer -j4 -n -w >/dev/null 2>/dev/null
if ! git diff --exit-code; then
# Clear the output from this one
git reset --hard >/dev/null
fi
done
fi
# The dict fixer tries to add list() even in for loops over an
# iterator where it's just counterproductive. To address this, we run
# the fixer but check for lines which don't include code that works
# with iterators (currently for, join, and from_iterable).
fixer="libmodernize.fixes.fix_dict_six"
echo "Running python 3 compatability test $fixer"
echo "$python_files" | xargs python-modernize -f $fixer -j4 -n -w >/dev/null 2>/dev/null
if git --no-pager diff | grep "^+ " | grep -v '[ ]*for' | grep -v [.]join | grep -v from_iterable; then
echo
echo "Error: the above are changes suggested by python-modernize "
echo "to handle the list=>iterator transition in Python 3."
echo "Because 'python-modernize -f libmodernize.fixes.fix_dict_six' is spammy "
echo "and also changes places where an iterator works fine, this output "
echo "does not display the full context; you can find the diff with context by "
echo "searching through the (unfortunately very spammy) full output below:"
echo
git --no-pager diff
echo
echo "That was a lot of text! Read this output from the top for more readable details."
failed=1
fi
# Clear the output
git reset --hard >/dev/null
if git grep -q '\(^\W*import StringIO\|^\W*from StringIO\)'; then
echo "ERROR: StringIO imports not compatible with python 2+3:"
git grep '\(^\W*import StringIO\|^\W*from StringIO\)'
echo "Please use 'from six.moves import cStringIO as StringIO'"
failed=1
fi
echo
if [ "$failed" == "0" ]; then
echo "No issues detected!"
else
echo "Python 3 compatibility error(s) detected! See diffs above for what you need to change."
exit 1
fi