3

これが私の差分の最初の部分です。

#!/usr/bin/env python
import fileinput
import difflib
import subprocess
import sys

# for debugging
def info(type, value, info):
    import traceback
    traceback.print_exception(type, value, info)
    print
    pdb.pm()

sys.excepthook = info
import pdb
#end debugging

if len(sys.argv) == 8:
    # assume this was passed to git; we can of course do
    # some parsing to check if we got valid git style args
    args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
    args = sys.argv[1:]
else:
    exit("Not a valid number of args (2 or 7) to this diff program")
print "Files: " + ' '.join(args)
for filename in args:
    filetype = subprocess.check_output(['file', filename])
    if filetype.find('text') == -1:
        args.insert(0, 'diff')
        print "A binary file was found: " + filename + ", deferring to diff"
        exit(subprocess.call(args))

diffバイナリ (または非テキスト) ファイルが検出されると、バイナリ ファイルが異なるかどうかを取得するために fork を試みます。目標は、この python 差分プログラムを git の外部差分として使用することです。

しかし、バイナリファイルにヒットすると、このぞっとするような「外部差分が終了しました。<file> で停止します」というメッセージが表示されます。

git は私のプログラムをどのように評価していますか? 死んだことをどうやって知るのですか?戻り値は異なる状態を示すはずではありませんか?

4

1 に答える 1

2

コードに exit 関数はありません。に置き換えexitてみてはsys.exitどうですか?

#!/usr/bin/env python

import subprocess
import sys

if len(sys.argv) == 8:
    # assume this was passed to git; we can of course do
    # some parsing to check if we got valid git style args
    args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
    args = sys.argv[1:]
else:
    print "Not a valid number of args (2 or 7) to this diff program"
    sys.exit(1)
print "Files: ", args
for filename in args:
    filetype = subprocess.check_output(['file', filename])
    if filetype.find('text') == -1:
        args.insert(0, 'diff')
        print "A binary file was found: " + filename + ", deferring to diff"
        #sys.stdout.flush()
        subprocess.call(args)
        sys.exit(0)

編集:git外部差分の終了ステータスに依存します。 diff違いがない場合のみ、0 で終了します。そのため、diff の終了ステータスを使用しないようにコードを変更しました。

PS: sys.stdout.flush() を使用しないと、diff出力が出力よりも先に行われprintます。

于 2013-06-13T05:31:05.797 に答える