cvs2svn échoue avec « xxx est pas valide, le fichier v »
Question
J'ai finalement trouvé une réponse à ma question quand je voulais le poster! Cependant, je posterai encore, y compris ma réponse, au cas où il aide quelqu'un d'autre:
Lors de la conversion de CVS à Subversion cvs2svn a échoué sur certains fichiers avec le message
"xxx is not a valid ,v file"
Quel est le problème?
La solution
Il se trouve que le dernier CVSNT omet 0xa de certains fichiers où cvs2svn a besoin d'eux. Ceci peut être facilement fixé avec le code c # suivant:
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);
}
}
}
}
Autres conseils
Dans mon cas, il y avait la corruption dans la section symbols
du fichier xxx,v
. Le format attendu est tag_name:tag_rev
, mais il y avait des cas de:
- manquant
:tag_rev
par exempletag_name
| Fixe en supprimant la ligne. - Multiple
tag_name
par exempletag_name1:tag_name2:tag_rev
| Fixe en enlevant le deuxième nom de la balise (celui que vous supprimez dépend probablement de ce qu'ils sont). - Nom non valide / delimiter de révision. Dans mon cas, le caractère non valide a toujours été
z
(il n'y a qu'une différence de 1 bit entre:
ASCII etz
).
par exempletag_nameztag_rev
| Fixe en remplaçant lez
avec:
.
Pour aider au cours de mon enquête, j'ai ajouté une ligne de print
à cvs2svn_rcsparse\common.py
. Si l'analyse syntaxique des symboles échoue, la dernière étiquette imprimée est la cause.
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)
L'impression supplémentaire ajoute beaucoup de bruit à la sortie de sorte qu'il pourrait être plus agréable de n'imprimer si une exception se produit, mais cela était assez bon pour mes besoins.
J'ai aussi trouvé ce lien qui se est avéré ne pas être mon problème, mais peut aider quelqu'un d'autre. Crédit à Christian Haarmann pour documenter.
Dans le cas où le lien devient invalide, le résumé est que quelqu'un avait modifié le fichier de xxx,v
et leur éditeur avait remplacé 0x0A (LF) avec 0x0D / 0x0A (CR / LF), et le caractère supplémentaire causé l'analyseur de penser le fichier était corrompu.
J'ai aussi une telle erreur. Lorsque j'utilise cvs2git pour migrer un dépôt cvs à git, cette erreur se produit pour plusieurs fichiers. J'ai détecté qu'il ya un manque de clôture à la fin du fichier 0x40 (@) .
Donc, ma solution est:
1. Open the corrupted cvs-history-file e.g. with vim (maybe in binary mode)
2. Add the missing @
Si cela ne résout pas le problème, puis de comparer le contenu du fichier corrompu avec le format RCS-file: rcs_man_page
Une façon de résoudre c'est d'exécuter rcs log *file,v*
, ce qui peut vous donner un aperçu.
Dans mon cas, j'ai eu quelques fichiers manquants @ 's, certains fichiers manquants un point-virgule, et l'outil que je l'habitude d'importer mon ancien référentiel sur le cvspserver avait jeté dans une version non référencée.
Bonne chance!