2011-01-10 2 views
1

Toute personne utilisant mercurial pour gérer un noyau Linux? C'est un peu long, mais je ne suis pas sûr s'il y a une réponse à cela. Je voulais donner quelques exemples de l'aideUtilisation de mercurial pour gérer le noyau Linux, les balises et l'ID hg

Voici ce que je vois:

dans le noyau linux, il y a une commande utilisée lors de la construction appelé scripts/setlocalversion. Dans ce script, il définit la version du noyau en fonction des informations du référentiel. Actuellement, il comprend git, mercurial et svn repo.

Pour git, il crée l'étiquette avec ce code:

if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then 

    # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore it, 
    # because this version is defined in the top level Makefile. 
    if [ -z "`git describe --exact-match 2>/dev/null`" ]; then 

     # If we are past a tagged commit (like "v2.6.30-rc5-302-g72357d5"), 
     # we pretty print it. 
     if atag="`git describe 2>/dev/null`"; then 
      echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' 
..... 

Alors, voici un exemple que je l'ai fait pour comprendre comment cela fonctionne:

[1536][mcrowe:test]$ git tag -a -m"Creating a tag" KernelTest 
[1537][mcrowe:test]$ git rev-parse --verify --short HEAD 
d024e76 
[1537][mcrowe:test]$ git describe --exact-match 
KernelTest 
[1537][mcrowe:test]$ git describe 
KernelTest 

Ainsi, dans cet exemple, local La version sera définie sur "KernelTest" lors de la construction du noyau.

Dans mercurial, cependant, le code pour obtenir la version locale est la suivante:

if hgid=`hg id 2>/dev/null`; then 
    tag=`printf '%s' "$hgid" | cut -d' ' -f2` 

    # Do we have an untagged version? 
    if [ -z "$tag" -o "$tag" = tip ]; then 
     id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` 
     printf '%s%s' -hg "$id" 
    fi 
.... 

Mon attente est que je pouvais marquer une version, et à cette étiquette soit ce que ce script utilise, comme cela arrive dans git . Cependant, il semble que « id hg » n'imprime l'étiquette comme ce script attend:

[1546][mcrowe:test2]$ hg tag -m"Creating a tag" KernelTest -r tip 
[1548][mcrowe:test2]$ hg id 
3ccda5e738ae+ tip 
[1548][mcrowe:test2]$ hg tags 
tip        115:3ccda5e738ae 
KernelTest      114:be25df80ce76 

donc cet acte de marquage modifie la révision si id hg ne sera jamais montrer ce que l'étiquette est.

Question de base: Autant que je sache, cela ne fonctionnera jamais pour le noyau linux. La question est de savoir comment cela devrait être implémenté dans l'arbre du noyau pour permettre hg tag d'effectuer comme git tag?

+0

ajoute un commit supplémentaire par défaut, peut-être essayez-vous plutôt localtags? 'tag -l' – tonfa

+0

J'aimerais pouvoir le faire, mais cela devient un serveur d'intégration continue. Besoin de tags globaux, malheureusement. –

+1

Les tags commits sont une fonctionnalité et non un bug. :) Voir ma réponse ci-dessous pour quelque chose qui pourrait fonctionner pour vous. –

Répondre

3

Essayez de faire:

hg log -r . --template '{latesttag}' 

Je pense que fait ce que vous voulez.

Il ya aussi {latesttagdistance} qui peut vous faire savoir que vous avez passé une balise N pour une chaîne de version pratique. La balise

+0

Parfait. Je posterai le code final sous peu en incorporant ceci –

+0

Notez que si une révision a deux balises, elles seront toutes les deux renvoyées avec un deux-points les séparant ("tag1: tag2") – Matt

Questions connexes