Mercurial script 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'
- À l'aide de sous-processus est bien, mais essayer de hg id -je "au lieu de "hg log'.
Vous devez vous connecter pour publier un commentaire.
C'est vrai il n'y a aucun officielle de l'API, mais vous pouvez vous faire une idée sur les meilleures pratiques en lisant d'autres extensions, en particulier ceux regroupés avec hg. Pour ce problème particulier, je voudrais faire quelque chose comme ceci:
Mise à jour À un certain point, le paramètre d'ordre a changé, maintenant c'est comme ça:
hg.repository(ui.ui(), path)
/opt/mercurial/mercurial/__init__.py
mais je reconnais que la plupart ne pas être là. Tout comme un point de référence, mon hg exécutable est à l'intérieur de/opt/mercurial
et j'ai construit à l'aide demake local
.Voulez-vous dire cette documentation?
Notez que, comme indiqué dans cette page, il n'y a pas de officiel API, parce qu'ils ont encore de la réserve le droit de modifier à tout moment. Mais vous pouvez voir la liste des changements dans les dernières versions, il n'est pas très étendue.
Une mise à jour, plus propre version sous-processus (utilisations
.check_output()
, ajouté en Python 2.7/3.1) que j'utilise dans mon Django fichier de paramètres pour un brut de fin de déploiement de bout en vérifier (j'ai un dump dans un commentaire HTML):Vous pourriez l'envelopper dans un
try
si vous ne voulez pas quelque étrange hoquet pour éviter de démarrage:donner un essai à le mot-clé de l'extension
Si vous utilisez Python 2, vous souhaitez utiliser
hglib
.Je ne sais pas quoi en faire l'usage si vous êtes à l'aide de Python 3, désolé. Probablement
hgapi
.Contenu de cette réponse
Mercurial Api
Mercurial officielles Api.
hglib
(wiki, PyPI) package, qui est géré par l'Mercurial équipe.sous-processus
, ouhgapi
, ou somesuch.Comment utiliser hglib
Installation:
Utilisation:
Plus de renseignements sur l'utilisation de la hglib page wiki.
Pourquoi hglib est le meilleur choix pour Python 2 utilisateurs
Car elle est maintenue par l'Mercurial équipe, et c'est ce que l'Mercurial équipe recommander pour l'interfaçage avec Mercurial.
À partir Mercurial wiki, la déclaration suivante sur l'interfaçage avec Mercurial:
À partir de l'invite du serveur de la page:
L'interface Python à l'Mercurial de commande du serveur, comme l'a dit, est
hglib
.Par commande frais généraux de l'interface de ligne de commande n'est pas une blague, par la manière. Une fois, j'ai construit une très petite suite de test (seulement environ 5 tests) qui ont utilisé la
hg
viasubprocess
de créer, de s'engager par commettre une poignée de repos avec par exemple la fusion des situations. Tout au long du projet, l'exécution de la suite séjourné entre 5 à 30 secondes, avec presque tout le temps consacré à lahg
appels.Si vous êtes à la rédaction d'un crochet, qui décourageait l'interface interne est drôlement pratique
La signature d'un Python fonction de raccordement est comme suit:
ui
etrepo
font partie de ladite découragé officieux API interne. Le fait qu'ils sont là, dans votre fonction args rend très pratique à utiliser, comme dans cet exemple depreupdate
crochet qui interdit les fusions entre certaines branches.Si votre code de hook n'est pas si important, et vous n'êtes pas le publier, vous pourriez choisir d'utiliser les découragés officieux interne de l'API. Si votre crochet fait partie d'une extension que vous êtes à la publication, à une meilleure utilisation
hglib
.FWIW pour éviter l'extraction de la valeur sur chaque page/voir le rendu, je viens d'avoir mon déployer le mettre dans la
settings.py
fichier. Alors je peut faire référence àsettings.REVISION
sans tous les frais généraux de l'accès mercurial et/ou un autre processus. Avez-vous jamais avoir cette variation de valeur de w/o rechargement de votre serveur?J'ai voulu faire la même chose que l'OP voulait faire, obtenir
hg id -i
à partir d'un script (obtenir la dernière révision de l'ensemble du RÉFÉRENTIEL, non pas d'un seul FICHIER dans ce repo) mais je n'ai pas envie d'utiliser popen, et le code debrendan
qui m'a, mais n'était pas ce que je voulais.J'ai donc écrit ce... Commentaires/critiques de bienvenue. Cela devient à la pointe rev en hexadécimal comme une chaîne de caractères.