2013-10-09 14 views
28

Come posso trovare la versione di copia di lavoro (SVN 1.7 vs 1.8) dando un'occhiata ai file all'interno di .svn senza utilizzare alcuno strumento SVN?Scopri la versione di copia di lavoro SVN (1.7 o 1.8)

+1

possibile duplicato di [Come faccio a determinare SVN Copia di lavoro VERSIONE?] (http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-version) –

+1

Esiste già una risposta più generale a questa domanda: http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-v ersion –

+0

Possibile duplicato di * [Come si determina la versione del layout di copia di lavoro SVN?] (http://stackoverflow.com/questions/1364618) *. –

risposta

41

Mi stavo chiedendo da solo per un po 'e non sono riuscito a trovare una risposta da nessuna parte, nemmeno guardando il database SQLite. Così ho finito per esaminare il codice sorgente di Subversion, dove ho scoperto che la versione è effettivamente archiviata nel database, non stavo semplicemente cercando nel posto giusto. Ecco il frammento di rilevante dal subversion/libsvn_subr/sqlite.c:

svn_error_t * 
svn_sqlite__read_schema_version(int *version, 
           svn_sqlite__db_t *db, 
           apr_pool_t *scratch_pool) 
{ 
    (...) 
    SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool)); 
    (...) 
} 

non ero nemmeno a conoscenza del PRAGMA dichiarazione, che, secondo la SQLite documentation è ...

... un'estensione SQL specifica per SQLite e usato per modificare il funzionamento della libreria SQLite o per interrogare la libreria SQLite per dati interni (non tabella).

Quindi, ipotizzando una versione ragionevolmente up-to-data di SQLite sul PATH si può fare ...

sqlite3 .svn/wc.db "PRAGMA user_version" 

... nella root della vostra copia di lavoro, che sarà poi resa per esempio 29 per Subversion 1.7.13 e 31 per Subversion 1.8.0. Sfortunatamente non sembra esserci alcuna lista correlata alla versione di Subversion user_version, ma se sei interessato a cosa consistono effettivamente nelle modifiche del formato, puoi trovarle descritte nelle fonti in subversion/libsvn_wc/wc-metadata.sql per il formato 20 in poi.

Update 1: Affrontare la questione di come recuperare il valore di user_version senza un eseguibile SQLite: Hai bisogno di leggere un DWORD all'offset 60 nel file di database, come specificato nel SQLite file format specification (vedi "1.2 Database Intestazione").

Aggiornamento 2: Per chiarire ulteriormente come visualizzare in un visualizzatore di file di testo/binario: Dal momento che gli attuali numeri di versione sono ancora piuttosto basso e in forma in un singolo byte (vale a dire che sono più piccolo di 255) e una DWORD è lungo quattro byte, al momento è sufficiente osservare il byte meno significativo, ovvero il numero di byte 64. Di seguito è riportato uno screenshot di come appare in un file di database SQLite di Subversion 1.8.0 che contiene 31 per user_version - come già menzionato sopra.

Subversion 1.8.0 SQLite database in Text viewer

Update 3: mi è stato sempre alla ricerca di un modo per farlo "query binari" tali con uno strumento da riga di comando, per evitare di gettare Perl o tali al problema. Turns out there's a *nix utility for that called od (e l'ho anche preso nella mia collezione di porte win32, yay!).od può ottenere il byte meno significativo di user_version come questo:

od -An -j63 -N1 -t dC .svn/wc.db 

Questo sarà di nuovo in uscita 31 per Subversion 1.8.0 e così via.

-2

Impossibile trovare la documentazione su questo finora, tuttavia la risposta breve è - è possibile. Sbircia nel file \.svn\format. Ad esempio, il numero 12 significa che la copia di lavoro è in formato SVN 1.8. Presumo che se si tratta di SVN 1.7, vedrete lo 11 lì.

+3

-1 No, non è così - l'ho provato con Subversion 1.7.13 contro 1.8.0 ed entrambi hanno restituito '12' nel file' format'. – zb226

+1

Ciò potrebbe essere dovuto al fatto che quelle versioni condividono lo stesso formato di pronti contro termine ... – prodigitalson

+1

OK, ma ciò non aiuta ancora a distinguere un 1.7 da un 1.8 WC - che è la domanda. Non è possibile operare su un 1.7 WC con 1.8 e viceversa. – zb226

15

Se esiste .svn/formato, quindi leggere il numero in esso:

Version 7 is SVN 1.3 
Version 8 is SVN 1.4 
Version 9 is SVN 1.5 

Se .svn/formato non esiste quindi il numero di versione è sulla prima riga in .svn/voci:

Version 10 is SVN 1.6 
Version 12 is SVN 1.7 
+3

Questo è quello che ho provato, ma sembra che le mie copie di lavoro SVN 1.7 e SVN 1.8 mostrino entrambe la versione 12. –

+0

@ThomasS. sei sicuro che entrambe le copie funzionanti siano SVN differenti? – Shafeeque

+0

Lo sono, il formato è stato modificato da 1.7 a 1.8 e non sono compatibili tra loro. – mliebelt

Problemi correlati