by JBrooks
12. February 2017 17:36
Part 2 of 4 - Commit Hook
I’ve created a simple Subversion post commit hook by creating a batch file called post-commit.bat and saving it to my …\SVN\hooks directory. This batch file only has 1 line that calls a PowerShell script:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy bypass -file C:\DeployTest\DeployUtils\CreateOneScriptCMD.ps1 "%1" "%2"
(This should all be on a single line.) If you run this to test you need to “Run as Administrator.”
The arguments passed to the batch file are just passed to the PowerShell script file. The %1 is the path to the Subversion repository and the %2 is the revision number just created by the commit.
The CreateOneScriptCMD.ps1 PowerShell script will look at the directories just committed and then create a text file with the appropriate OneScript Command arguments. I then have a scheduled process that runs every few minutes that will see this new file and then do the real work. I did it this disconnected way so the developer doesn’t have to wait for the full process to complete when he does a commit.
Below is the CreateOneScriptCMD.ps1 script
param (
[Parameter(Mandatory=$true)]
[string]$REPOS,
[Parameter(Mandatory=$true)]
[string]$REV
)
Set-Location $PSScriptRoot
cls
$VerbosePreference = 'Continue'
#hash table of paths to arguements found in OneScriptClient
$Private:mapPathToArgs = @{"NorthwindDB/branches/" = "-s 1 -p 3 -fb -ra -b {0}" }
$Private:index = -1
$Private:branchPath
$Private:author
$Private:args
foreach($Private:dir in svnlook dirs-changed $REPOS --revision $REV) {
Write-Verbose "Checking $dir"
foreach($Private:key in $mapPathToArgs.keys)
{
$index = $dir.indexOf($key)
Write-Verbose "index = $index"
if($index -gt -1) {
Write-Verbose "matched $key"
# $author = svnlook author $REPOS --revision $REV
# Write-Verbose "Author = $author"
Write-Verbose "Matched $dir"
$index = $index + $key.Length
Write-Verbose "New index $index"
$len = $dir.indexOf("/", $index) - $index
Write-Verbose "Len = $len"
$branchPath = $dir.Substring($index, $len)
Write-Verbose "Branch is $branchPath"
$args = $mapPathToArgs[$key] -f $branchPath
break
}
}
if($args)
{
break
}
}
if($args)
{
$Private:dt = Get-Date -Format yyyyMMdd_HHmmss
$Private:cmdFileName = "..\InCmds\OneScriptCmd_$dt.txt"
$args | Out-File $cmdFileName -Append
# $author | Out-File $CmdFileName -Append
}
This will generate a file named something like: C:\DeployTest\InCmds\OneScriptCmd_20170212_215709.txt
And its content will be a single line containing the arguments to use when creating the release script from OneScriptCMD in the next step. Its content will look something like:
-s 1 -p 3 -fb -ra -b "3.2"
These are the same arguments created from within the OneScript Client Windows program.