cvs2svn falha com “xxx não é, um arquivo v válido”
Pergunta
Eu finalmente encontrei uma resposta para a minha pergunta, quando eu queria publicá-la! No entanto eu ainda vou postá-lo, incluindo a minha resposta, no caso de ajuda de outra pessoa:
Ao converter de CVS para Subversion cvs2svn falhou em alguns arquivos com a mensagem
"xxx is not a valid ,v file"
Qual é o problema?
Solução
Como se vê omite CVSNT o último 0xA de alguns arquivos onde cvs2svn precisa deles. Isso pode ser facilmente corrigido com o seguinte 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);
}
}
}
}
Outras dicas
No meu caso houve corrupção na seção symbols
do arquivo xxx,v
. O formato esperado é tag_name:tag_rev
, mas houve casos de:
- Faltando
:tag_rev
por exemplotag_name
fixo, excluindo a linha. - Multiple
tag_name
por exemplotag_name1:tag_name2:tag_rev
fixo, removendo o segundo nome tag (qual deles você remover provavelmente depende do que eles são). - Nome inválido / delimitador revisão. No meu caso o caractere inválido foi sempre
z
(há apenas diferença de 1 bit entre:
ASCII ez
).
por exemplotag_nameztag_rev
fixo, substituindo oz
com:
.
Para ajuda durante a minha investigação eu adicionei uma linha print
para cvs2svn_rcsparse\common.py
. Se analisar os símbolos falhar, a última tag impressa é a 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)
A impressão adicional adiciona um monte de ruído para a saída por isso pode ser mais agradável para imprimir apenas se uma exceção acontece, mas isso era bom o suficiente para minhas necessidades.
Eu também encontrei este link que acabou por não ser meu problema, mas pode ajudar alguém. Crédito para Christian Haarmann para documentar-lo.
No caso da ligação se torna inválida, o resumo é que alguém tinha editado o arquivo xxx,v
e seu editor tinha substituído 0x0A (LF) com 0x0D / 0x0A (CR / LF), eo personagem adicional causado o analisador de pensar o arquivo era corrupto.
Eu também tenho erro tal. Quando eu uso cvs2git para migrar um repositório cvs para git, este erro ocorre por vários arquivos. Eu ter detectado que não está faltando um fechamento 0x40 (@) no final do arquivo.
Assim, a minha solução é:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
Se isto não corrigir o problema, em seguida, compare o conteúdo do arquivo corrompido com o formato RCS-file: rcs_man_page
Uma maneira de resolver isso é executar rcs log *file,v*
, o que pode fornecer-lhe algumas dicas.
No meu caso, eu tive alguns arquivos faltando @ 's, alguns arquivos faltando um ponto e vírgula, ea ferramenta que usei para importar meu antigo repositório para o cvspserver tinha jogado em uma versão sem referência.
Boa sorte!