Edited at

ソースコードの文字コードチェックスクリプト

More than 5 years have passed since last update.


はじめに

昔、ソースコードの文字コードチェックの必要が出てきたので、pythonで作りJenkisで定期的にチェックを走らせるようにしたのでそのメモ


なぜソースコードの文字コードチェックが必要?


  • ゲームを開発してると、海外対応とか出てきて、s-Jisのソースに日本語が書かれてたりするとなにか問題になりがち。


  • ソースコードをウェブで見るとコメントが化ける!(出先でコード確認し辛い)


  • せっかくDoxygen形式でコメントをかいたのに全部化ける。


  • 意味不明なコンパイルエラーとか起こったり起こらなかったり。



実装


mojicodecheck.py

#! /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ファイル存在します。 言語対応に関係ないソースばっかなので放置してます( ´∀`)

おしまい。