Как сделать крюк предварительной фиксации, который предотвращает кодирование файлов, отличных от UTF-8

Можно ли сделать крюк precommit для git или svn, который может отклонять файлы, не переданные в определенной кодировке?

Я работал над несколькими проектами, где кажется, что проблема связана с определенной кодировкой файла (например, UTF-8)

Ответ 1

Ваш iconv может сказать вам, что что-то не UTF-8, но другие кодировки могут быть не такими легкими (особенно 8-битные, однобайтовые кодировки, такие как ISO-8859-1).

Для Git вам может понадобиться крюк обновления вместо привязки к предварительной фиксации (чтобы он мог запускаться в центральном репозитории для обеспечения соблюдения правила).

Git pre-commit hook:

#!/bin/sh
git ls-files -z -- |
xargs -0 sh -c '

    e=""
    for f; do
        if ! git show :"$f" |
             iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then
            e=1
            echo "Not UTF-8: $f"
            #exit 255 # to abort after first non-UTF-8 file
        fi
    done
    test -z "$e"

' -

Поместите один или несколько путей Git pathspecs после -- в командной строке Git ls-files, чтобы ограничить проверенные имена путей.

Чтобы проверить верхушку обновленного ref в привязке к обновлению, используйте git ls-tree --name-only -r -z $3 -- | для генерации путей (обратите внимание: он не обрабатывает шаблоны pathspecs, такие как Git ls-files, так что любая фильтрация на основе шаблонов в shell code) и git show "$3:$f" для извлечения содержимого файла. Вы также можете проверить не только фиксацию наконечника, но и каждую новую фиксацию (цикл для каждой фиксации в git rev-list ^$2 $3 вместо просто $3).

Ответ 2

Захваты для предварительного компиляции - это просто скрипты. Поэтому, если вы можете указать кодировку в script, вы можете использовать эту информацию, чтобы отклонить неправильный тип файла.

Вы можете искать файл для символов вне нормального диапазона символов. Если есть волшебное число или тег, чтобы указать вам кодировку для файла, вы можете проверить это. В противном случае спросите себя: "Как я узнаю, что этот файл находится в неправильной кодировке?" Можете ли вы записать это?

Ответ 3

Возможно, вы можете использовать утилиту iconv для изменения кодировки с UTF-8 до, например, UTF-16. И если сбой не выполняется, исходный файл не находится в правильной кодировке:

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ
testing = iconv: illegal input sequence at position 11