PowerShellForGitHub/GitHubLabels.ps1

1394 строки
43 KiB
PowerShell

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
@{
GitHubLabelTypeName = 'GitHub.Label'
}.GetEnumerator() | ForEach-Object {
Set-Variable -Scope Script -Option ReadOnly -Name $_.Key -Value $_.Value
}
filter Get-GitHubLabel
{
<#
.SYNOPSIS
Retrieve label(s) of a given GitHub repository.
.DESCRIPTION
Retrieve label(s) of a given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Label
Name of the specific label to be retrieved. If not supplied, all labels will be retrieved.
Emoji and codes are supported. For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER Issue
If provided, will return all of the labels for this particular issue.
.PARAMETER MilestoneNumber
If provided, will return all of the labels assigned to issues for this particular milestone.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.OUTPUTS
GitHub.Label
.EXAMPLE
Get-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub
Gets the information for every label from the microsoft\PowerShellForGitHub project.
.EXAMPLE
Get-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel
Gets the information for the label named "TestLabel" from the microsoft\PowerShellForGitHub
project.
.NOTES
There were a lot of complications with the ParameterSets with this function due to pipeline
input. For the time being, the ParameterSets have been simplified and the validation of
parameter combinations is happening within the function itself.
#>
[CmdletBinding(DefaultParameterSetName = 'NameUri')]
[OutputType({$script:GitHubLabelTypeName})]
param(
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('LabelName')]
[string] $Label,
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('IssueNumber')]
[int64] $Issue,
[Parameter(ValueFromPipelineByPropertyName)]
[int64] $MilestoneNumber,
[string] $AccessToken
)
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}
# There were a lot of complications trying to get pipelining working right when using all of
# the necessary ParameterSets, so we'll do internal parameter validation instead until someone
# can figure out the right way to do the parameter sets here _with_ pipeline support.
if ($PSBoundParameters.ContainsKey('Label') -or
$PSBoundParameters.ContainsKey('Issue') -or
$PSBoundParameters.ContainsKey('MilestoneNumber'))
{
if (-not ($PSBoundParameters.ContainsKey('Label') -xor
$PSBoundParameters.ContainsKey('Issue') -xor
$PSBoundParameters.ContainsKey('MilestoneNumber')))
{
$message = 'Label, Issue and Milestone are mutually exclusive. Only one can be specified in a single command.'
Write-Log -Message $message -Level Error
throw $message
}
}
$uriFragment = [String]::Empty
$description = [String]::Empty
if ($PSBoundParameters.ContainsKey('Issue'))
{
$uriFragment = "/repos/$OwnerName/$RepositoryName/issues/$Issue/labels"
$description = "Getting labels for Issue $Issue in $RepositoryName"
}
elseif ($PSBoundParameters.ContainsKey('MilestoneNumber'))
{
$uriFragment = "/repos/$OwnerName/$RepositoryName/milestones/$MilestoneNumber/labels"
$description = "Getting labels for issues in Milestone $MilestoneNumber in $RepositoryName"
}
else
{
$uriFragment = "repos/$OwnerName/$RepositoryName/labels/$Label"
if ($PSBoundParameters.ContainsKey('Name'))
{
$description = "Getting label $Label for $RepositoryName"
}
else
{
$description = "Getting labels for $RepositoryName"
}
}
$params = @{
'UriFragment' = $uriFragment
'Description' = $description
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return (Invoke-GHRestMethodMultipleResult @params | Add-GitHubLabelAdditionalProperties)
}
filter New-GitHubLabel
{
<#
.SYNOPSIS
Create a new label on a given GitHub repository.
.DESCRIPTION
Create a new label on a given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Label
Name of the label to be created.
Emoji and codes are supported.
For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER Color
Color (in HEX) for the new label.
.PARAMETER Description
A short description of the label.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.OUTPUTS
GitHub.Label
.EXAMPLE
New-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Color BBBBBB
Creates a new, grey-colored label called "TestLabel" in the PowerShellForGitHub project.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements')]
[OutputType({$script:GitHubLabelTypeName})]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="The Uri parameter is only referenced by Resolve-RepositoryElements which get access to it from the stack via Get-Variable -Scope 1.")]
param(
[Parameter(ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipeline)]
[Alias('LabelName')]
[string] $Label,
[Parameter(Mandatory)]
[ValidateScript({if ($_ -match '^#?[ABCDEF0-9]{6}$') { $true } else { throw "Color must be provided in hex." }})]
[Alias('LabelColor')]
[string] $Color = "EEEEEE",
[string] $Description,
[string] $AccessToken
)
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}
# Be robust to users who choose to provide a color in hex by specifying the leading # sign
# (by just stripping it out).
if ($Color.StartsWith('#'))
{
$Color = $Color.Substring(1)
}
$hashBody = @{
'name' = $Label
'color' = $Color
'description' = $Description
}
if (-not $PSCmdlet.ShouldProcess($Label, 'Create GitHub Label'))
{
return
}
$params = @{
'UriFragment' = "repos/$OwnerName/$RepositoryName/labels"
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Post'
'Description' = "Creating label $Label in $RepositoryName"
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return (Invoke-GHRestMethod @params | Add-GitHubLabelAdditionalProperties)
}
filter Remove-GitHubLabel
{
<#
.SYNOPSIS
Deletes a label from a given GitHub repository.
.DESCRIPTION
Deletes a label from a given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Label
Name of the label to be deleted.
Emoji and codes are supported. For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER Force
If this switch is specified, you will not be prompted for confirmation of command execution.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.EXAMPLE
Remove-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel
Removes the label called "TestLabel" from the PowerShellForGitHub project.
.EXAMPLE
$label = $repo | Get-GitHubLabel -Label 'Test Label' -Color '#AAAAAA'
$label | Remove-GitHubLabel
Removes the label we just created using the pipeline, but will prompt for confirmation
because neither -Confirm:$false nor -Force was specified.
.EXAMPLE
Remove-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Confirm:$false
Removes the label called "TestLabel" from the PowerShellForGitHub project.
Will not prompt for confirmation, as -Confirm:$false was specified.
.EXAMPLE
Remove-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Force
Removes the label called "TestLabel" from the PowerShellForGitHub project.
Will not prompt for confirmation, as -Force was specified.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements',
ConfirmImpact="High")]
[Alias('Delete-GitHubLabel')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="The Uri parameter is only referenced by Resolve-RepositoryElements which get access to it from the stack via Get-Variable -Scope 1.")]
param(
[Parameter(ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipeline,
ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('LabelName')]
[string] $Label,
[switch] $Force,
[string] $AccessToken
)
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}
if ($Force -and (-not $Confirm))
{
$ConfirmPreference = 'None'
}
if (-not $PSCmdlet.ShouldProcess($Label, 'Remove GitHub label'))
{
return
}
$params = @{
'UriFragment' = "repos/$OwnerName/$RepositoryName/labels/$Label"
'Method' = 'Delete'
'Description' = "Deleting label $Label from $RepositoryName"
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return Invoke-GHRestMethod @params
}
filter Set-GitHubLabel
{
<#
.SYNOPSIS
Updates an existing label on a given GitHub repository.
.DESCRIPTION
Updates an existing label on a given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Label
Current name of the label to be updated.
Emoji and codes are supported.
For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER NewName
New name for the label being updated.
Emoji and codes are supported.
For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER Color
Color (in HEX) for the new label.
.PARAMETER Description
A short description of the label.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.OUTPUTS
GitHub.Label
.EXAMPLE
Set-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -NewName NewTestLabel -Color BBBB00
Updates the existing label called TestLabel in the PowerShellForGitHub project to be called
'NewTestLabel' and be colored yellow.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements')]
[OutputType({$script:GitHubLabelTypeName})]
[Alias('Update-GitHubLabel')] # Non-standard usage of the Update verb, but done to avoid a breaking change post 0.14.0
param(
[Parameter(ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName)]
[Alias('LabelName')]
[string] $Label,
[Alias('NewLabelName')]
[string] $NewName,
[Alias('LabelColor')]
[ValidateScript({if ($_ -match '^#?[ABCDEF0-9]{6}$') { $true } else { throw "Color must be provided in hex." }})]
[string] $Color = "EEEEEE",
[string] $Description,
[string] $AccessToken
)
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}
# Be robust to users who choose to provide a color in hex by specifying the leading # sign
# (by just stripping it out).
if ($Color.StartsWith('#'))
{
$Color = $Color.Substring(1)
}
$hashBody = @{}
if ($PSBoundParameters.ContainsKey('NewName')) { $hashBody['name'] = $NewName }
if ($PSBoundParameters.ContainsKey('Description')) { $hashBody['description'] = $Description }
if ($PSBoundParameters.ContainsKey('Color')) { $hashBody['color'] = $Color }
if (-not $PSCmdlet.ShouldProcess($Label, 'Update GitHub Label'))
{
return
}
$params = @{
'UriFragment' = "repos/$OwnerName/$RepositoryName/labels/$Label"
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Patch'
'Description' = "Updating label $Label"
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return (Invoke-GHRestMethod @params | Add-GitHubLabelAdditionalProperties)
}
filter Initialize-GitHubLabel
{
<#
.SYNOPSIS
Replaces the entire set of Labels on the given GitHub repository to match the provided list
of Labels.
.DESCRIPTION
Replaces the entire set of Labels on the given GitHub repository to match the provided list
of Labels.
Will update the color/description for any Labels already in the repository that match the
name of a Label in the provided list. All other existing Labels will be removed, and then
new Labels will be created to match the others in the Label list.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Label
The array of Labels (name, color, description) that the repository should be aligning to.
A default list of labels will be used if no Labels are provided.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.EXAMPLE
Initialize-GitHubLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label @(@{'name' = 'TestLabel'; 'color' = 'EEEEEE'}, @{'name' = 'critical'; 'color' = 'FF000000'; 'description' = 'Needs immediate attention'})
Removes any labels not in this Label array, ensure the current assigned color and descriptions
match what's in the array for the labels that do already exist, and then creates new labels
for any remaining ones in the Label list.
.NOTES
This method does not rename any existing labels, as it doesn't have any context regarding
which Label the new name is for. Therefore, it is possible that by running this function
on a repository with Issues that have already been assigned Labels, you may experience data
loss as a minor correction to you (maybe fixing a typo) will result in the old Label being
removed (and thus unassigned from existing Issues) and then the new one created.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="The Uri parameter is only referenced by Resolve-RepositoryElements which get access to it from the stack via Get-Variable -Scope 1.")]
param(
[Parameter(ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(ValueFromPipelineByPropertyName)]
[object[]] $Label,
[string] $AccessToken
)
Write-InvocationLog
if (($null -eq $Label) -or ($Label.Count -eq 0))
{
$Label = $script:defaultGitHubLabels
}
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$commonParams = @{
'OwnerName' = $OwnerName
'RepositoryName' = $RepositoryName
'AccessToken' = $AccessToken
}
$labelNames = $Label.name
$existingLabels = Get-GitHubLabel @commonParams
$existingLabelNames = $existingLabels.name
if (-not $PSCmdlet.ShouldProcess(($Label -join ', '), 'Set GitHub Label'))
{
return
}
foreach ($labelToConfigure in $Label)
{
if ($labelToConfigure.name -notin $existingLabelNames)
{
# Create label if it doesn't exist
$newGitHubLabelParms = @{
Label = $labelToConfigure.name
Color = $labelToConfigure.color
Confirm = $false
WhatIf = $false
}
$null = New-GitHubLabel @newGitHubLabelParms @commonParams
}
else
{
# Update label's color if it already exists
$setGitHubLabelParms = @{
Label = $labelToConfigure.name
NewName = $labelToConfigure.name
Color = $labelToConfigure.color
Confirm = $false
WhatIf = $false
}
$null = Set-GitHubLabel @setGitHubLabelParms @commonParams
}
}
foreach ($labelName in $existingLabelNames)
{
if ($labelName -notin $labelNames)
{
# Remove label if it exists but is not in desired label list
$removeGitHubLabelParms = @{
Label = $labelName
Confirm = $false
WhatIf = $false
}
$null = Remove-GitHubLabel @removeGitHubLabelParms @commonParams
}
}
}
function Add-GitHubIssueLabel
{
<#
.DESCRIPTION
Adds a label to an issue in the given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Issue
Issue number to add the label to.
.PARAMETER Label
Array of label names to add to the issue
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.OUTPUTS
GitHub.Label
.EXAMPLE
Add-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Label $labels
Adds labels to an issue in the PowerShellForGitHub project.
.NOTES
This is implemented as a function rather than a filter because the ValueFromPipeline
parameter (Name) is itself an array which we want to ensure is processed only a single time.
This API endpoint doesn't add labels to a repository, it replaces the existing labels with
the new set provided, so we need to make sure that we have all the requested labels available
to us at the time that the API endpoint is called.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements')]
[OutputType({$script:GitHubLabelTypeName})]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="The Uri parameter is only referenced by Resolve-RepositoryElements which get access to it from the stack via Get-Variable -Scope 1.")]
param(
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName)]
[Alias('IssueNumber')]
[int64] $Issue,
[Parameter(
Mandatory,
ValueFromPipeline,
ValueFromPipelineByPropertyName)]
[Alias('LabelName')]
[ValidateNotNullOrEmpty()]
[string[]] $Label,
[string] $AccessToken
)
begin
{
$labelNames = @()
}
process
{
foreach ($name in $Label)
{
$labelNames += $name
}
}
end
{
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
'LabelCount' = $Label.Count
}
$hashBody = @{
'labels' = $labelNames
}
if (-not $PSCmdlet.ShouldProcess(($Label -join ', '), 'Add GitHub Issue Label'))
{
return
}
$params = @{
'UriFragment' = "repos/$OwnerName/$RepositoryName/issues/$Issue/labels"
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Post'
'Description' = "Adding labels to issue $Issue in $RepositoryName"
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return (Invoke-GHRestMethod @params | Add-GitHubLabelAdditionalProperties)
}
}
function Set-GitHubIssueLabel
{
<#
.DESCRIPTION
Replaces labels on an issue in the given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Issue
Issue number to replace the labels.
.PARAMETER Label
Array of label names that will be set on the issue.
.PARAMETER Force
If this switch is specified, you will not be prompted for confirmation of command execution.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.OUTPUTS
GitHub.Label
.EXAMPLE
Set-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Label $labels
Replaces labels on an issue in the PowerShellForGitHub project.
.EXAMPLE
('help wanted', 'good first issue') | Set-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1
Replaces labels on an issue in the PowerShellForGitHub project
with 'help wanted' and 'good first issue'.
.EXAMPLE
Set-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Confirm:$false
Removes all labels from issue 1 in the PowerShellForGitHub project.
Will not prompt for confirmation, as -Confirm:$false was specified.
This is the same result as having called
Remove-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Confirm:$false
.EXAMPLE
Set-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Force
Removes all labels from issue 1 in the PowerShellForGitHub project.
Will not prompt for confirmation, as -Force was specified.
This is the same result as having called
Remove-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 1 -Force
.NOTES
This is implemented as a function rather than a filter because the ValueFromPipeline
parameter (Name) is itself an array which we want to ensure is processed only a single time.
This API endpoint doesn't add labels to a repository, it replaces the existing labels with
the new set provided, so we need to make sure that we have all the requested labels available
to us at the time that the API endpoint is called.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName = 'Elements')]
[OutputType({$script:GitHubLabelTypeName})]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSReviewUnusedParameter", "", Justification="The Uri parameter is only referenced by Resolve-RepositoryElements which get access to it from the stack via Get-Variable -Scope 1.")]
param(
[Parameter(ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName)]
[Alias('IssueNumber')]
[int64] $Issue,
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('LabelName')]
[string[]] $Label,
[switch] $Force,
[string] $AccessToken
)
begin
{
$labelNames = @()
}
process
{
foreach ($name in $Label)
{
$labelNames += $name
}
}
end
{
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
'LabelCount' = $Label.Count
}
$hashBody = @{
'labels' = $labelNames
}
$shouldProcessMessage = "Set GitHub Issue Label(s) $($Label -join ', ')"
if ([System.String]::IsNullOrEmpty($Label))
{
$ConfirmPreference = 'Low'
$shouldProcessMessage = 'Remove all GitHub Issue Labels'
}
if ($Force -and (-not $Confirm))
{
$ConfirmPreference = 'None'
}
if (-not $PSCmdlet.ShouldProcess("Issue #$Issue", $shouldProcessMessage))
{
return
}
$params = @{
'UriFragment' = "repos/$OwnerName/$RepositoryName/issues/$Issue/labels"
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Put'
'Description' = "Replacing labels to issue $Issue in $RepositoryName"
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return (Invoke-GHRestMethod @params | Add-GitHubLabelAdditionalProperties)
}
}
filter Remove-GitHubIssueLabel
{
<#
.DESCRIPTION
Deletes a label from an issue in the given GitHub repository.
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
.PARAMETER OwnerName
Owner of the repository.
If not supplied here, the DefaultOwnerName configuration property value will be used.
.PARAMETER RepositoryName
Name of the repository.
If not supplied here, the DefaultRepositoryName configuration property value will be used.
.PARAMETER Uri
Uri for the repository.
The OwnerName and RepositoryName will be extracted from here instead of needing to provide
them individually.
.PARAMETER Issue
Issue number to remove the label from.
.PARAMETER Label
Name of the label to be deleted. If not provided, will delete all labels on the issue.
Emoji and codes are supported.
For more information, see here: https://www.webpagefx.com/tools/emoji-cheat-sheet/
.PARAMETER Force
If this switch is specified, you will not be prompted for confirmation of command execution.
.PARAMETER AccessToken
If provided, this will be used as the AccessToken for authentication with the
REST Api. Otherwise, will attempt to use the configured value or will run unauthenticated.
.INPUTS
GitHub.Branch
GitHub.Content
GitHub.Event
GitHub.Issue
GitHub.IssueComment
GitHub.Label
GitHub.Milestone
GitHub.PullRequest
GitHub.Project
GitHub.ProjectCard
GitHub.ProjectColumn
GitHub.Reaction
GitHub.Release
GitHub.ReleaseAsset
GitHub.Repository
.EXAMPLE
Remove-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Issue 1
Removes the label called "TestLabel" from issue 1 in the PowerShellForGitHub project.
.EXAMPLE
Remove-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Issue 1 -Confirm:$false
Removes the label called "TestLabel" from issue 1 in the PowerShellForGitHub project.
Will not prompt for confirmation, as -Confirm:$false was specified.
.EXAMPLE
Remove-GitHubIssueLabel -OwnerName microsoft -RepositoryName PowerShellForGitHub -Label TestLabel -Issue 1 -Force
Removes the label called "TestLabel" from issue 1 in the PowerShellForGitHub project.
Will not prompt for confirmation, as -Force was specified.
#>
[CmdletBinding(
SupportsShouldProcess,
DefaultParameterSetName='Elements',
ConfirmImpact="High")]
[Alias('Delete-GitHubLabel')]
param(
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $OwnerName,
[Parameter(
Mandatory,
ParameterSetName='Elements')]
[string] $RepositoryName,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName='Uri')]
[Alias('RepositoryUrl')]
[string] $Uri,
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName)]
[Alias('IssueNumber')]
[int64] $Issue,
[Parameter(ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('LabelName')]
[string] $Label,
[switch] $Force,
[string] $AccessToken
)
Write-InvocationLog
$elements = Resolve-RepositoryElements
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName
$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}
$description = [String]::Empty
if ($PSBoundParameters.ContainsKey('Label'))
{
$description = "Deleting label $Label from issue $Issue in $RepositoryName"
}
else
{
$description = "Deleting all labels from issue $Issue in $RepositoryName"
}
if ($Force -and (-not $Confirm))
{
$ConfirmPreference = 'None'
}
if (-not $PSCmdlet.ShouldProcess($Label, 'Remove GitHub Issue label'))
{
return
}
$params = @{
'UriFragment' = "/repos/$OwnerName/$RepositoryName/issues/$Issue/labels/$Label"
'Method' = 'Delete'
'Description' = $description
'AcceptHeader' = $script:symmetraAcceptHeader
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
}
return Invoke-GHRestMethod @params
}
filter Add-GitHubLabelAdditionalProperties
{
<#
.SYNOPSIS
Adds type name and additional properties to ease pipelining to GitHub Label objects.
.PARAMETER InputObject
The GitHub object to add additional properties to.
.PARAMETER TypeName
The type that should be assigned to the object.
.INPUTS
[PSCustomObject]
.OUTPUTS
GitHub.Label
#>
[CmdletBinding()]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification="Internal helper that is definitely adding more than one property.")]
param(
[Parameter(
Mandatory,
ValueFromPipeline)]
[AllowNull()]
[AllowEmptyCollection()]
[PSCustomObject[]] $InputObject,
[ValidateNotNullOrEmpty()]
[string] $TypeName = $script:GitHubLabelTypeName
)
foreach ($item in $InputObject)
{
$item.PSObject.TypeNames.Insert(0, $TypeName)
if (-not (Get-GitHubConfiguration -Name DisablePipelineSupport))
{
$elements = Split-GitHubUri -Uri $item.url
$repositoryUrl = Join-GitHubUri @elements
Add-Member -InputObject $item -Name 'RepositoryUrl' -Value $repositoryUrl -MemberType NoteProperty -Force
if ($null -ne $item.id)
{
Add-Member -InputObject $item -Name 'LabelId' -Value $item.id -MemberType NoteProperty -Force
}
Add-Member -InputObject $item -Name 'LabelName' -Value $item.name -MemberType NoteProperty -Force
}
Write-Output $item
}
}
# A set of labels that a project might want to initially populate their repository with
# Used by Set-GitHubLabel when no Label list is provided by the user.
# This list exists to support v0.1.0 users.
$script:defaultGitHubLabels = @(
@{
'name' = 'pri:lowest'
'color' = '4285F4'
},
@{
'name' = 'pri:low'
'color' = '4285F4'
},
@{
'name' = 'pri:medium'
'color' = '4285F4'
},
@{
'name' = 'pri:high'
'color' = '4285F4'
},
@{
'name' = 'pri:highest'
'color' = '4285F4'
},
@{
'name' = 'bug'
'color' = 'fc2929'
},
@{
'name' = 'duplicate'
'color' = 'cccccc'
},
@{
'name' = 'enhancement'
'color' = '121459'
},
@{
'name' = 'up for grabs'
'color' = '159818'
},
@{
'name' = 'question'
'color' = 'cc317c'
},
@{
'name' = 'discussion'
'color' = 'fe9a3d'
},
@{
'name' = 'wontfix'
'color' = 'dcb39c'
},
@{
'name' = 'in progress'
'color' = 'f0d218'
},
@{
'name' = 'ready'
'color' = '145912'
}
)