Come migrare da CVSNT su Windows 2003 Server a CVS su Mac OS X 10.6

Recentemente ho eseguito una migrazione di svariati servizi ed applicativi da un server Microsoft Windows 2003 ad un Mac OS X 10.6 Snow Leopard, tra cui un CVSNT in cui erano versionati progetti aziendali da svariati anni. Nel passaggio alla gestione tramite cvs offerta dal server Mac, ci siamo imbattuti in un serio problema relativo ai file binari.

Tutti i file binari venivano interpretati come ascii, divenendo quindi inutilizzabili in seguito ad un checkout/export eseguito da un client non UNIX, ovvero quando i caratteri di fine linea e fine file venivano adattati al nuovo sistema operativo. Dopo aver verificato l’intestazione dei file binari sul server cvs (vale a dire i file con estensione ‘,v’), ci siamo accorti che la direttiva che identificava tali file come non ascii non era presente, ma era sostituita da una adottata a questo scopo su CVSNT. Per la precisione, mentre su CVS di identifica un file binario con la direttiva ‘kopt b‘, su CVSNT questa viene sostituita da ‘expand @b@‘. Non siamo stati certo i primi ad aver affrontato questo problema, e San Google, tanto per cambiare, ci ha aiutato. Su questo sito il tema era già stato trattato, ma la soluzione adottata non era direttamente applicabile al server Mac OS a causa di svariate limitazioni ai comandi bash ‘sed’ e ‘xargs’ nonché ad una gestione custom del carattere di capo riga per i file di testo che ci hanno costretto ad effettuare delle modifiche. In sintesi, l’idea è stata quella di inserire nei file del server cvs che presentavano la direttiva ‘kopt b’ anche quella utilizzata ufficialmente dai cvs. Per farlo, abbiamo lanciato il seguente comando bash sui vari path di installazione dei repository:

find . -not -name “*,v.bak” -exec grep -q “kopt.*b” {} \; -not -exec grep -q “expand.*@b@;” {} \; -print0 | xargs -0 -I ‘{}’ sh -c “sed -i ‘.bak’ ‘s/access;/access;\’$’\nexpand @b@;/’ {}”

 

Il comando, piuttosto complesso, estrae tutti i file della directory in cui viene lanciato e delle directory figlie che contengono la riga ‘kopt b’, che non contengono la riga ‘expand @b@’ e il cui nome non termina per ‘,v.bak’. Su ognuno di questi file viene inserita la riga ‘expand @b@;’ immediatamente dopo la riga ‘access;’, ma prima viene fatta una copia di backup per sicurezza. Dopo questo processamento, tutti i file binari sono stati interpretati correttamente. C’è solo un’osservazione da fare: lo script non gradisce nomi di file o directory con spazi o simboli come ‘$’, e la loro presenza impedisce il corretto processamento di questi casi.

Per una verifica preventiva su quali siano i file che necessitano della fix, ecco un comando innocuo che ne stampa la lista dei nomi:

find . -not -name “*,v.bak” -exec grep -q “kopt.*b” {} \; -not -exec grep -q “expand.*@b@;” {} \; -print0 | xargs -0 -I ‘{}’ sh -c “echo conv {};”

Mi raccomando, meglio avere sempre un backup prima di fare qualunque cosa.

Lascia un commento