30 votes

Script Mercurial avec python

Je suis en train d'essayer d'obtenir l'mercurial numéro de révision/id (c'est une table de hachage n'est pas un nombre) par programmation en python.

La raison est que je veux ajouter à la css/js fichiers sur notre site web comme:

<link rel="stylesheet" href="example.css?{% mercurial_revision "example.css" %}" />

De sorte que chaque fois qu'une modification est apportée à la feuille de style, il va obtenir une nouvelle url et de ne plus utiliser l'ancienne version en cache.

OU si vous savez où trouver de la bonne documentation pour l'mercurial module python, qui serait également utile. Je n'arrive pas à le trouver n'importe où.

Ma Solution

J'ai fini à l'aide de sous-processus de l'exécuter une commande qui permet d'obtenir le hg nœud. J'ai choisi cette solution parce que l'api n'est pas garanti de rester le même, mais le bash interface sera probablement:

import subprocess

def get_hg_rev(file_path):
    pipe = subprocess.Popen(
        ["hg", "log", "-l", "1", "--template", "{node}", file_path],
        stdout=subprocess.PIPE
        )
    return pipe.stdout.read()

exemple d'utilisation:

> path_to_file = "/home/jim/workspace/lgr/pinax/projects/lgr/site_media/base.css"
> get_hg_rev(path_to_file)
'0ed525cf38a7b7f4f1321763d964a39327db97c4'

15voto

brendan Points 1382

Il est vrai qu'il n'y a pas d'API officielle, mais vous pouvez vous faire une idée des meilleures pratiques en lisant d'autres extensions, en particulier celles fournies avec hg. Pour ce problème particulier, je ferais quelque chose comme ceci:

 from mercurial import ui, hg
from mercurial.node import hex

repo = hg.repository('/path/to/repo/root', ui.ui())
fctx = repo.filectx('/path/to/file', 'tip')
hexnode = hex(fctx.node())
 

Mettre à jour À un moment donné, l'ordre des paramètres a changé, maintenant c'est comme ceci:

    repo = hg.repository(ui.ui(), '/path/to/repo/root' )
 

8voto

Roberto Liffredo Points 15265

Voulez-vous dire cette documentation ?
Notez que, comme indiqué dans cette page, il n'y a pas d'API officielle , car ils se réservent toujours le droit de la modifier à tout moment. Mais vous pouvez voir la liste des changements dans les dernières versions, elle n'est pas très complète.

6voto

Nick T Points 5466

Une version de sous-processus mise à jour et plus propre (utilise .check_output() , ajoutée en Python 2.7 / 3.1) que j'utilise dans mon fichier de paramètres Django pour une vérification de déploiement de bout en bout grossière (je la jette dans un commentaire HTML) :

 import subprocess

HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()
 

Vous pouvez l'envelopper dans un try si vous ne voulez pas qu'un hoquet étrange empêche le démarrage:

 try:
    HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()
except OSError:
    HG_REV = "? (Couldn't find HG)"
except subprocess.CalledProcessError as e:
    HG_REV = "? (Error {})".format(e.returncode)
except:
    # should never have to deal with a hangup 
    HG_REV = "???"
 

3voto

dfa Points 54490

1voto

Ry4an Points 56453

FWIW pour éviter de récupérer cette valeur sur chaque rendu de page / vue, je viens de le mettre dans le fichier settings.py . Ensuite, je peux référencer settings.REVISION sans tous les frais généraux d'accès à mercurial et / ou à un autre processus. Avez-vous déjà eu ce changement de valeur sans recharger votre serveur?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X