-
Notifications
You must be signed in to change notification settings - Fork 163
/
checkEncoding.py
131 lines (116 loc) · 3.43 KB
/
checkEncoding.py
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
from chardet.universaldetector import UniversalDetector
import chardet
import os
import sys
import subprocess
import site
#########################################################
# 定数
#########################################################
patternUTF8_BOM = (
"utf-8-sig",
"ascii"
)
patternUTF8_NoBOM = (
"utf-8"
)
patternUTF16 = (
"utf-16"
)
expectEncoding = {
".cpp" : patternUTF8_BOM,
".h" : patternUTF8_BOM,
".rc" : patternUTF16,
".rc2" : patternUTF16
}
# チェック対象の拡張子リスト
extensions = expectEncoding.keys()
# 指定したファイルの文字コードを返す
def check_encoding(file_path):
detector = UniversalDetector()
with open(file_path, mode='rb') as f:
for binary in f:
detector.feed(binary)
if detector.done:
break
detector.close()
return detector.result['encoding']
# チェック対象の拡張子か判断する
def checkExtension(fileName):
base, ext = os.path.splitext(fileName)
return (ext in extensions)
# origin/master が存在するか確認する
# 戻り値
# origin/master が有効な場合 → 0
# origin/master が無効な場合 → 0以外
def checkOriginMaster():
retCode = 0
try:
output = subprocess.check_output('git show -s origin/master --')
except subprocess.CalledProcessError as gitcode:
retCode = gitcode.returncode
return retCode
def getMergeBase():
output = subprocess.check_output('git show-branch --merge-base origin/master HEAD')
outputDec = output.decode()
mergeBase = outputDec.splitlines()
return mergeBase[0]
# ベースとの差分をチェック
def getDiffFiles():
mergeBase = getMergeBase()
output = subprocess.check_output('git diff ' + mergeBase + ' --name-only --diff-filter=dr')
outputDec = output.decode()
diffFiles = outputDec.splitlines()
for fileName in diffFiles:
if checkExtension(fileName):
yield fileName
else:
print ("skip " + fileName)
# デバッグ用
# すべてのファイルを対象にチェック対象の拡張子のファイルの文字コードを調べてチェックする
def checkAll():
for rootdir, dirs, files in os.walk('.'):
for fileName in files:
if checkExtension(fileName):
full = os.path.join(rootdir, fileName)
yield full
# 指定したファイルの文字コードが期待通りか確認する
def checkEncodingResult(fileName, encoding):
base, ext = os.path.splitext(fileName)
encoding = encoding.lower()
if encoding in expectEncoding.get(ext, ()):
return True
return False
# 指定されたファイルリストに対して文字コードが適切かチェックする
# (条件に満たないファイル数を返す。)
def processFiles(files):
# 条件に満たないファイル数
count = 0
for fileName in files:
print ("checking " + fileName)
encoding = check_encoding(fileName)
if not checkEncodingResult(fileName, encoding):
print ("NG", encoding, fileName)
count = count + 1
else:
print ("OK", encoding, fileName)
return count
if __name__ == '__main__':
user_scripts = os.path.join(site.USER_BASE, "Scripts")
sys.path.append(user_scripts)
print ("adding " + user_scripts + " to PATH")
count = 0
if len(sys.argv) > 1 and sys.argv[1] == "all":
count = processFiles(checkAll())
else:
retCode = checkOriginMaster()
if retCode == 0:
count = processFiles(getDiffFiles())
else:
print ("skip. origin/master doesn't exist." + " retCode = " + str(retCode))
if count > 0:
print ("return 1")
sys.exit(1)
else:
print ("return 0")
sys.exit(0)