3

Linux BashでSVNpre-commitフックスクリプトを作成しようとしています。このスクリプトは、ファイルをUTF-8として解析できない場合にコミットを拒否します。

これまでのところ、私はこのスクリプトを書きました:

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook
ICONV=/usr/bin/iconv

# Make sure that all files to be committed are encoded in UTF-8

for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS"); do
    if [$ICONV -f UTF-8 $FILE -o /dev/null]; then
        echo "Only UTF-8 files can be committed ("$FILE")" 1>&2
        exit 1
    fi

# All checks passed, so allow the commit.
exit 0

問題は、iconvがコミットされたファイル(または他の形式のテキスト)へのパスを必要とし、それを取得する方法がわからないことです。

誰か助けてもらえますか?

4

3 に答える 3

3

ちなみにこの回答には問題があります!$ SVNLOOKコマンド($?)の結果をテストする必要があります。これは、命令「exit 1」が子プロセスにあり、スクリプトがコミットをブロックしないためです。

#!/bin/bash

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
ICONV=/usr/bin/iconv

# Make sure that all files to be committed are encoded in UTF-8.
$SVNLOOK changed -t "$TXN" "$REPOS" | while read changeline; do

    # Get just the file (not the add / update / etc. status).
    file=${changeline:4}

    # Only check source files.
    if [[ $file == *.cpp || $file == *.hpp || $file == *.c || $file == *.h ]] ; then
        $SVNLOOK cat -t "$TXN" "$REPOS" $file 2>&1 | iconv -f UTF-8 -t UTF-8 >& /dev/null
        if [ $? -ne 0 ] ; then
            exit 1
        fi
    fi
done
test $? -eq 1 && echo "Only UTF-8 files can be committed" 1>&2 && exit 1
exit 0
于 2014-10-16T09:41:39.480 に答える
1

svnlook catトランザクションからファイルの内容を取得するために使用します。

$SVNLOOK cat -t "$TXN" "$REPOS" "$FILE"
于 2011-12-02T10:38:16.523 に答える
0

元の質問のスクリプトとこの回答に基づいて、これらすべてをまとめたpre-commitフックを次に示します。

#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook
ICONV=/usr/bin/iconv

# Make sure that all files to be committed are encoded in UTF-8.
$SVNLOOK changed -t "$TXN" "$REPOS" | while read changeline; do

    # Get just the file (not the add / update / etc. status).
    file=${changeline:4}

    # Only check source files.
    if [[ $file == *.cpp || $file == *.hpp || $file == *.c || $file == *.h ]] ; then
        $SVNLOOK cat -t "$TXN" "$REPOS" "$file" 2>&1 | iconv -f UTF-8 -t UTF-8 >& /dev/null
        if [ $? -ne 0 ] ; then
            echo "Only UTF-8 files can be committed ("$file")" 1>&2
            exit 1
        fi
    fi
done

# All checks passed, so allow the commit.
exit 0
于 2013-03-21T18:26:19.777 に答える