cvs2svn fallisce con “xxx non è un, v file valido”
Domanda
Ho finalmente trovato una risposta alla mia domanda quando ho voluto pubblicarlo! Comunque sarò ancora post-it, tra cui la mia risposta, nel caso in cui aiuta a qualcun altro:
Quando la conversione da CVS a Subversion cvs2svn fallito su alcuni file con il messaggio
"xxx is not a valid ,v file"
Qual è il problema?
Soluzione
Come si scopre CVSNT omette l'ultima 0xa da alcuni file dove cvs2svn ha bisogno di loro. Questo può essere facilmente risolto con il seguente codice 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);
}
}
}
}
Altri suggerimenti
Nel mio caso ci fosse la corruzione nella sezione symbols
del file xxx,v
. Il formato previsto è tag_name:tag_rev
, ma ci sono stati casi di:
- Manca
:tag_rev
esempiotag_name
fisso cancellando la linea. - Multiple
tag_name
esempiotag_name1:tag_name2:tag_rev
fisso rimuovendo il secondo nome di tag (che uno si rimuove probabilmente dipende da quello che sono). - non valido delimitatore nome / revisione. Nel mio caso il carattere non valido è stato sempre
z
(c'è solo differenza 1-bit tra:
ASCII ez
).
esempiotag_nameztag_rev
fisso sostituendo ilz
con:
.
Per aiutare durante la mia indagine ho aggiunto una linea print
a cvs2svn_rcsparse\common.py
. Se l'analisi dei simboli non riesce, l'ultima etichetta stampata è 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 stampa addizionale aggiunge un bel po 'di rumore all'uscita quindi potrebbe essere più bello di stampare solo dopo un'eccezione accade, ma questo era abbastanza buono per le mie esigenze.
Inoltre ho trovato questo link che si è rivelata non essere il mio problema, ma può aiutare qualcun altro. Si ringrazia Christian Haarmann per documentare esso.
Nel caso in cui il link non è più valido, la sintesi è che qualcuno aveva modificato il file xxx,v
e loro editore aveva sostituito 0x0A (LF) con 0x0D / 0x0A (CR / LF), e il carattere aggiuntivo causato il parser di pensare il file era corrotta.
Ho anche un errore del genere. Quando uso cvs2git per la migrazione di un repository CVS a git, questo errore si verifica per diversi file. Ho rilevato che c'è manca un chiusura 0x40 (@) alla fine del file.
Quindi la mia soluzione è:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
Se questo non risolve il problema, quindi confrontare il contenuto del file danneggiato con il formato RCS-file: rcs_man_page
Un modo per risolvere questo è quello di eseguire rcs log *file,v*
, che potrebbe fornire qualche informazione.
Nel mio caso, ho avuto alcuni file mancanti @ 's, alcuni file mancanti un punto e virgola, e lo strumento che ho usato per importare il mio vecchio repository sul cvspserver aveva gettato in una versione senza riferimenti.
In bocca al lupo!