2010-11-26 42 views
8

Scénario: J'ai « hérité » d'un programme, maintenu sous Mercurial, qui ne fonctionne que sur mon système avec quelques réglages spécifiques à certains fichiers qui sont sélectionnés dans je ne suis pas veulent vérifier ces réglages dansEst-ce que Mercurial peut faire un reverse-patch?

.. Ma solution la plus récente à cela est de créer un fichier correctif mercurial (hg diff> patchfile) contenant ces réglages; Lorsque j'ai besoin de vérifier mes modifications, je vais simplement appliquer le correctif, valider et réappliquer le correctif. (Si j'avais le contrôle total de la source, je déplacerais tous ces petits réglages dans un seul fichier de configuration qui n'est pas sous contrôle de version, en plaçant un fichier de configuration "sample" sous le contrôle de version)

Malheureusement, il semble que tandis que la commande GNU patch supporte l'indicateur --reverse, il ne supporte pas le format diff multi-fichiers de hg comme un seul fichier patch (ou peut-être le fait, et je ne connais pas les commutateurs pour cela?). OTOH, hg a sa propre commande patch qui peut appliquer le diff, mais qui ne supporte aucun type de drapeau reverse.

Donc, ma question est double:

  1. Comment devrait cela soit fait dans Mercurial? Sûrement accroché à un "patch tweak" n'est pas le seul moyen de gérer cette situation. Peut-être que mercurial a un plugin ou quelque chose de intégré pour de tels changements temporaires, incommutables.
  2. Mis à part la façon dont devrait être fait, est-il possible d'inverser l'application d'un tel patch diff mercurial à un repo mercurial comme ceci? Il existe d'autres situations où une telle fonctionnalité serait utile.

Répondre

19

commande de Mercurial patch (vraiment import) ne prend pas en charge inverse, mais hg diff fait. Utilisez --reverse sur cela et vous aurez un correctif inversé que Mercurial peut appliquer. Toutefois, ce que vous décrivez est un flux de travail de type «Vendor-Branch» très simple, qui peut mieux prendre en charge l'utilisation de fonctions autres que diff et patch.

Spécifiquement, Mercurial Queues fait exactement ce que vous voulez.

+0

Cela ressemble à ce que je veux (je dois admettre que je ne prenais jamais l'effort d'apprendre MQ jusqu'à présent). Cependant, maintenant que j'ai ajouté mon patch au mq et apporté les modifications que je veux commettre, 'hg ci' se plaint que je" ne peux pas commettre sur un patch mq appliqué ". Je ne peux pas "qpop" le patch avant de le commettre, car il y a des changements locaux dans le repo. Cela semble être une impasse qui empêche de façon décisive MQ de résoudre le problème, à moins que je ne manque quelque chose. – eternicode

+0

@eternicode: Vous ne pouvez pas 'hg commit' un patch, mais vous pouvez le' hg qfinish'. – robert

+0

@robert Relisez ma question. Je * ne veux * pas commettre le patch, jamais. Je veux * valider * les modifications que j'ai faites après que le correctif soit dans la file d'attente, mais sans les changements introduits par ce correctif. Il semble que MQ n'est pas le bon outil pour cela, juste pour cette raison. – eternicode

1

J'ai trouvé que - l'approche inverse ne fonctionnait pas lorsque vous avez des sous-dépôts. c'est-à-dire

hg diff --reverse -S 

. Dans le cas où il aide tout le monde, ce script à peine testé semble faire le travail:

#!/bin/bash 

DIRS="$*" 

if [[ $DIRS = "" ]]; then 
    DIRS=$(echo *) 
fi 

for arg in $DIRS; do 
    arg=$(echo $arg | sed 's/^\.\/*//g') 
    repo=$(echo $arg | cut -d'/' -f-1) 

    grep -q "^$repo = " .hgsub 2>/dev/null 
    if [ $? -eq 0 ]; then 
     if [ -d $repo ]; then 
      cd $repo 
      hg diff --reverse | sed -e "s;--- a;--- a/$repo;g" -e "s;+++ b;--- b/$repo;g" 
      cd .. 
     else 
      echo Error, unknown repo $repo 
     fi 
    else 
     hg diff $arg --reverse 
    fi 
done