Как сделать ловушку перед фиксацией, которая предотвращает кодировки файлов не-UTF-8 - PullRequest
11 голосов
/ 30 июня 2010

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

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

Ответы [ 3 ]

8 голосов
/ 30 июня 2010

Ваш 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 , чтобы ограничить проверяемые пути.

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

4 голосов
/ 30 июня 2010

Хуки Precommit - это просто скрипты.Так что, если вы можете указать кодировку в скрипте, вы можете использовать эту информацию, чтобы отклонить неправильный тип файла.

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

2 голосов
/ 30 июня 2010

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

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ
testing = iconv: illegal input sequence at position 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...