mirror of https://github.com/dotnet/tye.git
committed by
GitHub
9 changed files with 211 additions and 19 deletions
@ -0,0 +1,101 @@ |
|||
Param( |
|||
[Parameter(Mandatory=$true)][string] $SourcesDirectory, # Directory where source files live; if using a Localize directory it should live in here |
|||
[string] $LanguageSet = 'VS_Main_Languages', # Language set to be used in the LocProject.json |
|||
[switch] $UseCheckedInLocProjectJson, # When set, generates a LocProject.json and compares it to one that already exists in the repo; otherwise just generates one |
|||
[switch] $CreateNeutralXlfs # Creates neutral xlf files. Only set to false when running locally |
|||
) |
|||
|
|||
# Generates LocProject.json files for the OneLocBuild task. OneLocBuildTask is described here: |
|||
# https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task |
|||
|
|||
Set-StrictMode -Version 2.0 |
|||
$ErrorActionPreference = "Stop" |
|||
. $PSScriptRoot\tools.ps1 |
|||
|
|||
Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1') |
|||
|
|||
$exclusionsFilePath = "$SourcesDirectory\Localize\LocExclusions.json" |
|||
$exclusions = @{ Exclusions = @() } |
|||
if (Test-Path -Path $exclusionsFilePath) |
|||
{ |
|||
$exclusions = Get-Content "$exclusionsFilePath" | ConvertFrom-Json |
|||
} |
|||
|
|||
Push-Location "$SourcesDirectory" # push location for Resolve-Path -Relative to work |
|||
|
|||
# Template files |
|||
$jsonFiles = @() |
|||
$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\en\..+\.json" } # .NET templating pattern |
|||
$jsonFiles += Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern |
|||
|
|||
$xlfFiles = @() |
|||
|
|||
$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf" |
|||
$langXlfFiles = @() |
|||
if ($allXlfFiles) { |
|||
$null = $allXlfFiles[0].FullName -Match "\.([\w-]+)\.xlf" # matches '[langcode].xlf' |
|||
$firstLangCode = $Matches.1 |
|||
$langXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.$firstLangCode.xlf" |
|||
} |
|||
$langXlfFiles | ForEach-Object { |
|||
$null = $_.Name -Match "(.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf |
|||
|
|||
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).xlf" |
|||
$xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru |
|||
} |
|||
|
|||
$locFiles = $jsonFiles + $xlfFiles |
|||
|
|||
$locJson = @{ |
|||
Projects = @( |
|||
@{ |
|||
LanguageSet = $LanguageSet |
|||
LocItems = @( |
|||
$locFiles | ForEach-Object { |
|||
$outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")" |
|||
$continue = $true |
|||
foreach ($exclusion in $exclusions.Exclusions) { |
|||
if ($outputPath.Contains($exclusion)) |
|||
{ |
|||
$continue = $false |
|||
} |
|||
} |
|||
$sourceFile = ($_.FullName | Resolve-Path -Relative) |
|||
if (!$CreateNeutralXlfs -and $_.Extension -eq '.xlf') { |
|||
Remove-Item -Path $sourceFile |
|||
} |
|||
if ($continue) |
|||
{ |
|||
return @{ |
|||
SourceFile = $sourceFile |
|||
CopyOption = "LangIDOnName" |
|||
OutputPath = $outputPath |
|||
} |
|||
} |
|||
} |
|||
) |
|||
} |
|||
) |
|||
} |
|||
|
|||
$json = ConvertTo-Json $locJson -Depth 5 |
|||
Write-Host "LocProject.json generated:`n`n$json`n`n" |
|||
Pop-Location |
|||
|
|||
if (!$UseCheckedInLocProjectJson) { |
|||
New-Item "$SourcesDirectory\Localize\LocProject.json" -Force # Need this to make sure the Localize directory is created |
|||
Set-Content "$SourcesDirectory\Localize\LocProject.json" $json |
|||
} |
|||
else { |
|||
New-Item "$SourcesDirectory\Localize\LocProject-generated.json" -Force # Need this to make sure the Localize directory is created |
|||
Set-Content "$SourcesDirectory\Localize\LocProject-generated.json" $json |
|||
|
|||
if ((Get-FileHash "$SourcesDirectory\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\Localize\LocProject.json").Hash) { |
|||
Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them." |
|||
|
|||
exit 1 |
|||
} |
|||
else { |
|||
Write-Host "Generated LocProject.json and current LocProject.json are identical." |
|||
} |
|||
} |
|||
@ -0,0 +1,78 @@ |
|||
parameters: |
|||
# Optional: dependencies of the job |
|||
dependsOn: '' |
|||
|
|||
# Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool |
|||
pool: |
|||
vmImage: vs2017-win2016 |
|||
|
|||
CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex |
|||
GithubPat: $(BotAccount-dotnet-bot-repo-PAT) |
|||
|
|||
SourcesDirectory: $(Build.SourcesDirectory) |
|||
CreatePr: true |
|||
UseCheckedInLocProjectJson: false |
|||
LanguageSet: VS_Main_Languages |
|||
LclSource: lclFilesInRepo |
|||
LclPackageId: '' |
|||
RepoType: gitHub |
|||
|
|||
jobs: |
|||
- job: OneLocBuild |
|||
|
|||
dependsOn: ${{ parameters.dependsOn }} |
|||
|
|||
displayName: OneLocBuild |
|||
|
|||
pool: ${{ parameters.pool }} |
|||
|
|||
variables: |
|||
- group: OneLocBuildVariables # Contains the CeapexPat and GithubPat |
|||
- name: _GenerateLocProjectArguments |
|||
value: -SourcesDirectory ${{ parameters.SourcesDirectory }} |
|||
-LanguageSet "${{ parameters.LanguageSet }}" |
|||
-CreateNeutralXlfs |
|||
- ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}: |
|||
- name: _GenerateLocProjectArguments |
|||
value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson |
|||
|
|||
|
|||
steps: |
|||
- task: Powershell@2 |
|||
inputs: |
|||
filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1 |
|||
arguments: $(_GenerateLocProjectArguments) |
|||
displayName: Generate LocProject.json |
|||
|
|||
- task: OneLocBuild@2 |
|||
displayName: OneLocBuild |
|||
env: |
|||
SYSTEM_ACCESSTOKEN: $(System.AccessToken) |
|||
inputs: |
|||
locProj: Localize/LocProject.json |
|||
outDir: $(Build.ArtifactStagingDirectory) |
|||
lclSource: ${{ parameters.LclSource }} |
|||
lclPackageId: ${{ parameters.LclPackageId }} |
|||
isCreatePrSelected: ${{ parameters.CreatePr }} |
|||
packageSourceAuth: patAuth |
|||
patVariable: ${{ parameters.CeapexPat }} |
|||
${{ if eq(parameters.RepoType, 'gitHub') }}: |
|||
repoType: ${{ parameters.RepoType }} |
|||
gitHubPatVariable: "${{ parameters.GithubPat }}" |
|||
condition: always() |
|||
|
|||
- task: PublishBuildArtifacts@1 |
|||
displayName: Publish Localization Files |
|||
inputs: |
|||
PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc' |
|||
PublishLocation: Container |
|||
ArtifactName: Loc |
|||
condition: always() |
|||
|
|||
- task: PublishBuildArtifacts@1 |
|||
displayName: Publish LocProject.json |
|||
inputs: |
|||
PathtoPublish: '$(Build.SourcesDirectory)/Localize/' |
|||
PublishLocation: Container |
|||
ArtifactName: Loc |
|||
condition: always() |
|||
Loading…
Reference in new issue