Comment faire un crochet pre-commit qui empêche les encodages de fichiers non-UTF-8

StackOverflow https://stackoverflow.com/questions/3148731

  •  01-10-2019
  •  | 
  •  

Question

Est-il possible de faire un crochet pour git ou engager au préalable svn qui peut rejeter des fichiers non engagés dans un codage spécifique?

J'ai travaillé sur plusieurs projets où il semble être un problème de coller à un certain encodage de fichiers (comme UTF-8 par exemple)

Était-ce utile?

La solution

Votre iconv peut être en mesure de vous dire si quelque chose n'est pas UTF-8, mais d'autres encodages peuvent ne pas être si facile (en particulier 8 bits, codages à un seul octet comme ISO-8859-1) .

Pour Git, vous pouvez effectivement vouloir un crochet de mise à jour au lieu d'un crochet pre-commit (afin qu'il puisse être exécuté dans un référentiel central pour faire respecter la règle).

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"

' -

Mettre un ou plusieurs Git pathspecs après la -- sur les ls-fichiers git ligne de commande pour limiter les noms de fichiers qui sont cochés.

Pour vérifier la pointe de l'arbitre mis à jour dans un crochet de mise à jour, l'utilisation git ls-tree --name-only -r -z $3 -- | pour générer les noms de fichiers (Note: il ne gère pas pathspecs de motif comme git ls-fichiers , donc ne importe quel basée sur des modèles filtrage dans le code d'enveloppe) et git show "$3:$f" pour extraire le contenu du fichier. Vous pouvez également vérifier non seulement la pointe engage, mais chaque nouveau commit (boucle pour chaque engagement dans git rev-list ^$2 $3 au lieu de simplement $3).

Autres conseils

crochets ne sont que des scripts engager au préalable. Donc, si vous pouvez dire l'encodage dans un script, vous pouvez utiliser cette information pour rejeter le mauvais type de fichier.

vous pouvez rechercher le fichier pour les caractères en dehors de la plage de caractère normal. S'il y a un numéro de magie ou un tag pour vous dire l'encodage d'un fichier, vous pouvez vérifier. Sinon, demandez-vous « comment pourrais-je sais que ce fichier est dans le mauvais encodage? » Pouvez-vous le code qui vous?

Vous pourriez peut-être utiliser iconv utilitaire pour modifier le codage UTF-8 par exemple à UTF-16. Et si le changement échoue, le fichier source est pas l'encodage correct:

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ
testing = iconv: illegal input sequence at position 11
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top