Dump di repositories svn con powershell

…mentre c’è chi sollazza in quel di Anaheim, con un nuovo tablet dotato di un windows 8 fiammante…

Ultimamente sto inserendo prepotentemente powershell nello stack tecnologico con cui ho a che fare, o meglio con cui voglio avere a che fare, nelle attività lavorative di tutti i giorni.

A “causa” di una ristrutturazione interna del nostro sistema di gestione della codebase e del processo di build (di cui parleremo in un prossimo post) ho avuto la necessità di “dumpare” tutti i nostri repository svn e zipparli per permetterne una facile archiviazione. Perchè non farlo con powershell, mi sono detto…ecco come me la sono cavata:

$svnadmin = "C:\Program Files (x86)\VisualSVN Server\bin\svnadmin.exe"

Get-ChildItem "C:\Repositories" |
    Where-Object { $_.mode -match "d" } |
    ForEach-Object { & $svnadmin dump $fullname |
        Out-File -Encoding ASCII "C:\temp\dump\$_.svndump" }

In queste poche righe di codice si capisce la potenza espressiva di powershell…si paga un po’ in termini di verbosità, è innegabile, ma tant’è…non sono un po’ di caratteri in più a spaventarci 🙂

Un paio di commenti a margine:

  • con l’operatore “” concateniamo istruzioni successive: l’output della precedente viene “riversato” come input della successiva
  • l’istruzione alla riga 4 permette di filtrare tutte e solo le directory risultanti dall’operazione precedente
  • con l’operatore “&” eseguiamo un comando (in questo caso svnadmin.exe)
  • l’istruzione alla riga 6 fa il redirect dello standard output sul file indicato

Facile no?

La fase di “archiviazione” si è rivelata anche meno complicata e mostra esplicitamente l’integrazione tra powershell e ogni componente del .net framework. Ecco lo snippet:

[System.Reflection.Assembly]::LoadFrom("C:\temp\ICSharpCode.SharpZipLib.dll")

Get-ChildItem "C:\temp\dump" |
    ForEach-Object {
        $filename = "c:\temp\archive\$_.zip"
        $zip = [ICSharpCode.SharpZipLib.Zip.ZipFile]::Create($filename)
        $zip.BeginUpdate()
        $zip.Add($_.fullname)
        $zip.CommitUpdate()
        $zip.Close()
    }