2016-02-24 08:21:00 +08:00
# Use the .NET Core APIs to determine the current platform; if a runtime
# exception is thrown, we are on FullCLR, not .NET Core.
2016-02-22 09:23:43 +08:00
try {
$Runtime = [ System.Runtime.InteropServices.RuntimeInformation ]
$OSPlatform = [ System.Runtime.InteropServices.OSPlatform ]
2016-03-05 04:11:01 +08:00
$IsCore = $true
$IsLinux = $Runtime :: IsOSPlatform ( $OSPlatform :: Linux )
$IsOSX = $Runtime :: IsOSPlatform ( $OSPlatform :: OSX )
$IsWindows = $Runtime :: IsOSPlatform ( $OSPlatform :: Windows )
2016-04-09 06:13:50 +08:00
} catch {
# If these are already set, then they're read-only and we're done
try {
$IsCore = $false
$IsLinux = $false
$IsOSX = $false
$IsWindows = $true
}
catch { }
2016-02-22 09:23:43 +08:00
}
2016-02-22 08:21:04 +08:00
2016-04-02 13:01:05 +08:00
2016-04-02 05:41:13 +08:00
function Start-PSBuild {
2016-03-12 08:19:05 +08:00
[ CmdletBinding ( DefaultParameterSetName = 'CoreCLR' ) ]
2016-02-22 07:06:39 +08:00
param (
2016-02-24 08:21:00 +08:00
[ switch ] $Restore ,
2016-03-12 08:19:05 +08:00
2016-04-09 07:05:39 +08:00
[ Parameter ( ParameterSetName = 'CoreCLR' ) ]
[ switch ] $Publish ,
2016-03-04 07:54:52 +08:00
# These runtimes must match those in project.json
# We do not use ValidateScript since we want tab completion
[ ValidateSet ( " ubuntu.14.04-x64 " ,
" centos.7.1-x64 " ,
" win7-x64 " ,
2016-04-02 08:01:18 +08:00
" win81-x64 " ,
2016-03-04 07:54:52 +08:00
" win10-x64 " ,
" osx.10.10-x64 " ,
" osx.10.11-x64 " ) ]
2016-03-12 08:19:05 +08:00
[ Parameter ( ParameterSetName = 'CoreCLR' ) ]
[ string ] $Runtime ,
[ Parameter ( ParameterSetName = 'FullCLR' ) ]
[ switch ] $FullCLR ,
[ Parameter ( ParameterSetName = 'FullCLR' ) ]
2016-03-16 04:06:26 +08:00
[ string ] $cmakeGenerator = " Visual Studio 14 2015 " ,
2016-03-12 08:19:05 +08:00
[ Parameter ( ParameterSetName = 'FullCLR' ) ]
[ ValidateSet ( " Debug " ,
2016-04-02 05:41:13 +08:00
" Release " ) ]
[ string ] $msbuildConfiguration = " Release "
2016-02-24 08:21:00 +08:00
)
2016-02-22 07:06:39 +08:00
2016-04-02 03:14:09 +08:00
# simplify ParameterSetNames
2016-04-02 05:41:13 +08:00
if ( $PSCmdlet . ParameterSetName -eq 'FullCLR' ) {
2016-03-12 08:19:05 +08:00
$FullCLR = $true
}
# verify we have all tools in place to do the build
$precheck = precheck 'dotnet' " Build dependency 'dotnet' not found in PATH! See: https://dotnet.github.io/getting-started/ "
2016-04-02 05:41:13 +08:00
if ( $FullCLR ) {
2016-03-12 08:19:05 +08:00
# cmake is needed to build powershell.exe
$precheck = $precheck -and ( precheck 'cmake' 'cmake not found. You can install it from https://chocolatey.org/packages/cmake.portable' )
2016-04-02 05:41:13 +08:00
2016-03-12 08:19:05 +08:00
# msbuild is needed to build powershell.exe
2016-03-19 02:50:52 +08:00
# msbuild is part of .NET Framework, we can try to get it from well-known location.
2016-04-02 05:41:13 +08:00
if ( -not ( Get-Command -Name msbuild -ErrorAction Ignore ) ) {
2016-03-19 02:50:52 +08:00
$env:path + = " ; ${env:SystemRoot} \Microsoft.Net\Framework\v4.0.30319 "
}
$precheck = $precheck -and ( precheck 'msbuild' 'msbuild not found. Install Visual Studio 2015.' )
2016-04-02 05:42:40 +08:00
} elseif ( $IsLinux -Or $IsOSX ) {
$InstallCommand = if ( $IsLinux ) {
'apt-get'
} elseif ( $IsOSX ) {
'brew'
}
foreach ( $Dependency in 'cmake' , 'make' , 'g++' ) {
$precheck = $precheck -and ( precheck $Dependency " Build dependency ' $Dependency ' not found. Run ' $InstallCommand install $Dependency ' " )
}
}
2016-04-02 05:43:18 +08:00
if ( -Not $Runtime ) {
$Runtime = dotnet - -info | % {
if ( $_ -match " RID " ) {
$_ -split " \s+ " | Select-Object -Last 1
}
}
if ( -Not $Runtime ) {
Write-Warning " Could not determine Runtime Identifier, please update dotnet "
$precheck = $false
} else {
log " Runtime not specified, using $Runtime "
}
2016-02-22 07:06:39 +08:00
}
2016-04-02 05:41:13 +08:00
# Abort if any precheck failed
if ( -not $precheck ) {
return
}
2016-02-22 07:06:39 +08:00
2016-03-12 10:24:43 +08:00
# define key build variables
2016-04-02 05:41:13 +08:00
if ( $FullCLR ) {
2016-03-12 08:19:05 +08:00
$Top = " $PSScriptRoot \src\Microsoft.PowerShell.ConsoleHost "
2016-04-02 08:51:38 +08:00
$Framework = 'net451'
2016-04-02 05:41:13 +08:00
} else {
2016-04-09 01:59:41 +08:00
$Top = " $PSScriptRoot /src/Microsoft.PowerShell.CoreConsoleHost "
2016-04-02 08:51:38 +08:00
$Framework = 'netstandardapp1.5'
2016-03-12 08:19:05 +08:00
}
2016-04-02 08:51:38 +08:00
if ( $IsLinux -Or $IsOSX ) {
$Configuration = " Linux "
$Executable = " powershell "
} else {
$Configuration = " Debug "
$Executable = " powershell.exe "
}
$Arguments = @ ( )
2016-04-09 07:05:39 +08:00
if ( $Publish ) {
$Arguments + = " publish "
} else {
$Arguments + = " build "
}
2016-04-02 08:51:38 +08:00
$Arguments + = " --framework " , $Framework
$Arguments + = " --configuration " , $Configuration
$Arguments + = " --runtime " , $Runtime
2016-04-02 14:09:39 +08:00
2016-04-09 07:05:39 +08:00
# Build the Output path in script scope
$script:Output = [ IO.Path ] :: Combine ( $Top , " bin " , $Configuration , $Framework )
2016-04-02 14:09:39 +08:00
# FullCLR only builds a library, so there is no runtime component
2016-04-09 07:05:39 +08:00
if ( -Not $FullCLR ) {
$script:Output = [ IO.Path ] :: Combine ( $script:Output , $Runtime )
2016-04-02 14:09:39 +08:00
}
2016-04-09 07:05:39 +08:00
# Publish injects the publish directory
if ( $Publish ) {
$script:Output = [ IO.Path ] :: Combine ( $script:Output , " publish " )
}
$script:Output = [ IO.Path ] :: Combine ( $script:Output , $Executable )
2016-04-02 08:51:38 +08:00
Write-Verbose " script:Output is $script:Output "
2016-03-12 10:24:43 +08:00
# handle Restore
2016-02-22 07:06:39 +08:00
if ( $Restore -Or -Not ( Test-Path " $Top /project.lock.json " ) ) {
2016-03-12 10:24:43 +08:00
log " Run dotnet restore "
2016-03-26 05:58:09 +08:00
2016-04-02 09:14:55 +08:00
$RestoreArguments = @ ( " --verbosity " )
2016-03-26 05:58:09 +08:00
if ( $PSCmdlet . MyInvocation . BoundParameters [ " Verbose " ] . IsPresent ) {
2016-04-02 09:14:55 +08:00
$RestoreArguments + = " Info "
2016-04-02 05:41:13 +08:00
} else {
2016-04-02 09:14:55 +08:00
$RestoreArguments + = " Warning "
2016-04-02 05:41:13 +08:00
}
2016-03-26 05:58:09 +08:00
2016-04-02 09:14:55 +08:00
$RestoreArguments + = " $PSScriptRoot "
2016-03-26 05:58:09 +08:00
2016-04-02 09:14:55 +08:00
dotnet restore $RestoreArguments
2016-02-22 07:06:39 +08:00
}
2016-03-12 08:19:05 +08:00
# Build native components
2016-04-02 05:42:40 +08:00
if ( $IsLinux -Or $IsOSX ) {
$Ext = if ( $IsLinux ) {
" so "
} elseif ( $IsOSX ) {
" dylib "
}
2016-02-22 07:06:39 +08:00
2016-04-02 05:42:40 +08:00
$Native = " $PSScriptRoot /src/libpsl-native "
$Lib = " $Top /libpsl-native. $Ext "
log " Start building $Lib "
2016-02-25 03:50:56 +08:00
2016-04-02 05:42:40 +08:00
try {
Push-Location $Native
cmake -DCMAKE_BUILD_TYPE = Debug .
make -j
make test
} finally {
Pop-Location
2016-03-12 08:19:05 +08:00
}
2016-04-02 05:42:40 +08:00
if ( -Not ( Test-Path $Lib ) ) {
throw " Compilation of $Lib failed "
}
} elseif ( $FullCLR ) {
2016-03-12 10:24:43 +08:00
log " Start building native powershell.exe "
2016-02-22 07:06:39 +08:00
2016-04-02 05:41:13 +08:00
try {
2016-04-02 14:09:39 +08:00
Push-Location . \ src \ powershell-native
2016-02-22 07:06:39 +08:00
2016-04-02 05:41:13 +08:00
if ( $cmakeGenerator ) {
2016-04-02 14:09:39 +08:00
cmake -G $cmakeGenerator .
2016-04-02 05:41:13 +08:00
} else {
2016-04-02 14:09:39 +08:00
cmake .
2016-03-12 08:19:05 +08:00
}
2016-04-02 14:09:39 +08:00
2016-03-12 08:19:05 +08:00
msbuild powershell . vcxproj / p: Configuration = $msbuildConfiguration
2016-04-02 14:09:39 +08:00
2016-04-02 05:41:13 +08:00
} finally {
Pop-Location
2016-03-12 08:19:05 +08:00
}
}
2016-02-22 07:06:39 +08:00
2016-04-02 05:41:13 +08:00
try {
2016-04-02 03:14:09 +08:00
# Relative paths do not work well if cwd is not changed to project
2016-04-02 08:51:38 +08:00
log " Run ` dotnet build $Arguments ` from $pwd "
2016-04-02 03:14:09 +08:00
Push-Location $Top
2016-04-09 07:05:39 +08:00
dotnet $Arguments
2016-04-02 10:15:52 +08:00
log " PowerShell output: $script:Output "
2016-04-02 05:41:13 +08:00
} finally {
2016-04-02 03:14:09 +08:00
Pop-Location
2016-03-12 08:19:05 +08:00
}
2016-04-02 08:51:38 +08:00
}
2016-04-02 13:01:05 +08:00
2016-04-02 08:51:38 +08:00
function Get-PSOutput {
2016-04-02 13:01:37 +08:00
[ CmdletBinding ( ) ] param ( )
if ( -Not $Output ) {
throw '$script:Output is not defined, run Start-PSBuild'
}
$Output
2016-02-22 07:06:39 +08:00
}
2016-04-02 13:01:05 +08:00
2016-04-02 13:01:45 +08:00
function Start-PSPester {
[ CmdletBinding ( ) ] param (
[ string ] $Flags = '-EnableExit -OutputFile pester-tests.xml -OutputFormat NUnitXml' ,
[ string ] $Tests = " * " ,
[ ValidateScript ( { Test-Path -PathType Container $_ } ) ]
[ string ] $Directory = " $PSScriptRoot /test/powershell "
)
& ( Get-PSOutput ) -c " Invoke-Pester $Flags $Directory / $Tests "
if ( $LASTEXITCODE -ne 0 ) {
throw " $LASTEXITCODE Pester tests failed "
}
}
2016-04-02 11:45:32 +08:00
function Start-PSxUnit {
2016-04-02 13:01:05 +08:00
[ CmdletBinding ( ) ] param ( )
2016-04-02 11:45:32 +08:00
if ( $IsWindows ) {
throw " xUnit tests are only currently supported on Linux / OS X "
}
2016-04-02 13:01:37 +08:00
$Content = Split-Path -Parent ( Get-PSOutput )
2016-04-02 11:45:32 +08:00
$Arguments = " --configuration " , " Linux "
try {
Push-Location $PSScriptRoot / test / csharp
dotnet build $Arguments
Copy-Item -ErrorAction SilentlyContinue -Recurse -Path $Content / * -Include Modules , libpsl-native * -Destination " ./bin/Linux/netstandardapp1.5/ubuntu.14.04-x64 "
dotnet test $Arguments
if ( $LASTEXITCODE -ne 0 ) {
throw " $LASTEXITCODE xUnit tests failed "
}
} finally {
Pop-Location
}
}
2016-04-02 05:41:13 +08:00
function Start-PSPackage {
2016-02-24 08:21:00 +08:00
# PowerShell packages use Semantic Versioning http://semver.org/
#
# Ubuntu and OS X packages are supported.
2016-04-02 13:01:05 +08:00
[ CmdletBinding ( ) ] param (
2016-02-24 08:21:00 +08:00
[ string ] $Version ,
2016-02-27 10:51:13 +08:00
[ int ] $Iteration = 1 ,
[ ValidateSet ( " deb " , " osxpkg " , " rpm " ) ]
[ string ] $Type
2016-02-24 08:21:00 +08:00
)
2016-02-22 08:21:04 +08:00
2016-03-05 04:11:01 +08:00
if ( $IsWindows ) { throw " Building Windows packages is not yet supported! " }
2016-02-22 08:21:04 +08:00
if ( -Not ( Get-Command " fpm " -ErrorAction SilentlyContinue ) ) {
throw " Build dependency 'fpm' not found in PATH! See: https://github.com/jordansissel/fpm "
}
2016-02-24 08:21:00 +08:00
if ( -Not ( Test-Path " $PSScriptRoot /bin/powershell " ) ) {
2016-03-04 07:54:52 +08:00
throw " Please Start-PSBuild with the corresponding runtime for the package "
2016-02-24 08:21:00 +08:00
}
2016-02-22 08:21:04 +08:00
2016-02-24 08:21:00 +08:00
# Change permissions for packaging
chmod -R go = u " $PSScriptRoot /bin "
2016-02-22 08:21:04 +08:00
2016-02-24 08:21:00 +08:00
# Decide package output type
2016-02-27 10:51:13 +08:00
if ( -Not ( $Type ) ) {
$Type = if ( $IsLinux ) { " deb " } elseif ( $IsOSX ) { " osxpkg " }
Write-Warning " -Type was not specified, continuing with $Type "
}
2016-02-22 08:21:04 +08:00
2016-02-24 08:21:00 +08:00
# Use Git tag if not given a version
if ( -Not ( $Version ) ) {
$Version = ( git - -git -dir = " $PSScriptRoot /.git " describe ) -Replace '^v'
}
2016-02-27 10:51:13 +08:00
$libunwind = switch ( $Type ) {
" deb " { " libunwind8 " }
" rpm " { " libunwind " }
}
$libicu = switch ( $Type ) {
" deb " { " libicu52 " }
" rpm " { " libicu " }
}
2016-02-24 08:21:00 +08:00
# Build package
2016-02-22 08:21:04 +08:00
fpm - -force - -verbose `
- -name " powershell " `
- -version $Version `
- -iteration $Iteration `
- -maintainer " Andrew Schwartzmeyer <andschwa@microsoft.com> " `
- -vendor " Microsoft <mageng@microsoft.com> " `
- -url " https://github.com/PowerShell/PowerShell " `
- -license " Unlicensed " `
- -description " Open PowerShell on .NET Core\nPowerShell is an open-source, cross-platform, scripting language and rich object shell. Built upon .NET Core, it is also a C# REPL.\n " `
- -category " shells " `
2016-02-27 10:51:13 +08:00
- -depends $libunwind `
- -depends $libicu `
2016-02-22 08:21:04 +08:00
- -deb -build -depends " dotnet " `
- -deb -build -depends " cmake " `
- -deb -build -depends " g++ " `
2016-02-27 10:51:13 +08:00
-t $Type `
2016-02-22 08:21:04 +08:00
-s dir `
2016-02-24 08:21:00 +08:00
" $PSScriptRoot /bin/=/usr/local/share/powershell/ " `
" $PSScriptRoot /package/powershell=/usr/local/bin "
2016-02-22 08:21:04 +08:00
}
2016-04-02 13:01:05 +08:00
function Start-DevPSGitHub {
2016-02-04 02:53:43 +08:00
param (
[ switch ] $ZapDisable ,
[ string[] ] $ArgumentList = '' ,
[ switch ] $LoadProfile ,
2016-04-05 09:58:53 +08:00
[ string ] $binDir = " $PSScriptRoot \src\Microsoft.PowerShell.ConsoleHost\bin\Debug\net451 " ,
2016-02-04 09:25:51 +08:00
[ switch ] $NoNewWindow
2016-02-04 02:53:43 +08:00
)
2016-04-02 13:01:05 +08:00
try {
if ( $LoadProfile -eq $false ) {
2016-02-04 09:25:51 +08:00
$ArgumentList = @ ( '-noprofile' ) + $ArgumentList
2016-02-04 02:53:43 +08:00
}
$env:DEVPATH = $binDir
2016-04-02 13:01:05 +08:00
if ( $ZapDisable ) {
2016-02-22 07:06:39 +08:00
$env:COMPLUS_ZapDisable = 1
2016-02-04 02:53:43 +08:00
}
2016-04-02 13:01:05 +08:00
if ( -Not ( Test-Path $binDir \ powershell . exe . config ) ) {
2016-02-04 02:53:43 +08:00
$configContents = @"
2016-02-22 07:06:39 +08:00
< ? xml version = " 1.0 " encoding = " utf-8 " ? >
< configuration >
2016-04-02 13:01:05 +08:00
< runtime >
< developmentMode developerInstallation = " true " / >
< / runtime >
2016-02-04 02:53:43 +08:00
< / configuration >
" @
$configContents | Out-File -Encoding Ascii $binDir \ powershell . exe . config
}
2016-02-22 07:06:39 +08:00
# splatting for the win
2016-02-04 09:25:51 +08:00
$startProcessArgs = @ {
FilePath = " $binDir \powershell.exe "
ArgumentList = " $ArgumentList "
2016-02-22 07:06:39 +08:00
}
2016-02-05 05:19:24 +08:00
if ( $NoNewWindow ) {
$startProcessArgs . NoNewWindow = $true
$startProcessArgs . Wait = $true
}
2016-02-22 07:06:39 +08:00
2016-02-04 09:25:51 +08:00
Start-Process @startProcessArgs
2016-04-02 13:01:05 +08:00
} finally {
2016-02-04 02:53:43 +08:00
ri env : DEVPATH
2016-04-02 13:01:05 +08:00
if ( $ZapDisable ) {
2016-02-04 02:53:43 +08:00
ri env : COMPLUS_ZapDisable
}
}
2016-02-21 06:35:46 +08:00
}
2016-03-23 07:00:20 +08:00
<#
. EXAMPLE Copy-SubmoduleFiles # copy files FROM submodule TO src/<project> folders
. EXAMPLE Copy-SubmoduleFiles -ToSubmodule # copy files FROM src/<project> folders TO submodule
#>
function Copy-SubmoduleFiles {
2016-04-02 05:41:13 +08:00
2016-03-23 07:00:20 +08:00
[ CmdletBinding ( ) ]
param (
2016-03-24 07:57:59 +08:00
[ string ] $mappingFilePath = " $PSScriptRoot /mapping.json " ,
2016-03-23 07:00:20 +08:00
[ switch ] $ToSubmodule
)
2016-04-02 05:41:13 +08:00
2016-04-02 13:01:05 +08:00
if ( -not ( Test-Path $mappingFilePath ) ) {
2016-03-23 07:00:20 +08:00
throw " Mapping file not found in $mappingFilePath "
}
$m = cat -Raw $mappingFilePath | ConvertFrom-Json | Convert-PSObjectToHashtable
# mapping.json assumes the root folder
Push-Location $PSScriptRoot
2016-04-02 13:01:05 +08:00
try {
2016-03-23 07:00:20 +08:00
$m . GetEnumerator ( ) | % {
2016-04-02 13:01:05 +08:00
if ( $ToSubmodule ) {
2016-03-23 07:00:20 +08:00
cp $_ . Value $_ . Key -Verbose: $Verbose
2016-04-02 13:01:05 +08:00
} else {
2016-03-23 07:00:20 +08:00
mkdir ( Split-Path $_ . Value ) -ErrorAction SilentlyContinue > $null
2016-04-02 05:41:13 +08:00
cp $_ . Key $_ . Value -Verbose: $Verbose
2016-03-23 07:00:20 +08:00
}
}
2016-04-02 13:01:05 +08:00
} finally {
2016-03-23 07:00:20 +08:00
Pop-Location
}
}
2016-04-02 13:01:05 +08:00
2016-03-23 07:00:20 +08:00
<#
2016-04-02 13:01:05 +08:00
. EXAMPLE Create-MappingFile # create mapping.json in the root folder from project.json files
2016-03-23 07:00:20 +08:00
#>
2016-04-02 13:01:05 +08:00
function New-MappingFile {
2016-03-23 07:00:20 +08:00
param (
2016-03-30 05:17:19 +08:00
[ string ] $mappingFilePath = " $PSScriptRoot /mapping.json " ,
[ switch ] $IgnoreCompileFiles ,
2016-03-31 05:13:36 +08:00
[ switch ] $Ignoreresource
2016-03-23 07:00:20 +08:00
)
2016-04-02 13:01:05 +08:00
function Get-MappingPath([string]$project , [ string ] $path ) {
if ( $project -match 'TypeCatalogGen' ) {
2016-03-23 07:00:20 +08:00
return Split-Path $path -Leaf
}
2016-04-02 05:41:13 +08:00
2016-04-02 13:01:05 +08:00
if ( $project -match 'Microsoft.Management.Infrastructure' ) {
2016-03-23 07:00:20 +08:00
return Split-Path $path -Leaf
}
return ( $path -replace '../monad/monad/src/' , '' )
}
$mapping = [ ordered ] @ { }
# assumes the root folder
Push-Location $PSScriptRoot
2016-04-02 13:01:05 +08:00
try {
2016-03-23 07:00:20 +08:00
$projects = ls . \ src \ -Recurse -Depth 2 -Filter 'project.json'
$projects | % {
$project = Split-Path $_ . FullName
$json = cat -Raw -Path $_ . FullName | ConvertFrom-Json
2016-03-30 05:17:19 +08:00
if ( -not $IgnoreCompileFiles ) {
$json . compileFiles | % {
if ( $_ ) {
2016-04-02 13:01:05 +08:00
if ( -not $_ . EndsWith ( 'AssemblyInfo.cs' ) ) {
2016-03-30 05:17:19 +08:00
$fullPath = Join-Path $project ( Get-MappingPath -project $project -path $_ )
$mapping [ $_ . Replace ( '../' , 'src/' ) ] = ( $fullPath . Replace ( " $( $pwd . Path ) \ " , '' ) ) . Replace ( '\' , '/' )
}
}
}
}
2016-03-31 05:13:36 +08:00
if ( ( -not $Ignoreresource ) -and ( $json . resource ) ) {
2016-03-30 05:17:19 +08:00
$json . resource | % {
if ( $_ ) {
ls $_ . Replace ( '../' , 'src/' ) | % {
2016-03-31 05:13:36 +08:00
$fullPath = Join-Path $project ( Join-Path 'resources' $_ . Name )
2016-03-30 05:17:19 +08:00
$mapping [ $_ . FullName . Replace ( " $( $pwd . Path ) \ " , '' ) . Replace ( '\' , '/' ) ] = ( $fullPath . Replace ( " $( $pwd . Path ) \ " , '' ) ) . Replace ( '\' , '/' )
}
2016-03-23 07:00:20 +08:00
}
}
}
}
2016-04-02 13:01:05 +08:00
} finally {
2016-03-23 07:00:20 +08:00
Pop-Location
}
Set-Content -Value ( $mapping | ConvertTo-Json ) -Path $mappingFilePath -Encoding Ascii
}
2016-03-24 07:57:59 +08:00
<#
2016-04-02 05:41:13 +08:00
. EXAMPLE Send-GitDiffToSd -diffArg1 45555786714d656bd31cbce67dbccb89c433b9cb -diffArg2 45555786714d656bd31cbce67dbccb89c433b9cb ~ 1 -pathToAdmin d: \ e \ ps_dev \ admin
2016-03-24 07:57:59 +08:00
Apply a signle commit to admin folder
#>
2016-04-02 13:01:05 +08:00
function Send-GitDiffToSd {
2016-03-24 07:57:59 +08:00
param (
[ Parameter ( Mandatory ) ]
[ string ] $diffArg1 ,
[ Parameter ( Mandatory ) ]
[ string ] $diffArg2 ,
[ Parameter ( Mandatory ) ]
[ string ] $pathToAdmin ,
[ string ] $mappingFilePath = " $PSScriptRoot /mapping.json " ,
[ switch ] $WhatIf
)
$patchPath = Join-Path ( get-command git ) . Source . . \ . . \ bin \ patch
$m = cat -Raw $mappingFilePath | ConvertFrom-Json | Convert-PSObjectToHashtable
$affectedFiles = git diff - -name -only $diffArg1 $diffArg2
$rev = Get-InvertedOrderedMap $m
foreach ( $file in $affectedFiles ) {
2016-04-02 13:01:05 +08:00
if ( $rev . Contains ) {
2016-03-24 07:57:59 +08:00
$sdFilePath = Join-Path $pathToAdmin $rev [ $file ] . Substring ( 'src/monad/' . Length )
$diff = git diff $diffArg1 $diffArg2 - - $file
2016-04-02 13:01:05 +08:00
if ( $diff ) {
2016-03-24 07:57:59 +08:00
Write-Host -Foreground Green " Apply patch to $sdFilePath "
Set-Content -Value $diff -Path $env:TEMP \ diff -Encoding Ascii
2016-04-02 13:01:05 +08:00
if ( $WhatIf ) {
2016-03-24 07:57:59 +08:00
Write-Host -Foreground Green " Patch content "
cat $env:TEMP \ diff
2016-04-02 13:01:05 +08:00
} else {
2016-04-02 05:41:13 +08:00
& $patchPath - -binary -p1 $sdFilePath $env:TEMP \ diff
2016-03-24 07:57:59 +08:00
}
2016-04-02 13:01:05 +08:00
} else {
2016-03-24 07:57:59 +08:00
Write-Host -Foreground Green " No changes in $file "
}
2016-04-02 13:01:05 +08:00
} else {
2016-03-24 07:57:59 +08:00
Write-Host -Foreground Green " Ignore changes in $file , because there is no mapping for it "
}
2016-04-02 05:41:13 +08:00
}
2016-03-24 07:57:59 +08:00
}
2016-04-02 13:01:05 +08:00
2016-04-05 05:20:34 +08:00
function Start-ResGen
{
@ ( " Microsoft.PowerShell.Commands.Management " ,
" Microsoft.PowerShell.Commands.Utility " ,
" Microsoft.PowerShell.ConsoleHost " ,
" Microsoft.PowerShell.CoreCLR.Eventing " ,
" Microsoft.PowerShell.Security " ,
" System.Management.Automation " ) | % {
$module = $_
ls " $PSScriptRoot /src/ $module /resources " | % {
$className = $_ . Name . Replace ( '.resx' , '' )
$xml = [ xml ] ( cat -raw $_ . FullName )
$genSource = Get-StronglyTypeCsFileForResx -xml $xml -ModuleName $module -ClassName $className
$outPath = " $PSScriptRoot /src/windows-build/gen/ $module / $className .cs "
log " ResGen for $outPath "
2016-04-06 04:21:31 +08:00
mkdir -ErrorAction SilentlyContinue ( Split-Path $outPath ) > $null
Set-Content -Encoding Ascii -Path $outPath -Value $genSource
2016-04-05 05:20:34 +08:00
}
}
}
2016-04-02 13:01:05 +08:00
function script: log([string]$message ) {
Write-Host -Foreground Green $message
}
function script: precheck([string]$command , [ string ] $missedMessage ) {
$c = Get-Command $command -ErrorAction SilentlyContinue
if ( -not $c ) {
Write-Warning $missedMessage
return $false
} else {
return $true
}
}
function script: Get-InvertedOrderedMap {
param (
$h
)
$res = [ ordered ] @ { }
foreach ( $q in $h . GetEnumerator ( ) ) {
if ( $res . Contains ( $q . Value ) ) {
throw " Cannot invert hashtable: duplicated key $( $q . Value ) "
}
$res [ $q . Value ] = $q . Key
}
return $res
}
## this function is from Dave Wyatt's answer on
## http://stackoverflow.com/questions/22002748/hashtables-from-convertfrom-json-have-different-type-from-powershells-built-in-h
function script: Convert-PSObjectToHashtable {
param (
[ Parameter ( ValueFromPipeline ) ]
$InputObject
)
process {
if ( $null -eq $InputObject ) { return $null }
if ( $InputObject -is [ System.Collections.IEnumerable ] -and $InputObject -isnot [ string ] ) {
$collection = @ (
foreach ( $object in $InputObject ) { Convert-PSObjectToHashtable $object }
)
Write-Output -NoEnumerate $collection
} elseif ( $InputObject -is [ psobject ] ) {
$hash = @ { }
foreach ( $property in $InputObject . PSObject . Properties )
{
$hash [ $property . Name ] = Convert-PSObjectToHashtable $property . Value
}
$hash
} else {
$InputObject
}
}
}
2016-04-05 05:20:34 +08:00
function script: Get-StronglyTypeCsFileForResx
{
param ( $xml , $ModuleName , $ClassName )
$body = @ '
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ / < auto-generated >
/ / This code was generated by a Start-ResGen funciton from PowerShellGitHubDev . psm1 .
/ / To add or remove a member , edit your . ResX file then rerun Start-ResGen .
/ /
/ / Changes to this file may cause incorrect behavior and will be lost if
/ / the code is regenerated .
/ / < / auto-generated >
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
using System ;
using System . Reflection ;
/ / / < summary >
/ / / A strongly-typed resource class , for looking up localized strings , etc .
/ / / < / summary >
[ global :: System . CodeDom . Compiler . GeneratedCodeAttribute ( " System.Resources.Tools.StronglyTypedResourceBuilder " , " 4.0.0.0 " ) ]
[ global :: System . Diagnostics . DebuggerNonUserCodeAttribute ( ) ]
[ global :: System . Runtime . CompilerServices . CompilerGeneratedAttribute ( ) ]
internal class { 0 } { {
private static global :: System . Resources . ResourceManager resourceMan ;
private static global :: System . Globalization . CultureInfo resourceCulture ;
[ global :: System . Diagnostics . CodeAnalysis . SuppressMessageAttribute ( " Microsoft.Performance " , " CA1811:AvoidUncalledPrivateCode " ) ]
internal { 0 } ( ) { {
} }
/ / / < summary >
/ / / Returns the cached ResourceManager instance used by this class .
/ / / < / summary >
[ global :: System . ComponentModel . EditorBrowsableAttribute ( global :: System . ComponentModel . EditorBrowsableState . Advanced ) ]
internal static global :: System . Resources . ResourceManager ResourceManager { {
get { {
if ( object . ReferenceEquals ( resourceMan , null ) ) { {
global :: System . Resources . ResourceManager temp = new global :: System . Resources . ResourceManager ( " {1}.resources.{0} " , typeof ( { 0 } ) . GetTypeInfo ( ) . Assembly ) ;
resourceMan = temp ;
} }
return resourceMan ;
} }
} }
/ / / < summary >
/ / / Overrides the current thread ' s CurrentUICulture property for all
/ / / resource lookups using this strongly typed resource class .
/ / / < / summary >
[ global :: System . ComponentModel . EditorBrowsableAttribute ( global :: System . ComponentModel . EditorBrowsableState . Advanced ) ]
internal static global :: System . Globalization . CultureInfo Culture { {
get { {
return resourceCulture ;
} }
set { {
resourceCulture = value ;
} }
} }
{ 2 }
} }
' @
$entry = @ '
/ / / < summary >
/ / / Looks up a localized string similar to { 1 }
/ / / < / summary >
internal static string { 0 } { {
get { {
return ResourceManager . GetString ( " {0} " , resourceCulture ) ;
} }
} }
' @
$entries = $xml . root . data | % {
if ( $_ ) {
$val = $_ . value . Replace ( " `n " , " `n /// " )
$name = $_ . name . Replace ( ' ' , '_' )
$entry -f $name , $val
}
} | Out-String
$body -f $ClassName , $ModuleName , $entries
}