diff --git a/.gitignore b/.gitignore
index 2fc43e4a10..3fd18e8e1f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -167,6 +167,7 @@ pip-log.txt
build/_BuildOutput/
build/*.nupkg
+build/TestResult.xml
*.db
_site/
\ No newline at end of file
diff --git a/build/Build.ImageProcessor.Plugins.WebP.proj b/build/Build.ImageProcessor.Plugins.WebP.proj
deleted file mode 100644
index c2fca90fde..0000000000
--- a/build/Build.ImageProcessor.Plugins.WebP.proj
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
- .\
-
-
-
-
-
-
-
- Release
- _BuildOutput\
- False
- $(MSBuildProjectDirectory)\$(BuildFolder)
- $(BuildFolderAbsolutePath)ImageProcessor.Plugins.WebP\lib\net45
- ..\src\Plugins\ImageProcessor\ImageProcessor.Plugins.WebP\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/Build.ImageProcessor.Web.proj b/build/Build.ImageProcessor.Web.proj
deleted file mode 100644
index ae6936faf0..0000000000
--- a/build/Build.ImageProcessor.Web.proj
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- .\
-
-
-
-
-
-
-
- Release
- _BuildOutput\
- False
- ..\..\..\build\$(BuildFolder)
- $(MSBuildProjectDirectory)\$(BuildFolder)
- $(BuildFolder)bin\
- $(BuildFolderRelativeToProjects)bin\
- $(BuildFolderAbsolutePath)ImageProcessor.Web\lib\net45
- ..\src\ImageProcessor.Web\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/Build.ImageProcessor.proj b/build/Build.ImageProcessor.proj
deleted file mode 100644
index 134c1ed9fe..0000000000
--- a/build/Build.ImageProcessor.proj
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
- .\
-
-
-
-
-
-
-
- Release
- _BuildOutput\
- False
- $(MSBuildProjectDirectory)\$(BuildFolder)
- $(BuildFolderAbsolutePath)ImageProcessor\lib\net45
- ..\src\ImageProcessor\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/Build.bat b/build/Build.bat
index deb60032ff..9fbd8906f5 100644
--- a/build/Build.bat
+++ b/build/Build.bat
@@ -1,34 +1,3 @@
-@ECHO OFF
+@echo off
-SET version=2.0.1.0
-SET webversion=4.0.0.0
-SET webconfigversion=2.0.0.0
-SET webppluginversion=1.0.1.0
-SET cairpluginversion=1.0.0.0
-
-ECHO Building ImageProcessor %version%, ImageProcessor.Web %webversion%, ImageProcessor.Web.Config %webconfigversion%
-
-ECHO Building ImageProcessor.Plugins.WebP %webppluginversion%, ImageProcessor.Plugins.Cair %cairpluginversion%
-
-ECHO Removing _BuildOutput directory so everything is nice and clean
-RD _BuildOutput /q /s
-
-%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.ImageProcessor.proj" /p:BUILD_RELEASE=%version% /p:BUILD_COMMENT=%comment%
-%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.ImageProcessor.Web.proj" /p:BUILD_RELEASE=%webversion% /p:BUILD_COMMENT=%comment%
-%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.ImageProcessor.Plugins.WebP.proj" /p:BUILD_RELEASE=%webppluginversion% /p:BUILD_COMMENT=%comment%
-%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.ImageProcessor.Plugins.Cair.proj" /p:BUILD_RELEASE=%cairpluginversion% /p:BUILD_COMMENT=%comment%
-
-ECHO Packing the NuGet release files
-..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.nuspec -Version %version%
-..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Web.nuspec -Version %webversion%
-..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Web.Config.nuspec -Version %webconfigversion%
-..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Plugins.WebP.nuspec -Version %webppluginversion%
-..\src\.nuget\NuGet.exe pack NuSpecs\ImageProcessor.Plugins.Cair.nuspec -Version %cairpluginversion%
-PAUSE
-
-IF ERRORLEVEL 1 GOTO :showerror
-
-GOTO :EOF
-
-:showerror
-PAUSE
+powershell "Import-Module %~dp0\psake.psm1 ; Invoke-Psake %~dp0\build.ps1 ; exit $LASTEXITCODE"
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll.REMOVED.git-id b/build/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll.REMOVED.git-id
deleted file mode 100644
index 0dc5124b53..0000000000
--- a/build/MSBuildCommunityTasks/ICSharpCode.SharpZipLib.dll.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-77bafe8ba867a1618b8735200289f6fad68b825e
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets b/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets
deleted file mode 100644
index 875d7c4c84..0000000000
--- a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
-
-
- $(MSBuildExtensionsPath)\MSBuildCommunityTasks
- $(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.chm.REMOVED.git-id b/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.chm.REMOVED.git-id
deleted file mode 100644
index 0863f2d0fa..0000000000
--- a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.chm.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-e9cfb77efd964e4fb6659c0c2cc9bc934b7edb17
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll.REMOVED.git-id b/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll.REMOVED.git-id
deleted file mode 100644
index 0c5894f4d6..0000000000
--- a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.dll.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-3d1dbd357f5e4ae47bf017d4227811bd052b5347
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml.REMOVED.git-id b/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml.REMOVED.git-id
deleted file mode 100644
index 7bdd152c52..0000000000
--- a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xml.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-0ddc819937fec260f50b99350f7643feced88342
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xsd.REMOVED.git-id b/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xsd.REMOVED.git-id
deleted file mode 100644
index c226e06db1..0000000000
--- a/build/MSBuildCommunityTasks/MSBuild.Community.Tasks.xsd.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-14f9e4c08f357d1b2f185dbe24df292ce74ef064
\ No newline at end of file
diff --git a/build/MSBuildCommunityTasks/Sample.proj b/build/MSBuildCommunityTasks/Sample.proj
deleted file mode 100644
index 3b52ad68c9..0000000000
--- a/build/MSBuildCommunityTasks/Sample.proj
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- list = new List();
- list.Add("Happy");
- list.Add("New");
- list.Add("Year");
- Console.WriteLine("Hello MSBuild Community Scripting World.");
- foreach(string s in list)
- {
- Console.WriteLine(s);
- }
- }
- ]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build/build.ps1 b/build/build.ps1
new file mode 100644
index 0000000000..f4dad22c3c
--- /dev/null
+++ b/build/build.ps1
@@ -0,0 +1,166 @@
+Properties {
+ # Input and output paths
+ $BUILD_PATH = Resolve-Path "."
+ $SRC_PATH = Resolve-Path "..\src"
+ $PLUGINS_PATH = Join-Path $SRC_PATH "Plugins\ImageProcessor"
+ $NUSPECS_PATH = Join-Path $BUILD_PATH "NuSpecs"
+ $BIN_PATH = Join-Path $BUILD_PATH "_BuildOutput"
+ $NUGET_OUTPUT = Join-Path $BIN_PATH "NuGets"
+ $TEST_RESULTS = Join-Path $BUILD_PATH "TestResults"
+
+ # External binaries paths
+ $NUGET_EXE = Join-Path $SRC_PATH ".nuget\NuGet.exe"
+ $NUNIT_EXE = Join-Path $SRC_PATH "packages\NUnit.Runners.2.6.3\tools\nunit-console.exe"
+ $OPENCOVER_EXE = Join-Path $SRC_PATH "packages\OpenCover.4.5.3207\OpenCover.Console.exe"
+ $REPORTGEN_EXE = Join-Path $SRC_PATH "packages\ReportGenerator.1.9.1.0\ReportGenerator.exe"
+ $NUNITREPORT_EXE = Join-Path $BUILD_PATH "tools\NUnitHTMLReportGenerator.exe"
+
+ # list of projects
+ [xml]$PROJECTS = Get-Content ".\build.xml"
+
+ $TestProjects = @(
+ "ImageProcessor.UnitTests",
+ "ImageProcessor.Web.UnitTests"
+ )
+}
+
+Framework "4.0x86"
+FormatTaskName "-------- {0} --------"
+
+task default -depends Cleanup-Binaries, Build-Solution, Run-Tests, Generate-Package
+
+# cleans up the binaries output folder
+task Cleanup-Binaries {
+ Write-Host "Removing binaries and artifacts so everything is nice and clean"
+ if (Test-Path $BIN_PATH) {
+ Remove-Item $BIN_PATH -Force -Recurse
+ }
+
+ if (Test-Path $NUGET_OUTPUT) {
+ Remove-Item $NUGET_OUTPUT -Force -Recurse
+ }
+
+ if (Test-Path $TEST_RESULTS) {
+ Remove-Item $TEST_RESULTS -Force -Recurse
+ }
+}
+
+# builds the solutions
+task Build-Solution -depends Cleanup-Binaries {
+ Write-Host "Building projects"
+
+ # build the projects
+ $PROJECTS.projects.project | % {
+ if ($_.projfile -eq $null -or $_.projfile -eq "") {
+ return # breaks out of ForEach-Object loop
+ }
+
+ $projectPath = Resolve-Path $_.folder
+ Write-Host "Building project $($_.name) at version $($_.version)"
+
+ # it would be possible to update more infos from the xml (description etc), so as to have all infos in one place
+ Update-AssemblyInfo -file (Join-Path $projectPath "Properties\AssemblyInfo.cs") -version $_.version
+
+ # using the invoke-expression on a string solves a few character escape issues
+ $buildCommand = "msbuild $(Join-Path $projectPath $_.projfile) /t:Build /p:Warnings=true /p:Configuration=Release /p:PipelineDependsOnBuild=False /p:OutDir=$(Join-Path $BIN_PATH $($_.output)) /clp:WarningsOnly /clp:ErrorsOnly /clp:Summary /clp:PerformanceSummary /v:Normal /nologo"
+ Exec {
+ Invoke-Expression $buildCommand
+ }
+ }
+}
+
+# builds the test projects
+task Build-Tests -depends Cleanup-Binaries {
+ Write-Host "Building the unit test projects"
+
+ if (-not (Test-Path $TEST_RESULTS)) {
+ mkdir $TEST_RESULTS | Out-Null
+ }
+
+ # make sure the runner exes are restored
+ & $NUGET_EXE restore (Join-Path $SRC_PATH "ImageProcessor.sln")
+
+ # build the test projects
+ $TestProjects | % {
+ Write-Host "Building project $_"
+ Exec {
+ msbuild (Join-Path $SRC_PATH "$_\$_.csproj") /t:Build /p:Configuration=Release /p:Platform="AnyCPU" /p:Warnings=true /clp:WarningsOnly /clp:ErrorsOnly /v:Normal /nologo
+ }
+ }
+
+}
+
+# runs the unit tests
+task Run-Tests -depends Build-Tests {
+ Write-Host "Running unit tests"
+ $TestProjects | % {
+ $TestDllFolder = Join-Path $SRC_PATH "$_\bin\Release"
+ $TestDdlPath = Join-Path $TestDllFolder "$_.dll"
+ $TestOutputPath = Join-Path $TEST_RESULTS "$($_)_Unit.xml"
+
+ Write-Host "Running unit tests on project $_"
+ & $NUNIT_EXE $TestDdlPath /result:$TestOutputPath /noshadow /nologo
+
+ $ReportPath = (Join-Path $TEST_RESULTS "Tests")
+ if (-not (Test-Path $ReportPath)) {
+ mkdir $ReportPath | Out-Null
+ }
+
+ Write-Host "Transforming tests results file to HTML"
+ & $NUNITREPORT_EXE $TestOutputPath (Join-Path $ReportPath "$_.html")
+ }
+}
+
+# runs the code coverage (separate from the unit test because it takes so much longer)
+task Run-Coverage -depends Build-Tests {
+ Write-Host "Running code coverage over unit tests"
+ $TestProjects | % {
+ $TestDllFolder = Join-Path $SRC_PATH "$_\bin\Release"
+ $TestDdlPath = Join-Path $TestDllFolder "$_.dll"
+ $CoverageOutputPath = Join-Path $TEST_RESULTS "$($_)_Coverage.xml"
+
+ Write-Host "Running code coverage on project $_"
+ & $OPENCOVER_EXE -register:user -target:$NUNIT_EXE -targetargs:"$TestDdlPath /noshadow /nologo" -targetdir:$TestDllFolder -output:$CoverageOutputPath
+
+ Write-Host "Transforming coverage results file to HTML"
+ & $REPORTGEN_EXE -reports:$CoverageOutputPath -targetdir:(Join-Path $TEST_RESULTS "Coverage\$_")
+ }
+}
+
+# generates a Nuget package
+task Generate-Package -depends Build-Solution {
+ Write-Host "Generating Nuget packages for each project"
+
+ # Nuget doesn't create the output dir automatically...
+ if (-not (Test-Path $NUGET_OUTPUT)) {
+ mkdir $NUGET_OUTPUT | Out-Null
+ }
+
+ # Package the nuget
+ $PROJECTS.projects.project | % {
+ $nuspec_local_path = (Join-Path $NUSPECS_PATH $_.nuspec)
+ Write-Host "Building Nuget package from $nuspec_local_path"
+
+ # change the version values
+ [xml]$nuspec_contents = Get-Content $nuspec_local_path
+ $nuspec_contents.package.metadata.version = $_.version
+ $nuspec_contents.Save($nuspec_local_path)
+
+ # pack the nuget
+ & $NUGET_EXE Pack $nuspec_local_path -OutputDirectory $NUGET_OUTPUT
+ }
+}
+
+# updates the AssemblyInfo file with the specified version
+# http://www.luisrocha.net/2009/11/setting-assembly-version-with-windows.html
+function Update-AssemblyInfo ([string]$file, [string] $version) {
+ $assemblyVersionPattern = 'AssemblyVersion\("[0-9]+(\.([0-9]+|\*)){1,3}"\)'
+ $fileVersionPattern = 'AssemblyFileVersion\("[0-9]+(\.([0-9]+|\*)){1,3}"\)'
+ $assemblyVersion = 'AssemblyVersion("' + $version + '")';
+ $fileVersion = 'AssemblyFileVersion("' + $version + '")';
+
+ (Get-Content $file) | ForEach-Object {
+ % {$_ -replace $assemblyVersionPattern, $assemblyVersion } |
+ % {$_ -replace $fileVersionPattern, $fileVersion }
+ } | Set-Content $file
+}
\ No newline at end of file
diff --git a/build/build.xml b/build/build.xml
new file mode 100644
index 0000000000..98376c30b5
--- /dev/null
+++ b/build/build.xml
@@ -0,0 +1,43 @@
+
+
+ ImageProcessor
+ 2.0.1.0
+ ..\src\ImageProcessor
+ ImageProcessor.csproj
+
+ ImageProcessor.nuspec
+
+
+
+ ImageProcessor Web
+ 4.0.0.0
+ ..\src\ImageProcessor.Web
+ ImageProcessor.Web.csproj
+
+ ImageProcessor.Web.nuspec
+
+
+
+ ImageProcessor Web.config sample
+ 2.0.0.0
+ ImageProcessor.Web.nuspec
+
+
+
+ ImageProcessor Cair plugin
+ 1.0.0.0
+ ..\src\Plugins\ImageProcessor\ImageProcessor.Plugins.Cair
+ ImageProcessor.Plugins.Cair.csproj
+
+ ImageProcessor.Plugins.Cair.nuspec
+
+
+
+ ImageProcessor WebP plugin
+ 1.0.1.0
+ ..\src\Plugins\ImageProcessor\ImageProcessor.Plugins.WebP
+ ImageProcessor.Plugins.WebP.csproj
+
+ ImageProcessor.Plugins.WebP.nuspec
+
+
\ No newline at end of file
diff --git a/build/coverage.bat b/build/coverage.bat
new file mode 100644
index 0000000000..16cb3e6d6a
--- /dev/null
+++ b/build/coverage.bat
@@ -0,0 +1,3 @@
+@echo off
+
+powershell "Import-Module %~dp0\psake.psm1 ; Invoke-Psake %~dp0\build.ps1 Run-Coverage ; exit $LASTEXITCODE"
\ No newline at end of file
diff --git a/build/psake.psm1 b/build/psake.psm1
new file mode 100644
index 0000000000..c0d8ded039
--- /dev/null
+++ b/build/psake.psm1
@@ -0,0 +1,847 @@
+# psake
+# Copyright (c) 2012 James Kovacs
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+#Requires -Version 2.0
+
+#-- Public Module Functions --#
+
+# .ExternalHelp psake.psm1-help.xml
+function Invoke-Task
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)] [string]$taskName
+ )
+
+ Assert $taskName ($msgs.error_invalid_task_name)
+
+ $taskKey = $taskName.ToLower()
+
+ if ($currentContext.aliases.Contains($taskKey)) {
+ $taskName = $currentContext.aliases.$taskKey.Name
+ $taskKey = $taskName.ToLower()
+ }
+
+ $currentContext = $psake.context.Peek()
+
+ Assert ($currentContext.tasks.Contains($taskKey)) ($msgs.error_task_name_does_not_exist -f $taskName)
+
+ if ($currentContext.executedTasks.Contains($taskKey)) { return }
+
+ Assert (!$currentContext.callStack.Contains($taskKey)) ($msgs.error_circular_reference -f $taskName)
+
+ $currentContext.callStack.Push($taskKey)
+
+ $task = $currentContext.tasks.$taskKey
+
+ $precondition_is_valid = & $task.Precondition
+
+ if (!$precondition_is_valid) {
+ WriteColoredOutput ($msgs.precondition_was_false -f $taskName) -foregroundcolor Cyan
+ } else {
+ if ($taskKey -ne 'default') {
+
+ if ($task.PreAction -or $task.PostAction) {
+ Assert ($task.Action -ne $null) ($msgs.error_missing_action_parameter -f $taskName)
+ }
+
+ if ($task.Action) {
+ try {
+ foreach($childTask in $task.DependsOn) {
+ Invoke-Task $childTask
+ }
+
+ $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
+ $currentContext.currentTaskName = $taskName
+
+ & $currentContext.taskSetupScriptBlock
+
+ if ($task.PreAction) {
+ & $task.PreAction
+ }
+
+ if ($currentContext.config.taskNameFormat -is [ScriptBlock]) {
+ & $currentContext.config.taskNameFormat $taskName
+ } else {
+ WriteColoredOutput ($currentContext.config.taskNameFormat -f $taskName) -foregroundcolor Cyan
+ }
+
+ foreach ($variable in $task.requiredVariables) {
+ Assert ((test-path "variable:$variable") -and ((get-variable $variable).Value -ne $null)) ($msgs.required_variable_not_set -f $variable, $taskName)
+ }
+
+ & $task.Action
+
+ if ($task.PostAction) {
+ & $task.PostAction
+ }
+
+ & $currentContext.taskTearDownScriptBlock
+ $task.Duration = $stopwatch.Elapsed
+ } catch {
+ if ($task.ContinueOnError) {
+ "-"*70
+ WriteColoredOutput ($msgs.continue_on_error -f $taskName,$_) -foregroundcolor Yellow
+ "-"*70
+ $task.Duration = $stopwatch.Elapsed
+ } else {
+ throw $_
+ }
+ }
+ } else {
+ # no action was specified but we still execute all the dependencies
+ foreach($childTask in $task.DependsOn) {
+ Invoke-Task $childTask
+ }
+ }
+ } else {
+ foreach($childTask in $task.DependsOn) {
+ Invoke-Task $childTask
+ }
+ }
+
+ Assert (& $task.Postcondition) ($msgs.postcondition_failed -f $taskName)
+ }
+
+ $poppedTaskKey = $currentContext.callStack.Pop()
+ Assert ($poppedTaskKey -eq $taskKey) ($msgs.error_corrupt_callstack -f $taskKey,$poppedTaskKey)
+
+ $currentContext.executedTasks.Push($taskKey)
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Exec
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
+ [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd),
+ [Parameter(Position=2,Mandatory=0)][int]$maxRetries = 0,
+ [Parameter(Position=3,Mandatory=0)][string]$retryTriggerErrorPattern = $null
+ )
+
+ $tryCount = 1
+
+ do {
+ try {
+ $global:lastexitcode = 0
+ & $cmd
+ if ($lastexitcode -ne 0) {
+ throw ("Exec: " + $errorMessage)
+ }
+ break
+ }
+ catch [Exception]
+ {
+ if ($tryCount -gt $maxRetries) {
+ throw $_
+ }
+
+ if ($retryTriggerErrorPattern -ne $null) {
+ $isMatch = [regex]::IsMatch($_.Exception.Message, $retryTriggerErrorPattern)
+
+ if ($isMatch -eq $false) {
+ throw $_
+ }
+ }
+
+ Write-Host "Try $tryCount failed, retrying again in 1 second..."
+
+ $tryCount++
+
+ [System.Threading.Thread]::Sleep([System.TimeSpan]::FromSeconds(1))
+ }
+ }
+ while ($true)
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Assert
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)]$conditionToCheck,
+ [Parameter(Position=1,Mandatory=1)]$failureMessage
+ )
+ if (!$conditionToCheck) {
+ throw ("Assert: " + $failureMessage)
+ }
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Task
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][string]$name = $null,
+ [Parameter(Position=1,Mandatory=0)][scriptblock]$action = $null,
+ [Parameter(Position=2,Mandatory=0)][scriptblock]$preaction = $null,
+ [Parameter(Position=3,Mandatory=0)][scriptblock]$postaction = $null,
+ [Parameter(Position=4,Mandatory=0)][scriptblock]$precondition = {$true},
+ [Parameter(Position=5,Mandatory=0)][scriptblock]$postcondition = {$true},
+ [Parameter(Position=6,Mandatory=0)][switch]$continueOnError = $false,
+ [Parameter(Position=7,Mandatory=0)][string[]]$depends = @(),
+ [Parameter(Position=8,Mandatory=0)][string[]]$requiredVariables = @(),
+ [Parameter(Position=9,Mandatory=0)][string]$description = $null,
+ [Parameter(Position=10,Mandatory=0)][string]$alias = $null,
+ [Parameter(Position=11,Mandatory=0)][string]$maxRetries = 0,
+ [Parameter(Position=12,Mandatory=0)][string]$retryTriggerErrorPattern = $null
+ )
+ if ($name -eq 'default') {
+ Assert (!$action) ($msgs.error_default_task_cannot_have_action)
+ }
+
+ $newTask = @{
+ Name = $name
+ DependsOn = $depends
+ PreAction = $preaction
+ Action = $action
+ PostAction = $postaction
+ Precondition = $precondition
+ Postcondition = $postcondition
+ ContinueOnError = $continueOnError
+ Description = $description
+ Duration = [System.TimeSpan]::Zero
+ RequiredVariables = $requiredVariables
+ Alias = $alias
+ MaxRetries = $maxRetries
+ RetryTriggerErrorPattern = $retryTriggerErrorPattern
+ }
+
+ $taskKey = $name.ToLower()
+
+ $currentContext = $psake.context.Peek()
+
+ Assert (!$currentContext.tasks.ContainsKey($taskKey)) ($msgs.error_duplicate_task_name -f $name)
+
+ $currentContext.tasks.$taskKey = $newTask
+
+ if($alias)
+ {
+ $aliasKey = $alias.ToLower()
+
+ Assert (!$currentContext.aliases.ContainsKey($aliasKey)) ($msgs.error_duplicate_alias_name -f $alias)
+
+ $currentContext.aliases.$aliasKey = $newTask
+ }
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Properties {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][scriptblock]$properties
+ )
+ $psake.context.Peek().properties += $properties
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Include {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][string]$fileNamePathToInclude
+ )
+ Assert (test-path $fileNamePathToInclude -pathType Leaf) ($msgs.error_invalid_include_path -f $fileNamePathToInclude)
+ $psake.context.Peek().includes.Enqueue((Resolve-Path $fileNamePathToInclude));
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function FormatTaskName {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)]$format
+ )
+ $psake.context.Peek().config.taskNameFormat = $format
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function TaskSetup {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][scriptblock]$setup
+ )
+ $psake.context.Peek().taskSetupScriptBlock = $setup
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function TaskTearDown {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][scriptblock]$teardown
+ )
+ $psake.context.Peek().taskTearDownScriptBlock = $teardown
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Framework {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][string]$framework
+ )
+ $psake.context.Peek().config.framework = $framework
+ ConfigureBuildEnvironment
+}
+
+# .ExternalHelp psake.psm1-help.xml
+function Invoke-psake {
+ [CmdletBinding()]
+ param(
+ [Parameter(Position = 0, Mandatory = 0)][string] $buildFile,
+ [Parameter(Position = 1, Mandatory = 0)][string[]] $taskList = @(),
+ [Parameter(Position = 2, Mandatory = 0)][string] $framework,
+ [Parameter(Position = 3, Mandatory = 0)][switch] $docs = $false,
+ [Parameter(Position = 4, Mandatory = 0)][hashtable] $parameters = @{},
+ [Parameter(Position = 5, Mandatory = 0)][hashtable] $properties = @{},
+ [Parameter(Position = 6, Mandatory = 0)][alias("init")][scriptblock] $initialization = {},
+ [Parameter(Position = 7, Mandatory = 0)][switch] $nologo = $false
+ )
+ try {
+ if (-not $nologo) {
+ "psake version {0}`nCopyright (c) 2010 James Kovacs`n" -f $psake.version
+ }
+
+ if (!$buildFile) {
+ $buildFile = $psake.config_default.buildFileName
+ }
+ elseif (!(test-path $buildFile -pathType Leaf) -and (test-path $psake.config_default.buildFileName -pathType Leaf)) {
+ # If the $config.buildFileName file exists and the given "buildfile" isn 't found assume that the given
+ # $buildFile is actually the target Tasks to execute in the $config.buildFileName script.
+ $taskList = $buildFile.Split(', ')
+ $buildFile = $psake.config_default.buildFileName
+ }
+
+ # Execute the build file to set up the tasks and defaults
+ Assert (test-path $buildFile -pathType Leaf) ($msgs.error_build_file_not_found -f $buildFile)
+
+ $psake.build_script_file = get-item $buildFile
+ $psake.build_script_dir = $psake.build_script_file.DirectoryName
+ $psake.build_success = $false
+
+ $psake.context.push(@{
+ "taskSetupScriptBlock" = {};
+ "taskTearDownScriptBlock" = {};
+ "executedTasks" = new-object System.Collections.Stack;
+ "callStack" = new-object System.Collections.Stack;
+ "originalEnvPath" = $env:path;
+ "originalDirectory" = get-location;
+ "originalErrorActionPreference" = $global:ErrorActionPreference;
+ "tasks" = @{};
+ "aliases" = @{};
+ "properties" = @();
+ "includes" = new-object System.Collections.Queue;
+ "config" = CreateConfigurationForNewContext $buildFile $framework
+ })
+
+ LoadConfiguration $psake.build_script_dir
+
+ $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
+
+ set-location $psake.build_script_dir
+
+ LoadModules
+
+ $frameworkOldValue = $framework
+ . $psake.build_script_file.FullName
+
+ $currentContext = $psake.context.Peek()
+
+ if ($framework -ne $frameworkOldValue) {
+ writecoloredoutput $msgs.warning_deprecated_framework_variable -foregroundcolor Yellow
+ $currentContext.config.framework = $framework
+ }
+
+ ConfigureBuildEnvironment
+
+ while ($currentContext.includes.Count -gt 0) {
+ $includeFilename = $currentContext.includes.Dequeue()
+ . $includeFilename
+ }
+
+ if ($docs) {
+ WriteDocumentation
+ CleanupEnvironment
+ return
+ }
+
+ foreach ($key in $parameters.keys) {
+ if (test-path "variable:\$key") {
+ set-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
+ } else {
+ new-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
+ }
+ }
+
+ # The initial dot (.) indicates that variables initialized/modified in the propertyBlock are available in the parent scope.
+ foreach ($propertyBlock in $currentContext.properties) {
+ . $propertyBlock
+ }
+
+ foreach ($key in $properties.keys) {
+ if (test-path "variable:\$key") {
+ set-item -path "variable:\$key" -value $properties.$key -WhatIf:$false -Confirm:$false | out-null
+ }
+ }
+
+ # Simple dot sourcing will not work. We have to force the script block into our
+ # module's scope in order to initialize variables properly.
+ . $MyInvocation.MyCommand.Module $initialization
+
+ # Execute the list of tasks or the default task
+ if ($taskList) {
+ foreach ($task in $taskList) {
+ invoke-task $task
+ }
+ } elseif ($currentContext.tasks.default) {
+ invoke-task default
+ } else {
+ throw $msgs.error_no_default_task
+ }
+
+ WriteColoredOutput ("`n" + $msgs.build_success + "`n") -foregroundcolor Green
+
+ WriteTaskTimeSummary $stopwatch.Elapsed
+
+ $psake.build_success = $true
+ } catch {
+ $currentConfig = GetCurrentConfigurationOrDefault
+ if ($currentConfig.verboseError) {
+ $error_message = "{0}: An Error Occurred. See Error Details Below: `n" -f (Get-Date)
+ $error_message += ("-" * 70) + "`n"
+ $error_message += "Error: {0}`n" -f (ResolveError $_ -Short)
+ $error_message += ("-" * 70) + "`n"
+ $error_message += ResolveError $_
+ $error_message += ("-" * 70) + "`n"
+ $error_message += "Script Variables" + "`n"
+ $error_message += ("-" * 70) + "`n"
+ $error_message += get-variable -scope script | format-table | out-string
+ } else {
+ # ($_ | Out-String) gets error messages with source information included.
+ $error_message = "Error: {0}: `n{1}" -f (Get-Date), (ResolveError $_ -Short)
+ }
+
+ $psake.build_success = $false
+
+ # if we are running in a nested scope (i.e. running a psake script from a psake script) then we need to re-throw the exception
+ # so that the parent script will fail otherwise the parent script will report a successful build
+ $inNestedScope = ($psake.context.count -gt 1)
+ if ( $inNestedScope ) {
+ throw $_
+ } else {
+ if (!$psake.run_by_psake_build_tester) {
+ WriteColoredOutput $error_message -foregroundcolor Red
+ }
+ }
+ } finally {
+ CleanupEnvironment
+ }
+}
+
+#-- Private Module Functions --#
+function WriteColoredOutput {
+ param(
+ [string] $message,
+ [System.ConsoleColor] $foregroundcolor
+ )
+
+ $currentConfig = GetCurrentConfigurationOrDefault
+ if ($currentConfig.coloredOutput -eq $true) {
+ if (($Host.UI -ne $null) -and ($Host.UI.RawUI -ne $null) -and ($Host.UI.RawUI.ForegroundColor -ne $null)) {
+ $previousColor = $Host.UI.RawUI.ForegroundColor
+ $Host.UI.RawUI.ForegroundColor = $foregroundcolor
+ }
+ }
+
+ $message
+
+ if ($previousColor -ne $null) {
+ $Host.UI.RawUI.ForegroundColor = $previousColor
+ }
+}
+
+function LoadModules {
+ $currentConfig = $psake.context.peek().config
+ if ($currentConfig.modules) {
+
+ $scope = $currentConfig.moduleScope
+
+ $global = [string]::Equals($scope, "global", [StringComparison]::CurrentCultureIgnoreCase)
+
+ $currentConfig.modules | foreach {
+ resolve-path $_ | foreach {
+ "Loading module: $_"
+ $module = import-module $_ -passthru -DisableNameChecking -global:$global
+ if (!$module) {
+ throw ($msgs.error_loading_module -f $_.Name)
+ }
+ }
+ }
+ ""
+ }
+}
+
+function LoadConfiguration {
+ param(
+ [string] $configdir = $PSScriptRoot
+ )
+
+ $psakeConfigFilePath = (join-path $configdir "psake-config.ps1")
+
+ if (test-path $psakeConfigFilePath -pathType Leaf) {
+ try {
+ $config = GetCurrentConfigurationOrDefault
+ . $psakeConfigFilePath
+ } catch {
+ throw "Error Loading Configuration from psake-config.ps1: " + $_
+ }
+ }
+}
+
+function GetCurrentConfigurationOrDefault() {
+ if ($psake.context.count -gt 0) {
+ return $psake.context.peek().config
+ } else {
+ return $psake.config_default
+ }
+}
+
+function CreateConfigurationForNewContext {
+ param(
+ [string] $buildFile,
+ [string] $framework
+ )
+
+ $previousConfig = GetCurrentConfigurationOrDefault
+
+ $config = new-object psobject -property @{
+ buildFileName = $previousConfig.buildFileName;
+ framework = $previousConfig.framework;
+ taskNameFormat = $previousConfig.taskNameFormat;
+ verboseError = $previousConfig.verboseError;
+ coloredOutput = $previousConfig.coloredOutput;
+ modules = $previousConfig.modules;
+ moduleScope = $previousConfig.moduleScope;
+ }
+
+ if ($framework) {
+ $config.framework = $framework;
+ }
+
+ if ($buildFile) {
+ $config.buildFileName = $buildFile;
+ }
+
+ return $config
+}
+
+function ConfigureBuildEnvironment {
+ $framework = $psake.context.peek().config.framework
+ if ($framework -cmatch '^((?:\d+\.\d+)(?:\.\d+){0,1})(x86|x64){0,1}$') {
+ $versionPart = $matches[1]
+ $bitnessPart = $matches[2]
+ } else {
+ throw ($msgs.error_invalid_framework -f $framework)
+ }
+ $versions = $null
+ $buildToolsVersions = $null
+ switch ($versionPart) {
+ '1.0' {
+ $versions = @('v1.0.3705')
+ }
+ '1.1' {
+ $versions = @('v1.1.4322')
+ }
+ '2.0' {
+ $versions = @('v2.0.50727')
+ }
+ '3.0' {
+ $versions = @('v2.0.50727')
+ }
+ '3.5' {
+ $versions = @('v3.5', 'v2.0.50727')
+ }
+ '4.0' {
+ $versions = @('v4.0.30319')
+ }
+ '4.5.1' {
+ $versions = @('v4.0.30319')
+ $buildToolsVersions = @('12.0')
+ }
+ default {
+ throw ($msgs.error_unknown_framework -f $versionPart, $framework)
+ }
+ }
+
+ $bitness = 'Framework'
+ if ($versionPart -ne '1.0' -and $versionPart -ne '1.1') {
+ switch ($bitnessPart) {
+ 'x86' {
+ $bitness = 'Framework'
+ $buildToolsKey = 'MSBuildToolsPath32'
+ }
+ 'x64' {
+ $bitness = 'Framework64'
+ $buildToolsKey = 'MSBuildToolsPath'
+ }
+ { [string]::IsNullOrEmpty($_) } {
+ $ptrSize = [System.IntPtr]::Size
+ switch ($ptrSize) {
+ 4 {
+ $bitness = 'Framework'
+ $buildToolsKey = 'MSBuildToolsPath32'
+ }
+ 8 {
+ $bitness = 'Framework64'
+ $buildToolsKey = 'MSBuildToolsPath'
+ }
+ default {
+ throw ($msgs.error_unknown_pointersize -f $ptrSize)
+ }
+ }
+ }
+ default {
+ throw ($msgs.error_unknown_bitnesspart -f $bitnessPart, $framework)
+ }
+ }
+ }
+ $frameworkDirs = @()
+ if ($buildToolsVersions -ne $null) {
+ $frameworkDirs = @($buildToolsVersions | foreach { (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$_" -Name $buildToolsKey).$buildToolsKey })
+ }
+ $frameworkDirs = $frameworkDirs + @($versions | foreach { "$env:windir\Microsoft.NET\$bitness\$_\" })
+
+ for ($i = 0; $i -lt $frameworkDirs.Count; $i++) {
+ $dir = $frameworkDirs[$i]
+ if ($dir -Match "\$\(Registry:HKEY_LOCAL_MACHINE(.*?)@(.*)\)") {
+ $key = "HKLM:" + $matches[1]
+ $name = $matches[2]
+ $dir = (Get-ItemProperty -Path $key -Name $name).$name
+ $frameworkDirs[$i] = $dir
+ }
+ }
+
+ $frameworkDirs | foreach { Assert (test-path $_ -pathType Container) ($msgs.error_no_framework_install_dir_found -f $_)}
+
+ $env:path = ($frameworkDirs -join ";") + ";$env:path"
+ # if any error occurs in a PS function then "stop" processing immediately
+ # this does not effect any external programs that return a non-zero exit code
+ $global:ErrorActionPreference = "Stop"
+}
+
+function CleanupEnvironment {
+ if ($psake.context.Count -gt 0) {
+ $currentContext = $psake.context.Peek()
+ $env:path = $currentContext.originalEnvPath
+ Set-Location $currentContext.originalDirectory
+ $global:ErrorActionPreference = $currentContext.originalErrorActionPreference
+ [void] $psake.context.Pop()
+ }
+}
+
+function SelectObjectWithDefault
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(ValueFromPipeline=$true)]
+ [PSObject]
+ $InputObject,
+ [string]
+ $Name,
+ $Value
+ )
+
+ process {
+ if ($_ -eq $null) { $Value }
+ elseif ($_ | Get-Member -Name $Name) {
+ $_.$Name
+ }
+ elseif (($_ -is [Hashtable]) -and ($_.Keys -contains $Name)) {
+ $_.$Name
+ }
+ else { $Value }
+ }
+}
+
+# borrowed from Jeffrey Snover http://blogs.msdn.com/powershell/archive/2006/12/07/resolve-error.aspx
+# modified to better handle SQL errors
+function ResolveError
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(ValueFromPipeline=$true)]
+ $ErrorRecord=$Error[0],
+ [Switch]
+ $Short
+ )
+
+ process {
+ if ($_ -eq $null) { $_ = $ErrorRecord }
+ $ex = $_.Exception
+
+ if (-not $Short) {
+ $error_message = "`nErrorRecord:{0}ErrorRecord.InvocationInfo:{1}Exception:`n{2}"
+ $formatted_errorRecord = $_ | format-list * -force | out-string
+ $formatted_invocationInfo = $_.InvocationInfo | format-list * -force | out-string
+ $formatted_exception = ''
+
+ $i = 0
+ while ($ex -ne $null) {
+ $i++
+ $formatted_exception += ("$i" * 70) + "`n" +
+ ($ex | format-list * -force | out-string) + "`n"
+ $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
+ }
+
+ return $error_message -f $formatted_errorRecord, $formatted_invocationInfo, $formatted_exception
+ }
+
+ $lastException = @()
+ while ($ex -ne $null) {
+ $lastMessage = $ex | SelectObjectWithDefault -Name 'Message' -Value ''
+ $lastException += ($lastMessage -replace "`n", '')
+ if ($ex -is [Data.SqlClient.SqlException]) {
+ $lastException += "(Line [$($ex.LineNumber)] " +
+ "Procedure [$($ex.Procedure)] Class [$($ex.Class)] " +
+ " Number [$($ex.Number)] State [$($ex.State)] )"
+ }
+ $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
+ }
+ $shortException = $lastException -join ' --> '
+
+ $header = $null
+ $current = $_
+ $header = (($_.InvocationInfo |
+ SelectObjectWithDefault -Name 'PositionMessage' -Value '') -replace "`n", ' '),
+ ($_ | SelectObjectWithDefault -Name 'Message' -Value ''),
+ ($_ | SelectObjectWithDefault -Name 'Exception' -Value '') |
+ ? { -not [String]::IsNullOrEmpty($_) } |
+ Select -First 1
+
+ $delimiter = ''
+ if ((-not [String]::IsNullOrEmpty($header)) -and
+ (-not [String]::IsNullOrEmpty($shortException)))
+ { $delimiter = ' [<<==>>] ' }
+
+ return "$($header)$($delimiter)Exception: $($shortException)"
+ }
+}
+
+function WriteDocumentation {
+ $currentContext = $psake.context.Peek()
+
+ if ($currentContext.tasks.default) {
+ $defaultTaskDependencies = $currentContext.tasks.default.DependsOn
+ } else {
+ $defaultTaskDependencies = @()
+ }
+
+ $currentContext.tasks.Keys | foreach-object {
+ if ($_ -eq "default") {
+ return
+ }
+
+ $task = $currentContext.tasks.$_
+ new-object PSObject -property @{
+ Name = $task.Name;
+ Alias = $task.Alias;
+ Description = $task.Description;
+ "Depends On" = $task.DependsOn -join ", "
+ Default = if ($defaultTaskDependencies -contains $task.Name) { $true }
+ }
+ } | sort 'Name' | format-table -autoSize -wrap -property Name,Alias,"Depends On",Default,Description
+}
+
+function WriteTaskTimeSummary($invokePsakeDuration) {
+ "-" * 70
+ "Build Time Report"
+ "-" * 70
+ $list = @()
+ $currentContext = $psake.context.Peek()
+ while ($currentContext.executedTasks.Count -gt 0) {
+ $taskKey = $currentContext.executedTasks.Pop()
+ $task = $currentContext.tasks.$taskKey
+ if ($taskKey -eq "default") {
+ continue
+ }
+ $list += new-object PSObject -property @{
+ Name = $task.Name;
+ Duration = $task.Duration
+ }
+ }
+ [Array]::Reverse($list)
+ $list += new-object PSObject -property @{
+ Name = "Total:";
+ Duration = $invokePsakeDuration
+ }
+ # using "out-string | where-object" to filter out the blank line that format-table prepends
+ $list | format-table -autoSize -property Name,Duration | out-string -stream | where-object { $_ }
+}
+
+DATA msgs {
+convertfrom-stringdata @'
+ error_invalid_task_name = Task name should not be null or empty string.
+ error_task_name_does_not_exist = Task {0} does not exist.
+ error_circular_reference = Circular reference found for task {0}.
+ error_missing_action_parameter = Action parameter must be specified when using PreAction or PostAction parameters for task {0}.
+ error_corrupt_callstack = Call stack was corrupt. Expected {0}, but got {1}.
+ error_invalid_framework = Invalid .NET Framework version, {0} specified.
+ error_unknown_framework = Unknown .NET Framework version, {0} specified in {1}.
+ error_unknown_pointersize = Unknown pointer size ({0}) returned from System.IntPtr.
+ error_unknown_bitnesspart = Unknown .NET Framework bitness, {0}, specified in {1}.
+ error_no_framework_install_dir_found = No .NET Framework installation directory found at {0}.
+ error_bad_command = Error executing command {0}.
+ error_default_task_cannot_have_action = 'default' task cannot specify an action.
+ error_duplicate_task_name = Task {0} has already been defined.
+ error_duplicate_alias_name = Alias {0} has already been defined.
+ error_invalid_include_path = Unable to include {0}. File not found.
+ error_build_file_not_found = Could not find the build file {0}.
+ error_no_default_task = 'default' task required.
+ error_loading_module = Error loading module {0}.
+ warning_deprecated_framework_variable = Warning: Using global variable $framework to set .NET framework version used is deprecated. Instead use Framework function or configuration file psake-config.ps1.
+ required_variable_not_set = Variable {0} must be set to run task {1}.
+ postcondition_failed = Postcondition failed for task {0}.
+ precondition_was_false = Precondition was false, not executing task {0}.
+ continue_on_error = Error in task {0}. {1}
+ build_success = Build Succeeded!
+'@
+}
+
+import-localizeddata -bindingvariable msgs -erroraction silentlycontinue
+
+$script:psake = @{}
+$psake.version = "4.3.2" # contains the current version of psake
+$psake.context = new-object system.collections.stack # holds onto the current state of all variables
+$psake.run_by_psake_build_tester = $false # indicates that build is being run by psake-BuildTester
+$psake.config_default = new-object psobject -property @{
+ buildFileName = "default.ps1";
+ framework = "4.0";
+ taskNameFormat = "Executing {0}";
+ verboseError = $false;
+ coloredOutput = $true;
+ modules = $null;
+ moduleScope = "";
+} # contains default configuration, can be overriden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script
+
+$psake.build_success = $false # indicates that the current build was successful
+$psake.build_script_file = $null # contains a System.IO.FileInfo for the current build script
+$psake.build_script_dir = "" # contains a string with fully-qualified path to current build script
+
+LoadConfiguration
+
+export-modulemember -function Invoke-psake, Invoke-Task, Task, Properties, Include, FormatTaskName, TaskSetup, TaskTearDown, Framework, Assert, Exec -variable psake
diff --git a/build/tools/NUnitHTMLReportGenerator.exe.REMOVED.git-id b/build/tools/NUnitHTMLReportGenerator.exe.REMOVED.git-id
new file mode 100644
index 0000000000..e34edfefe3
--- /dev/null
+++ b/build/tools/NUnitHTMLReportGenerator.exe.REMOVED.git-id
@@ -0,0 +1 @@
+75c3885b6db49741cd7c7efe3bda996c2fae5ae7
\ No newline at end of file
diff --git a/build/tools/NUnitHTMLReportGenerator.exe.config b/build/tools/NUnitHTMLReportGenerator.exe.config
new file mode 100644
index 0000000000..3143478cc7
--- /dev/null
+++ b/build/tools/NUnitHTMLReportGenerator.exe.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.nuget/packages.config b/src/.nuget/packages.config
new file mode 100644
index 0000000000..9cfde32e18
--- /dev/null
+++ b/src/.nuget/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/ImageProcessor/Properties/AssemblyInfo.cs b/src/ImageProcessor/Properties/AssemblyInfo.cs
index bbdf7129e4..66b52a80c6 100644
--- a/src/ImageProcessor/Properties/AssemblyInfo.cs
+++ b/src/ImageProcessor/Properties/AssemblyInfo.cs
@@ -41,4 +41,4 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("2.0.1.0")]
-[assembly: AssemblyFileVersion("2.0.1.0")]
\ No newline at end of file
+[assembly: AssemblyFileVersion("2.0.1.0")]
diff --git a/src/ImageProcessorConsole/Program.cs b/src/ImageProcessorConsole/Program.cs
index b0e7cb654c..5f5a94f7c0 100644
--- a/src/ImageProcessorConsole/Program.cs
+++ b/src/ImageProcessorConsole/Program.cs
@@ -56,6 +56,11 @@ namespace ImageProcessorConsole
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
+ Console.WriteLine("Processing: " + fileInfo.Name);
+
+ Stopwatch stopwatch = new Stopwatch();
+ stopwatch.Start();
+
// ImageProcessor
using (MemoryStream inStream = new MemoryStream(photoBytes))
{
@@ -67,7 +72,6 @@ namespace ImageProcessorConsole
//{
// ConvolutionType = ConvolutionType.Sobel
//};
-
// Load, resize, set the format and quality and save an image.
imageFactory.Load(inStream)
//.BackgroundColor(Color.White)
diff --git a/src/packages/repositories.config b/src/packages/repositories.config
index 3406fa91f7..bfef3f66b6 100644
--- a/src/packages/repositories.config
+++ b/src/packages/repositories.config
@@ -1,12 +1,6 @@
-
-
-
-
-
-
\ No newline at end of file