2010-11-26 20 views
8

Escenario: He "heredado" un programa, mantiene bajo mercurial, que sólo funciona en mi sistema con ajustes específicos a ciertos archivos que se comprueban en la Primera No quiere comprobar estos ajustes en¿Puede Mercurial hacer un parche invertido?

.. Mi solución más reciente a esto es crear un archivo de revisión mercurial (hg diff> patchfile) que contenga estos ajustes; cuando necesite verificar mis cambios, aplicaré el parche, confirmaré y volveré a aplicar el parche. (Si tuviera el control total de la fuente, movería todos estos pequeños ajustes a un solo archivo de configuración que no está bajo control de versión, poniendo un archivo de configuración de "muestra" bajo control de versión)

Desafortunadamente, parece que si bien el comando GNU patch es compatible con el indicador --reverse, no admite el formato diff de archivos múltiples de hg como un solo archivo de parche (o tal vez lo haga, y no conozco los conmutadores para él). OTOH, hg tiene su propio comando patch que puede aplicar el diff, pero que no admite ningún tipo de indicador reverse.

Así que mi pregunta es doble:

  1. Cómo debe hacerse esto en mercurial? Sin duda, aferrarse a un "parche de ajuste" no es la única forma de manejar esta situación. Tal vez Mercurial tiene un complemento o algo incorporado para tales cambios temporales, no modificables.
  2. Aparte de cómo se deben hacer las cosas , ¿hay alguna forma de aplicar de forma inversa un parche difumérico mercurial a un repositorio mercurial como este? Hay otras situaciones en las que tal funcionalidad sería útil.

Respuesta

19

de Mercurial patch de comandos (en realidad import) no admite inversa, pero hg diff hace. Usa --reverse en eso y tendrás un parche invertido que Mercurial puede aplicar.

Sin embargo, lo que está describiendo es un flujo de trabajo de estilo de rama de vendedor muy ordenado, que mercurial puede soportar mejor el uso de características distintas a diff y patch.

Específicamente, Mercurial Queues hace exactamente lo que quiere.

+0

Esto se ve cerca de lo que yo quiero (Voy a tener que admitir que nunca me tomé el esfuerzo de aprender MQ hasta ahora). Sin embargo, ahora que he agregado mi parche al mq e hice los cambios que deseo confirmar, 'hg ci' se queja de que" no puedo enviar más de un parche mq aplicado ". No puedo 'qpop' el parche antes de comprometerme, ya que hay cambios locales en el repositorio. Esto parece ser un punto muerto que impide de manera decisiva que MQ resuelva el problema, a menos que me esté perdiendo algo. – eternicode

+0

@eternicode: No puede 'hg commit' un parche, pero puede' hg qfinish'. – robert

+0

@robert Lee mi pregunta nuevamente. Yo * no * quiero comprometer el parche, nunca. I * do * quiero confirmar los cambios que hice después de que el parche esté en la cola, pero sin los cambios introducidos por ese parche. Parece que MQ no es la herramienta adecuada para esto, solo por esa razón. – eternicode

1

Encontré que el enfoque inverso no funcionaba cuando tenía sub repos. es decir,

hg diff --reverse -S 

. En caso de que ayuda a nadie, este script apenas parece probado para hacer el trabajo:

#!/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 
Cuestiones relacionadas