# encoding: ascii # api: powershell # title: init_repoclones.ps1 # description: A script for creating clones of one or more svn repositories. It can only clone multiple repositories if they only differ by one substring (e.g. they all are svn repos on google code, sourceforge, codeplex, or some other forge.) # version: 0.1 # type: script # author: Justin Dearing # license: CC0 # x-poshcode-id: 3633 # x-archived: 2012-09-15T04:34:35 # x-published: 2012-09-09T20:54:00 # # <# .SYNOPSIS Makes a local copy of one or more remote svn repositories. .DESCRIPTION Makes a local copy of one or more remote svn repositories. .INPUTS None You cannot pipe objects to init-repoclones.ps1 .OUTPUTS None .EXAMPLE #> param ( [string[]] $Repos = @('protobuf', 'mb-unit', 'opennode2'), [string] $RemoteRepoFormat = 'http://{0}.googlecode.com/svn/', [string] $LocalRepoBasePath = (Split-Path (Get-Variable MyInvocation).Value.MyCommand.Path), [switch] $DeleteExisting ) # check that we have the svn executables we need @('svnsync.exe', 'svnadmin.exe') | % { if (-not (Get-Command $_ -ErrorAction SilentlyContinue)) { Write-Host "The executable `"$($_)`" is required by this script and was not found on the path."; exit 1; } } $Repos | % { $localRepoPath = (Join-Path $($LocalRepoBasePath) $_); $localRepoUri = ([uri]($localRepoPath)).AbsoluteUri; $remoteRepo = [string]::Format($RemoteRepoFormat, $_); if (Test-Path $localRepoPath) { if ($DeleteExisting) { Write-Host "$($localRepoPath) already exists. Deleting . . ."; rm -r -f $localRepoPath; } else { Write-Host "$($localRepoPath) already exists. Skipping initialization . . ."; } } else { Write-Host "Cloning $($remoteRepo) into $($localRepoPath)" & svnadmin create $localRepoPath; [IO.File]::WriteAllText((Join-Path $localRepoPath 'hooks\pre-revprop-change.bat'), 'exit 0'); & svnsync init $localRepoUri $remoteRepo; } & svnsync sync $localRepoUri $remoteRepo; }