LoginSignup
9
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-26

はじめに

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

おしまい。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7