Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync eng/common directory with azure-sdk-tools for PR 2322 #3133

Merged
merged 36 commits into from
Nov 23, 2021
Merged
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
0a2f5c2
Install and Run code owner tools in get-codeowner.ps1
sima-zhu Nov 19, 2021
eab6544
return command when exists
sima-zhu Nov 19, 2021
e76b536
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 19, 2021
0aaf348
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 19, 2021
5686e12
Address comments
sima-zhu Nov 19, 2021
6eca14a
Added test to script
sima-zhu Nov 19, 2021
20d3315
change return type
sima-zhu Nov 19, 2021
a6aff83
change wrong params
sima-zhu Nov 19, 2021
def7ab3
default to toolpath
sima-zhu Nov 19, 2021
07968c9
typo
sima-zhu Nov 19, 2021
1c565a6
correct exit on Test
sima-zhu Nov 19, 2021
f454d28
change to right function name
sima-zhu Nov 19, 2021
b0b9e06
Fixed log message
sima-zhu Nov 19, 2021
5dec9f4
log message
sima-zhu Nov 19, 2021
85dd31c
Added more test cases
sima-zhu Nov 19, 2021
515012b
Correct the parameters
sima-zhu Nov 19, 2021
785b8fc
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 20, 2021
f8a7701
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 20, 2021
c0b1928
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 20, 2021
f48e2f9
Remove exit 0 in test function
sima-zhu Nov 20, 2021
080d502
change the path delimiter
sima-zhu Nov 20, 2021
bef68ed
More changes on var
sima-zhu Nov 20, 2021
4b91d0b
Hide error behind
sima-zhu Nov 20, 2021
1cba076
Comment back all tests
sima-zhu Nov 20, 2021
8919c4c
exit 0
sima-zhu Nov 20, 2021
5829165
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 22, 2021
0be7aff
remove default value
sima-zhu Nov 22, 2021
2cbf847
changes for new get-codeowners
sima-zhu Nov 22, 2021
b0bd33e
Update eng/common/scripts/get-codeowners.ps1
sima-zhu Nov 22, 2021
06a356c
update version and parameter
sima-zhu Nov 22, 2021
0c9a762
add user
sima-zhu Nov 22, 2021
2ba87a5
more fix
sima-zhu Nov 22, 2021
74b25b0
add messages
sima-zhu Nov 22, 2021
c9c4d4e
Added real cases
sima-zhu Nov 22, 2021
b3a6f37
fixed typo
sima-zhu Nov 22, 2021
0f3a78a
Make program work
sima-zhu Nov 22, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 75 additions & 33 deletions eng/common/scripts/get-codeowners.ps1
Original file line number Diff line number Diff line change
@@ -1,49 +1,91 @@
param (
$TargetDirectory, # should be in relative form from root of repo. EG: sdk/servicebus
$RootDirectory, # ideally $(Build.SourcesDirectory)
$VsoVariable = "" # target devops output variable
[string]$TargetDirectory = "", # Code path to code owners. e.g sdk/core/azure-amqp
[string]$CodeOwnerFileLocation = "$PSSCriptRoot/../../../.github/CODEOWNERS", # The absolute path of CODEOWNERS file.
[string]$ToolVersion = "1.0.0-dev.20211122.14", # Placeholder. Will update in next PR
[string]$ToolPath = (Join-Path ([System.IO.Path]::GetTempPath()) "codeowners-tool-path"), # The place to check the tool existence. Put temp path as default
[string]$DevOpsFeed = "https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json", # DevOp tool feeds.
[string]$VsoVariable = "", # Option of write code owners into devop variable
[switch]$IncludeNonUserAliases, # Option to filter out the team alias in code owner list. e.g. Azure/azure-sdk-team
[switch]$Test #Run test functions against the script logic
)
$target = $TargetDirectory.ToLower().Trim("/")
$codeOwnersLocation = Join-Path $RootDirectory -ChildPath ".github/CODEOWNERS"
$ownedFolders = @{}

if (!(Test-Path $codeOwnersLocation)) {
Write-Host "Unable to find CODEOWNERS file in target directory $RootDirectory"
exit 1
}

