Mercurial peut-il être fait pour préserver les permissions de fichiers?

J’ai vu un certain nombre d’articles de blog et j’ai constaté par moi-même que Mercurial ne conserve pas les permissions sur les fichiers transférés d’un repo à un autre. Est-ce que quelqu’un connaît une extension Mercurial qui préserverait les permissions? Je suppose que cela ne peut pas être fait avec un hook, car qu’est-ce qu’un hook connaît sur les permissions au repo d’origine?

Elaboration demandée:

  • Si le seul changement apporté à un fichier est une modification des permissions (par exemple, chmod o+r filename ), les tentatives de validation du fichier échouent avec un message indiquant que le fichier n’a pas été modifié.

  • Si je valide un fichier avec des permissions 600 (rw ——-), puis clone le repository, le même fichier dans le clone a des permissions 664 (rw-rw-r–):

     : nr@yorkie 6522 ; hg clone one two updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved : nr@yorkie 6523 ; ls -l one two one: total 4 -rw------- 1 nr nr 8 Aug 18 21:50 foo two: total 4 -rw-rw-r-- 1 nr nr 8 Aug 18 21:51 foo 

Cet exemple montre que le hg clone ne conserve pas les permissions, mais que hg push ne les conserve pas non plus.

Dans mon application, un repository est sur un chemin accessible au public et il est de la plus haute importance que

  • Plusieurs utilisateurs ont le droit de modifier le repository

  • Les fichiers du référentiel public ne deviennent lisibles que lorsqu’ils sont explicitement rendus lisibles.

    Il semble que cela puisse être fait en utilisant des crochets et un outil auxiliaire (et un peu de chewing-gum et de fil de presse):

    1. Procurez-vous le Metastore de David Hardeman, qui enregistre et restaure les métadonnées des fichiers.

    2. Modifiez les sources pour qu’il ignore le répertoire .hg ainsi que .git .

    3. Utilisez les crochets Mercurial suivants:

        precommit.meta = metastore -s changegroup.update = hg update update.meta = /usr/unsup/nr/bin/metastore -a 

    Vous devez append le fichier .metadata repository.

    Ce lashup fonctionnera la plupart du temps, mais si vous ne modifiez que les permissions et que vous souhaitez le propager, vous devrez exécuter metastore -s afin de transférer ces modifications dans le fichier .metadata où hg verra le changement; sinon le commit pense que rien n’est nouveau.

    Qu’en est-il de l’utilisation de cette solution à partir de la FAQ Mercurial :

    Si vous utilisez Mercurial pour la gestion des fichiers de configuration, vous pouvez également suivre les propriétés des fichiers (propriété et permissions). Mercurial ne suit que le bit exécutable de chaque fichier.

    Voici un exemple de sauvegarde des propriétés avec les fichiers (fonctionne sous Linux si le package acl est installé):

     # cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl # hg commit 

    C’est loin d’être parfait, mais vous avez l’idée. Pour une solution plus sophistiquée, consultez etckeeper.

    Pour le cas spécifique du répertoire / etc, etckeeper semble intéressant.

    Ce n’est pas une bonne idée de stocker des permissions dans VCS. Cependant, Mercurial prend en charge l’indicateur “executable” (ce n’est pas la même chose que les permissions, bien que dans Unix, le flag exécutable fasse partie des permissions).