はじめに
昔、ソースコードの文字コードチェックの必要が出てきたので、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ファイル存在します。 言語対応に関係ないソースばっかなので放置してます( ´∀`)
おしまい。