$codeOwnersContent = Get-Content $codeOwnersLocation
function Get-CodeOwnersTool()
{
$command = Join-Path $ToolPath "retrieve-codeowners"
# Check if the retrieve-codeowners tool exsits or not.
if (Get-Command $command -errorAction SilentlyContinue) {
return $command
}
if (!(Test-Path $ToolPath)) {
New-Item -ItemType Directory -Path $ToolPath | Out-Null
}
Write-Host "Installing the retrieve-codeowners tool under $ToolPath... "
dotnet tool install --tool-path $ToolPath --add-source $DevOpsFeed --version $ToolVersion "Azure.Sdk.Tools.RetrieveCodeOwners" | Out-Null

foreach ($contentLine in $codeOwnersContent) {
if (-not $contentLine.StartsWith("#") -and $contentLine){
$splitLine = $contentLine -split "\s+"

# CODEOWNERS file can also have labels present after the owner aliases
# gh aliases start with @ in codeowners. don't pass on to API calls
$ownedFolders[$splitLine[0].ToLower().Trim("/")] = ($splitLine[1..$($splitLine.Length)] `
| ? { $_.StartsWith("@") } `
| % { return $_.substring(1) }) -join ","
# Test to see if the tool properly installed.
if (!(Get-Command $command -errorAction SilentlyContinue)) {
Write-Error "The retrieve-codeowners tool is not properly installed. Please check your tool path. $ToolPath"
return
}
return $command
}

$results = $ownedFolders[$target]

if ($results) {
Write-Host "Found a folder $results to match $target"
function Get-CodeOwners ([string]$targetDirectory, [string]$codeOwnerFileLocation, [bool]$includeNonUserAliases = $false)
{
$command = Get-CodeOwnersTool
# Filter out the non user alias from code owner list.
Write-Host "Testing on $targetDirectory..."
if($includeNonUserAliases) {
$codeOwnersString = & $command --target-directory $targetDirectory --code-owner-file-path $codeOwnerFileLocation 2>&1
}
else {
$codeOwnersString = & $command --target-directory $targetDirectory --code-owner-file-path $codeOwnerFileLocation --filter-out-non-user-aliases 2>&1
}
# Failed at the command of fetching code owners.
if ($LASTEXITCODE -ne 0) {
Write-Host $codeOwnersString
return ,@()
}

$codeOwnersJson = $codeOwnersString | ConvertFrom-Json
if (!$codeOwnersJson) {
Write-Host "No code owners returned from the path: $targetDirectory"
return ,@()
}

if ($VsoVariable) {
$alreadyPresent = [System.Environment]::GetEnvironmentVariable($VsoVariable)
$codeOwners = $codeOwnersJson.Owners -join ","
Write-Host "##vso[task.setvariable variable=$VsoVariable;]$codeOwners"
}

return ,@($codeOwnersJson.Owners)
}

function TestGetCodeOwner([string]$targetDirectory, [string]$codeOwnerFileLocation, [bool]$includeNonUserAliases = $false, [string[]]$expectReturn) {
$actualReturn = Get-CodeOwners -targetDirectory $targetDirectory -codeOwnerFileLocation $codeOwnerFileLocation -includeNonUserAliases $IncludeNonUserAliases

if ($alreadyPresent) {
$results += ",$alreadyPresent"
if ($actualReturn.Count -ne $expectReturn.Count) {
Write-Error "The length of actual result is not as expected. Expected length: $($expectReturn.Count), Actual length: $($actualReturn.Count)."
exit 1
}
for ($i = 0; $i -lt $expectReturn.Count; $i++) {
if ($expectReturn[$i] -ne $actualReturn[$i]) {
Write-Error "Expect result $expectReturn[$i] is different than actual result $actualReturn[$i]."
exit 1
}
Write-Host "##vso[task.setvariable variable=$VsoVariable;]$results"
}
}

return $results
if($Test) {
$testFile = "$PSSCriptRoot/../../../tools/code-owners-parser/Azure.Sdk.Tools.RetrieveCodeOwners.Tests/CODEOWNERS"
TestGetCodeOwner -targetDirectory "sdk" -codeOwnerFileLocation $testFile -includeNonUserAliases $true -expectReturn @("person1", "person2")
TestGetCodeOwner -targetDirectory "sdk/noPath" -codeOwnerFileLocation $testFile -includeNonUserAliases $true -expectReturn @("person1", "person2")
TestGetCodeOwner -targetDirectory "/sdk/azconfig" -codeOwnerFileLocation $testFile -includeNonUserAliases $true -expectReturn @("person3", "person4")
TestGetCodeOwner -targetDirectory "/sdk/azconfig/package" -codeOwnerFileLocation $testFile -includeNonUserAliases $true $testFile -expectReturn @("person3", "person4")
TestGetCodeOwner -targetDirectory "/sd" -codeOwnerFileLocation $testFile -includeNonUserAliases $true -expectReturn @()
TestGetCodeOwner -targetDirectory "/sdk/testUser/" -codeOwnerFileLocation $testFile -expectReturn @("azure-sdk")
exit 0
}
else {
Write-Host "Unable to match path $target in CODEOWNERS file located at $codeOwnersLocation."
Write-Host ($ownedFolders | ConvertTo-Json)
return ""
return Get-CodeOwners -targetDirectory $TargetDirectory -codeOwnerFileLocation $CodeOwnerFileLocation -includeNonUserAliases $IncludeNonUserAliases
}