cvs2svn no con "xxx no es válido ,v archivo"
Pregunta
Finalmente encontré una respuesta a mi pregunta cuando quise publicarlo!Sin embargo, voy a seguir publicando, incluyendo mi respuesta, por si ayuda a alguien:
Cuando la conversión de CVS a Subversion cvs2svn error en algunos archivos con el mensaje
"xxx is not a valid ,v file"
¿Cuál es el problema?
Solución
Como resulta CVSNT omite el último 0xa de algunos archivos donde cvs2svn los necesita. Esto se puede solucionar fácilmente con el siguiente código C #:
static void Main(string[] args)
{
foreach (string file in Directory.GetFiles(args[0], "*,v", SearchOption.AllDirectories))
{
using (FileStream sin=File.Open(file, FileMode.Open, FileAccess.ReadWrite))
{
sin.Position=sin.Length-1;
if (sin.ReadByte()==0x40)
{
Console.WriteLine("fixed "+file);
sin.WriteByte(0xa);
}
}
}
}
Otros consejos
En mi caso hubo corrupción en la sección symbols
del archivo xxx,v
. El formato esperado es tag_name:tag_rev
, pero no hubo casos de:
- Falta
:tag_rev
por ejemplo,tag_name
Fijo mediante la supresión de la línea. - múltiple
tag_name
por ejemplotag_name1:tag_name2:tag_rev
Fijo quitando el segundo nombre de la etiqueta (que uno se quita probablemente depende de lo que son). - no válida delimitador de nombre / revisión. En mi caso, el carácter no válido siempre se
z
(sólo hay diferencia de 1 bit entre:
ASCII yz
).
por ejemplo,tag_nameztag_rev
Fijo reemplazando elz
con:
.
Para ayudar durante mi investigación he añadido una línea print
a cvs2svn_rcsparse\common.py
. Si el análisis de los símbolos falla, la última etiqueta impresa es la causa.
def _parse_admin_symbols(self, token):
while 1:
tag_name = self.ts.get()
# WileCau print the token and tag_name
print 'token=|%s| tag_name=|%s|' % (token, tag_name)
if tag_name == ';':
break
self.ts.match(':')
tag_rev = self.ts.get()
self.sink.define_tag(tag_name, tag_rev)
La impresión adicional añade un buen montón de ruido a la salida de lo que podría ser más agradable para imprimir sólo si ocurre una excepción, pero esto era lo suficientemente bueno para mis necesidades.
También encontré este enlace que resultó no ser mi problema, pero puede ayudar a alguien más. Crédito a Christian Haarmann para la documentación de la misma.
En caso de que el enlace no es válida, el resumen es que alguien había editado el archivo xxx,v
y su editor había reemplazado 0x0A (LF) con 0x0D / 0x0A (CR / LF), y el carácter adicional causado el analizador de pensar el archivo era corrupto.
También he dicho error. Cuando uso cvs2git con el fin de migrar un repositorio CVS a Git, este error se produce durante varios archivos. He detectado que hay una falta de cierre 0x40 (@) al final del archivo.
Así que mi solución es:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
Si esto no soluciona el problema, a continuación, comparar el contenido del archivo dañado con el formato RCS-file: rcs_man_page
Una forma de solucionar esto es ejecutar rcs log *file,v*
, que puede proporcionar un poco de información.
En mi caso, he tenido algunos archivos que faltan @s, algunos de los archivos que falta un punto y coma, y la herramienta que se utiliza para importar mi edad repositorio en el cvspserver había tirado en un sin referencia versión.
Buena suerte!