2010-02-05 7 views

Répondre

10

Dans Mercurial 1.4 et vous pouvez ensuite utiliser la commande sommaire, ce qui donne une sortie comme celui-ci lorsque des changements existent:

$ hg summary 
parent: 0:ad218537bdef tip 
commited 
branch: default 
commit: 1 modified 
update: (current) 

et ce post-commit:

$ hg summary 
parent: 1:ef93d692f646 tip 
sfsdf 
branch: default 
commit: (clean) 
update: (current) 

Alternativement, vous pouvez installer le prompt extension et faire quelque chose comme ceci:

$ hg prompt '{status}' 

qui émet un ! ou ? ou rien, selon le cas.

Ces deux, bien sûr, ne sont que des sorties de texte alternatives. Je n'ai pas pu trouver quelque chose qui utilisait le code de sortie directement, mais depuis $? vérifie la dernière commande dans un tuyau que vous pourriez faire?

hg summary | grep -q 'commit: (clean)' 

qui va définir $? non nul si des modifications non confirmées:

$ hg summary | grep -q 'commit: (clean)' ; echo $? 
0 
$ echo more >> that 
$ hg summary | grep -q 'commit: (clean)' ; echo $? 
1 
+0

Merci pour votre réponse. Je me suis retrouvé avec (dans zsh) '[[" rien n'a changé "=' 'hg ci -m tick'']] || hg push'. Et je ne l'aime pas parce que dans une future version de mercurial le libellé exact pourrait changer (cela s'applique également à votre solution de résumé hg).Oui, 'hg prompt '{status}'' devrait fonctionner correctement, sauf que je préférerais utiliser la fonctionnalité core hg car le script s'exécutera sur un hébergement externe afin que mon extension personnalisée (ainsi mise à jour manuellement) devienne un jour incomparable avec de nouveaux hg (autoupdated) version. –

+1

On dirait que mercurial n'est pas conçu pour être utilisé dans les scripts autant que git, n'est-ce pas? –

+2

Vos soucis concernant les changements de chaîne ont un sens, mais à court d'exécution dans un autre endroit, je ne pense pas que ce sera un problème. Matt Mackal, auteur mercurial, considère que la sortie de texte fait partie de l'API et aucune modification n'est permise pour la modifier si une autre option est disponible. Vous ne verrez pas ce changement de format. –

0

Il devrait y avoir quelque chose de plus élégant que simple

[ `hg st |wc -l` -eq 0 ] && echo hi 
4

Vous pouvez également exécuter hg id. Si le hachage se termine par +, cela indique que la copie de travail a été modifiée. Cela devrait même fonctionner avec les anciennes versions de hg.

Il semble que vous utilisiez déjà zsh; Eh bien, il ya quelques jours, j'ai aidé à mettre à jour le support Mercurial pour le VCS_INFO intégré pour mettre des informations VCS dans votre invite. La prise en charge de l'affichage des modifications dans le répertoire de travail (entre autres choses) est prévue pour la prochaine version. Si vous ne voulez pas attendre, vous pouvez grab the necessary files from CVS.

À l'heure actuelle mon invite inclut ce (en utilisant uniquement des fonctionnalités intégrées zsh):

(hg)[1801+ branchname somemq.patch, anycurrentbookmarks] 
+0

Merci! Cela ressemble à un hack mais en fait semble fonctionner :) Hmm. Cela fait un moment que j'ai vu CVS pour la dernière fois;) –

+0

Cela ne fonctionne pas si vous avez ajouté un nouveau fichier qui n'a pas été ajouté au dépôt – etalon11

2

J'utilise:

hg status -m -a -r -d -u 

Si aucun changement avec les fichiers chenillés, la sortie de commande est une chaîne vide.

+0

Fonctionne bien! J'ai ajouté le paramètre "-u" pour suivre les fichiers inconnus qui appartiennent également à des modifications non validées. – etalon11

2

J'utilise cette bash-bout depuis un certain temps:

if [[ $(hg status 2>/dev/null) ]] 
then 
    # do something 
fi 
+0

Ceci est déclenché avec des fichiers non-traités présents, ce qui peut ne pas être ce que vous voulez. – xixixao

1

Les deux id et summary sont plus lents que status, donc c'est le plus rapide que je sais actuellement, en ignorant les fichiers trassez:

[[ -z `hg status | grep -v '^?'` ]] && echo no-changes || echo has-changes 
Questions connexes