icdiffとは
ターミナル上で横並びにファイル比較ができるツール。
公式でも紹介されているように、gitに組み込むこともできる。
icdiffのデフォルトエンコーディングはutf-8
以下のようにデフォルトでutf-8で読み込むようになっている。
parser.add_option(
"--encoding",
default="utf-8",
help="specify the file encoding; defaults to utf8",
)
ところが、業務でutf-8
とshift-jis
の両方を同時に扱うことがある。
そのため差分ファイルにutf-8
とshift-jis
が混ざった状態でgit icdiff
を叩くと、shift-jis
側のファイルはエンコードエラーとなる。
error: file 'filename.jsp' not valid with encoding 'utf-8': <invalid start byte> at 191-192.
※shift-jis
のオプションをつけると今度はutf-8
のファイルがエラーになる。
特定のファイルだけshift-jisで開くように無理やり改造
以下3行を追加して特定のファイル(*.jsp
)だけsjisで無理やり読み込むようにした。
def read_file(fname, options):
try:
with codecs.open(fname, encoding=options.encoding, mode="rb") as inf:
return inf.readlines()
except UnicodeDecodeError as e:
+++ if '.jsp' in fname:
+++ with codecs.open(fname, encoding='sjis', mode="rb") as inf:
+++ return inf.readlines()
codec_print(
"error: file '%s' not valid with encoding '%s': <%s> at %s-%s."
% (fname, options.encoding, e.reason, e.start, e.end),
options,
)
raise
except LookupError:
codec_print(
"error: encoding '%s' was not found." % (options.encoding), options
)
sys.exit(EXIT_CODE_ERROR)
pythonには詳しくないが、例外処理の中を無理やり書き換えているのであまり良くないのはわかる。
他にいいやり方ご存じの方教えてください。