Skip to content

Commit a2143ed

Browse files
Add regenerate option to generate scripts (#1517)
* Add regenerate option to generate scripts * Embed logic within functions * Tweaks to avoid BOM issues on various pwsh versions
1 parent 79d1958 commit a2143ed

3 files changed

Lines changed: 93 additions & 7 deletions

File tree

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,10 @@ See the workflow documented in the servicing branch readmes for additional requi
205205
#### Regenerating all Reference Packages
206206
207207
As bugs are fixed or enhancements are made to the generate tooling, it may be desirable or necessary to
208-
regenerate the existing packages. The following commands can be used to generate all of the reference packages.
208+
regenerate the existing packages. The following command will regenerate all of the reference packages.
209209
210210
``` bash
211-
find src/referencePackages/src -mindepth 2 -maxdepth 2 -type d | awk -F'/' '{print $(NF-1)","$NF}' > packages.csv
212-
./generate.sh -x -c packages.csv
211+
./generate.sh -a
213212
```
214213
215214
### Targeting

eng/generate.ps1

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ Param(
33
[string[]][Alias('p')]$package,
44
[string][Alias('c')]$csv,
55
[string][Alias('d')]$destination,
6-
[ValidateSet('ref','text')][string][Alias('t')]$type,
6+
[ValidateSet('ref','text')][string][Alias('t')]$type = 'ref',
77
[switch][Alias('x')]$excludeDependencies,
8+
[switch][Alias('a')]$regenerateAll,
89
[string][Alias('f')]$feeds,
910
[switch][Alias('h')]$help,
1011
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
@@ -33,10 +34,41 @@ function Get-Help() {
3334
Write-Host " -d|-destination A path to the root of the repo to copy source into."
3435
Write-Host " -t|-type Type of the package to generate. Accepted values: ref (default) | text."
3536
Write-Host " -x|-excludeDependencies Determines if package dependencies should be excluded. Default is false."
37+
Write-Host " -a|-regenerateAll Regenerate all packages of the specified type."
3638
Write-Host " -f|-feeds A semicolon-separated list of additional NuGet feeds to use during restore."
3739
Write-Host " -h|-help Print help and exit."
3840
}
3941

42+
function Initialize-PackageRegeneration {
43+
Write-Host "Discovering packages for regeneration..."
44+
45+
$script:tempCsv = [System.IO.Path]::GetTempFileName()
46+
$packages = @()
47+
48+
if ($type -eq "ref") {
49+
$packagesDir = Join-Path $PSScriptRoot "..\src\referencePackages\src"
50+
} elseif ($type -eq "text") {
51+
$packagesDir = Join-Path $PSScriptRoot "..\src\textOnlyPackages\src"
52+
}
53+
54+
if (Test-Path $packagesDir) {
55+
$packages = Get-ChildItem $packagesDir -Directory | ForEach-Object {
56+
$pkg = $_.Name
57+
Get-ChildItem $_.FullName -Directory | ForEach-Object { "$pkg,$($_.Name)" }
58+
}
59+
}
60+
61+
[System.IO.File]::WriteAllLines($script:tempCsv, $packages)
62+
if ($packages.Count -eq 0) {
63+
Write-Error "No packages found to regenerate"
64+
exit -1
65+
}
66+
67+
Write-Host "Found $($packages.Count) package(s) to regenerate"
68+
69+
$script:arguments += " /p:PackageCSV=`"$script:tempCsv`" /p:ExcludePackageDependencies=true"
70+
}
71+
4072
if ($help -or $($PSBoundParameters.Count) -eq 0) {
4173
Get-Help
4274
exit 0
@@ -62,10 +94,25 @@ foreach ($argument in $PSBoundParameters.Keys)
6294
"destination" { $arguments += " /p:PackagesSrcDirectory=`"$($PSBoundParameters[$argument])`"" }
6395
"type" { $arguments += " /p:PackageType=$($PSBoundParameters[$argument])" }
6496
"excludeDependencies" { $arguments += " /p:ExcludePackageDependencies=true" }
97+
"regenerateAll" { } # Handled separately below
6598
"feeds" { $arguments += " /p:RestoreAdditionalProjectSources=`"$($PSBoundParameters[$argument])`"" }
6699
default { $arguments += " $($PSBoundParameters[$argument])" }
67100
}
68101
}
69102

70-
Invoke-Expression "& `"$PSScriptRoot\common\build.ps1`" -restore -build -warnaserror 0 /p:GeneratePackageSource=true $arguments"
103+
$tempCsv = $null
104+
105+
try {
106+
if ($regenerateAll) {
107+
Initialize-PackageRegeneration
108+
}
109+
110+
Invoke-Expression "& `"$PSScriptRoot\common\build.ps1`" -restore -build -warnaserror 0 /p:GeneratePackageSource=true $arguments"
111+
}
112+
finally {
113+
if ($tempCsv) {
114+
Remove-Item $tempCsv -ErrorAction SilentlyContinue
115+
}
116+
}
117+
71118
exit 0

generate.sh

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,49 @@ usage() {
3333
echo " -d|--destination A path to the root of the repo to copy source into."
3434
echo " -t|--type Type of the package to generate. Accepted values: ref (default) | text."
3535
echo " -x|--excludeDependencies Determines if package dependencies should be excluded. Default is false."
36+
echo " -a|--regenerate-all Regenerate all packages of the specified type."
3637
echo " -f|--feeds A semicolon-separated list of additional NuGet feeds to use during restore."
3738
echo " -h|--help Print help and exit."
3839
}
3940

41+
setup_package_regeneration() {
42+
echo "Discovering packages for regeneration..."
43+
44+
tempCsv=$(mktemp "${TMPDIR:-/tmp}/packages.XXXXXX.csv")
45+
46+
trap "rm -f '$tempCsv'" EXIT INT TERM
47+
48+
if [ "$type" = "ref" ]; then
49+
packagesDir="$scriptroot/src/referencePackages/src"
50+
elif [ "$type" = "text" ]; then
51+
packagesDir="$scriptroot/src/textOnlyPackages/src"
52+
fi
53+
54+
if [ -d "$packagesDir" ]; then
55+
find "$packagesDir" -mindepth 2 -maxdepth 2 -type d | \
56+
awk -F'/' '{print $(NF-1)","$NF}' >> "$tempCsv"
57+
fi
58+
59+
packageCount=$(wc -l < "$tempCsv")
60+
if [ "$packageCount" -eq 0 ]; then
61+
echo -e "${RED}ERROR: No packages found to regenerate${NC}"
62+
exit 1
63+
fi
64+
65+
echo "Found $packageCount package(s) to regenerate"
66+
67+
arguments="$arguments /p:PackageCSV=\"$tempCsv\" /p:ExcludePackageDependencies=true"
68+
}
69+
4070
if [[ $# -le 0 ]]; then
41-
usage
42-
exit 0
71+
usage
72+
exit 0
4373
fi
4474

4575
arguments=''
4676
extraArgs=''
77+
regenerateAll=false
78+
type='ref'
4779

4880
while [[ $# > 0 ]]; do
4981
opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")"
@@ -97,6 +129,10 @@ while [[ $# > 0 ]]; do
97129
arguments="$arguments /p:ExcludePackageDependencies=true"
98130
shift 1
99131
;;
132+
-a|-regenerate-all)
133+
regenerateAll=true
134+
shift 1
135+
;;
100136
-f|-feeds)
101137
if [ -z ${2+x} ]; then
102138
echo -e "${RED}ERROR: No feed supplied.${NC}"
@@ -117,5 +153,9 @@ while [[ $# > 0 ]]; do
117153
esac
118154
done
119155

156+
if [ "$regenerateAll" = true ]; then
157+
setup_package_regeneration
158+
fi
159+
120160
# Build the projects to generate text only or reference package source
121161
"$scriptroot/eng/common/build.sh" --restore --build --warnaserror false /p:GeneratePackageSource=true $arguments $extraArgs

0 commit comments

Comments
 (0)