Node:El método lento de deshacer cosas, Next:, Previous:Examinar y deshacer cambios, Up:Un día con CVS



El método lento de deshacer cosas

Este método utiliza la combinación de opciones -p y -r al hacer la actualización. La opción -p envía el contenido de la revisión indicada a la salida estándar.

De por sí, no es que esto sea algo terriblemente útil, dado que el contenido del fichero desaparecerá rápidamente por la ventana, dejando intacta la copia de trabajo. Sin embargo, redirigiendo la salida estándar al fichero, el fichero terminará recibiendo el contenido de la antigua revisión. Sería lo mismo que haber editado el fichero a mano para llevarlo a ese estado.

Primero, sin embargo, mperez necesita ponerse al día respecto al repositorio:

paste$ cvs update
cvs update: Updating .
U hello.c
cvs update: Updating a-subdir
cvs update: Updating a-subdir/subsubdir
cvs update: Updating b-subdir
paste$ cat hello.c
#include <stdio.h>

void
main ()
{
  printf ("¡Hola, mundo!\n");
  printf ("ENTRE HOLA Y ADIÓS.\n");
  printf ("¡Adiós, mundo!\n");
}
paste$

Lo siguiente que hace es emplear la opción -p al invocar la actualización, para asegurarse de que la revisión 1.3 es justo la que quiere:

paste$ cvs update -p -r 1.3 hello.c
===================================================================
Checking out hello.c
RCS:  /usr/local/cvs/miproyecto/hello.c,v
VERS: 1.3
***************
#include <stdio.h>

void
main ()
{
  printf ("¡Hola, mundo!\n");
  printf ("entre hola y adiós\n");
  printf ("¡Adiós, mundo!\n");
}

Ooops, hay algunas líneas inútiles al comienzo. En realidad estas líneas no se envían a la salida estándar sino al flujo de error estándar, así que son inofensivas. Aún así, estas líneas hacen más difícil interpretar la información, y pueden ser suprimidas con -Q:

paste$ cvs -Q update -p -r 1.3 hello.c
#include <stdio.h>

void
main ()
{
  printf ("¡Hola, mundo!\n");
  printf ("entre hola y adiós\n");
  printf ("¡Adiós, mundo!\n");
}
paste$

Ahí estamos - esto es exactamente lo que mperez quería obtener. El siguiente paso es poner ese contenido en el fichero de la copia de trabajo, usando una redirección Unix (que es lo que hace el signo ">"):

paste$ cvs -Q update -p -r 1.3 hello.c > hello.c
paste$ cvs update
cvs update: Updating .
M hello.c
cvs update: Updating a-subdir
cvs update: Updating a-subdir/subsubdir
cvs update: Updating b-subdir
paste$

Al hacer ahora la actualización, el fichero aparece como modificado, lo cual tiene sentido dado que su contenido ha cambiado. Específicamente, tiene el mismo contenido que la antigua revisión 1.3 (no es que CVS se dé cuenta de que es idéntica a la revisión antigua, tan sólo se da cuenta de que se ha modificado). Si mperez quiere estar aún más seguro, puede hacer un diff para comprobarlo:

paste$ cvs -Q diff -c
Index: hello.c
===================================================================
RCS file: /usr/local/cvs/miproyecto/hello.c,v
retrieving revision 1.4
diff -c -r1.4 hello.c
*** hello.c     1999/04/20 04:14:37     1.4
--- hello.c     1999/04/20 06:02:25
***************
*** 4,9 ****
  main ()
  {
    printf ("¡Hola, mundo!\n");
!   printf ("ENTRE HOLA Y ADIÓS.\n");
    printf ("¡Adiós, mundo!\n");
  }
--- 4,9 --
  main ()
  {
    printf ("¡Hola, mundo!\n");
!   printf ("entre hola y adiós\n");
    printf ("Adiós, mundo!\n");
  }
paste$

Sí, esto es exactamente lo que él quería: una verdadera vuelta atrás. De hecho, es lo contrario del diff que obtuvo previamente. Satisfecho, lo envía:

paste$ cvs ci -m "devuelto al código 1.3"
cvs commit: Examining .
cvs commit: Examining a-subdir
cvs commit: Examining a-subdir/subsubdir
cvs commit: Examining b-subdir
Checking in hello.c;
/usr/local/cvs/miproyecto/hello.c,v  <-  hello.c
new revision: 1.5; previous revision: 1.4
done
paste$