2009-02-20 24 views
19

Attualmente vorrei semplicemente trovare tutti i file che non sono stati modificati negli ultimi X giorni, ma alla fine mi piacerebbe essere in grado di creare query più complesse contro il mio repository di subversion.Come posso interrogare il mio repository subversion?

Esiste un linguaggio di query di Subversion di qualche tipo o un'API che è possibile utilizzare?

risposta

14

È possibile utilizzare svn log comando per produrre un file XML con un sacco di informazioni su tutti i commit in questo modo:

svn log URL --xml --verbose > commits.xml 

Ci sono alcune altre opzioni si può giocare con per limitare l'intervallo di revisione, ottenere maggiori informazioni sugli oggetti di scena, includere informazioni di fusione, ecc.

Il problema diventa quindi "come si eseguono query sul contenuto di un documento XML", che è più semplice rispetto al lavoro con il API SVN esistenti. Ad esempio, in C# puoi fare LINQ queries on XML.

+1

In particolare, l'intervallo di --revision può includere un intervallo di date: [[svn log --verbose --revision '{2009-01-01}': '{2009-02-20} '--xml]] Ora, determinare quali NON sono stati modificati richiederà una post-elaborazione. – phord

2

Attualmente no, non esiste alcun linguaggio di query di sovversione o API basata su query che è ampiamente utilizzata (ok, ora guarda qualcuno contraddirmi, questa è la vita sulla rete, suppongo).

Questo significa che sei limitato a splicing insieme alle uscite dai normali comandi svn come

svn info 

e

svn log 

Sono sicuro che qualcosa di simile a bash o PowerShell potrebbero rendere questo almeno fattibile. Se sei bloccato con Windows batch, inizierei a piangere ora.

+2

Wow, davvero? Un serio bisogno di uno strumento utile per gli sviluppatori su qualsiasi piattaforma e non esiste? Che diamine stiamo facendo con i nostri pomeriggi e serate? –

+1

Non proprio, la maggior parte delle informazioni necessarie quotidianamente è facilmente disponibile nel set di comandi standard. È più insolito voler trovare un elenco di file che non sono stati modificati per un po 'di tempo. Sebbene la mia mente sia ora impegnata a creare SVNSQL, dannazione. –

+1

Linq2Svn - dannatamente va bene –

1

Come già accennato, svn log/info può essere combinato con i comandi della shell per trovare quello che vuoi. In alternativa, è possibile utilizzare direttamente l'API di SVN in C/C++ per elaborare in modo programmabile gli enti di repository. SVN ha collegamenti Python. Se Java è lingua di propria scelta, provare http://svnkit.com/

16

È possibile utilizzare il progetto SvnQuery (http://svnquery.tigris.org) che ha l'intenzione di fornire un'interfaccia di query per eseguire tali query. Ha un'API .NET e un front-end Web, che fornisce lo stesso linguaggio di query. Puoi eseguire query complesse con operatori, espressioni nidificate, caratteri jolly, frasi e frasi vuote. L'operatore che chiedi, calcolando la differenza tra ora e l'ultima data di commit, non è implementato, ma dato che è un progetto open source puoi volontario o farlo per una richiesta di funzionalità :-)

2

Con PowerShell si può fare qualche bel interrogazione sui messaggi di log

$data = [xml] (svn log -r "r1:r2" --xml) 
$data.log.logentry | where-object {$_.message -match "regex"} 

O anche sui file modificati (con un po 'di magia necessaria per evitare un problema di PowerShell noto)

$diff = [xml] (svn diff -r "r1:r2" --xml --summarize | %{$_ -replace "item", "item1"}) 
$diff.diff.paths.path | where-object {$_.item1 -eq "file"} 
1

Oltre all'utilizzo di una riga di comando di Subversion o di un client grafico come TortoiseSVN per visualizzare la cronologia del repository di svn, è possibile installare un programma avanzato interfaccia web per repository Subversion.

Ad esempio, in VisualSVN Server 3.2 e versioni successive è possibile utilizzare un visualizzatore cronologico delle revisioni basato sul Web, see the demo here.

Vedere la descrizione di the HTML5-based web svn client here.

1

Dalla versione 1.7 SVN, la copia di lavoro ha un file wc.db nella directory .svn. Si tratta di un database SQLite di base, quindi abbastanza facile da interrogare.

È necessario assicurarsi che la propria copia di lavoro sia aggiornata. Se stai facendo qualcosa di più di una selezione rapida e semplice, sarebbe più sicuro copiare il file piuttosto che rischiare di romperlo.

La data di modifica si basa sull'epoca di unix. Ad esempio:

sqlite3 .svn\wc.db "select changed_revision, datetime((changed_date/1000000),'unixepoch') changed_date, changed_author, repos_path from NODES" 
+0

Grazie mille per il 'changed_date/1000000'. Sei l'unico a parlarne. – steven

Problemi correlati