はじめに
昔、ソースコードの文字コードチェックの必要が出てきたので、pythonで作りJenkisで定期的にチェックを走らせるようにしたのでそのメモ
なぜソースコードの文字コードチェックが必要?
ゲームを開発してると、海外対応とか出てきて、s-Jisのソースに日本語が書かれてたりするとなにか問題になりがち。
ソースコードをウェブで見るとコメントが化ける!(出先でコード確認し辛い)
せっかくDoxygen形式でコメントをかいたのに全部化ける。
意味不明なコンパイルエラーとか起こったり起こらなかったり。
実装
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
@brief 文字コードチェック
@author DM
@date 2012/10/13
"""
import os, os.path, sys, re, time
import glob
import codecs
import chardet
# 無視するフォルダ
ignorelist = ["tgs","tools_src","shader","ext"]
# チェックするファイルの拡張子
extention = [".c",".cpp",".h",".inc",".inl",".hpp"]
# main
def main():
sys.stdout = codecs.getwriter("shift_jis")(sys.stdout) # 出力
sys.stdin = codecs.getreader("shift_jis")(sys.stdin) # 入力
# 使い方表示
if len(sys.argv) < 2 or len(sys.argv) > 4:
__usage()
sys.exit(0)
start_time = time.clock()
# プロジェクトのディレクトリ
path = os.path.normpath(sys.argv[1]) # モジュールファイルのパス取得
print(path)
ret = True
for (root, dirs, files) in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
base, ext = os.path.splitext(file_path)
ignore = False
for d in ignorelist:
if file_path.find(d) > 0:
ignore = True
break;
if ignore == True:
continue
if ext in extention:
try:
f = open(file_path, 'r')
data = f.read()
p = chardet.detect(data)
if p['encoding'] == 'SHIFT_JIS':
print('error',p['encoding'],file_path)
ret = False
except IOError:
print(file_path, 'cannot be opened.')
finally:
f.close()
end_time = time.clock()
print("complete![time: ",(end_time - start_time),"sec]")
if ret == False:
CODE='S001'
MESSAGE='shift-jis still exists!!'
EXPECTED='S999-error'
ACTUAL='sample ' + CODE +' '+ MESSAGE
sys.exit(EXPECTED+' '+ACTUAL)
# __main__
if __name__ == '__main__':
#psyco.full()
main()
- あとはJenkinsで定期的に
python mojicodecheck.py ${BUILD_DIR}
を実行すれば、
[MojiCodeCheck] $ /bin/sh -xe /tmp/hudson2121374754708119058.sh
+ python /var/lib/jenkins/workspace/soilproject/common/tools/mojicodecheck.py /var/lib/jenkins/workspace/soilproject
/var/lib/jenkins/workspace/soilproject
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/TGLSystemTypes.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/TGLEffectEmit.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgZanplu.h')
('error', 'SHIFT_JIS', '/var/lib/jenkins/workspace/soilproject/common/tgl/src/Effect/Program/EPrgSpiral.cpp')
('complete![time: ', 15.200000000000001, 'sec]')
S999-error sample S001 shift-jis still exists!!
Build step 'Execute shell' marked build as failure
Notifying upstream projects of job completion
Finished: FAILURE
こんな感じでs-Jisなソースがログに出力されます。
※現在アスタブリードでは、 s-Jisなファイルが78ファイル存在します。 言語対応に関係ないソースばっかなので放置してます( ´∀`)
おしまい。