diff --git a/GitHubComments.ps1 b/GitHubComments.ps1 index aff1deae..6f87890f 100644 --- a/GitHubComments.ps1 +++ b/GitHubComments.ps1 @@ -249,7 +249,7 @@ function New-GitHubComment [string] $Uri, [Parameter(Mandatory)] - [string] $Issue, + [int] $Issue, [Parameter(Mandatory)] [string] $Body, diff --git a/GitHubIssues.ps1 b/GitHubIssues.ps1 index 62767cbc..61fd71da 100644 --- a/GitHubIssues.ps1 +++ b/GitHubIssues.ps1 @@ -128,7 +128,7 @@ function Get-GitHubIssue [ValidateSet('all', 'ownedAndMember')] [string] $RepositoryType = 'all', - [string] $Issue, + [int] $Issue, [switch] $IgnorePullRequests, @@ -375,8 +375,7 @@ function Get-GitHubIssueTimeline [string] $Uri, [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] - [string] $Issue, + [int] $Issue, [string] $AccessToken, diff --git a/GitHubLabels.ps1 b/GitHubLabels.ps1 index b66be948..9488f2e5 100644 --- a/GitHubLabels.ps1 +++ b/GitHubLabels.ps1 @@ -29,6 +29,12 @@ function Get-GitHubLabel Name of the specific label to be retieved. 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 Milestone + If provided, will return all of the labels 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. @@ -55,20 +61,37 @@ function Get-GitHubLabel DefaultParametersetName='Elements')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Justification="Methods called within here make use of PSShouldProcess, and the switch is passed on to them inherently.")] param( - [Parameter(ParameterSetName='Elements')] + [Parameter(Mandatory, ParameterSetName='Elements')] + [Parameter(Mandatory, ParameterSetName='NameElements')] + [Parameter(Mandatory, ParameterSetName='IssueElements')] + [Parameter(Mandatory, ParameterSetName='MilestoneElements')] [string] $OwnerName, - [Parameter(ParameterSetName='Elements')] + [Parameter(Mandatory, ParameterSetName='Elements')] + [Parameter(Mandatory, ParameterSetName='NameElements')] + [Parameter(Mandatory, ParameterSetName='IssueElements')] + [Parameter(Mandatory, ParameterSetName='MilestoneElements')] [string] $RepositoryName, - [Parameter( - Mandatory, - ParameterSetName='Uri')] + [Parameter(Mandatory, ParameterSetName='Uri')] + [Parameter(Mandatory, ParameterSetName='NameUri')] + [Parameter(Mandatory, ParameterSetName='IssueUri')] + [Parameter(Mandatory, ParameterSetName='MilestoneUri')] [string] $Uri, + [Parameter(Mandatory, ParameterSetName='NameUri')] + [Parameter(Mandatory, ParameterSetName='NameElements')] [Alias('LabelName')] [string] $Name, + [Parameter(Mandatory, ParameterSetName='IssueUri')] + [Parameter(Mandatory, ParameterSetName='IssueElements')] + [int] $Issue, + + [Parameter(Mandatory, ParameterSetName='MilestoneUri')] + [Parameter(Mandatory, ParameterSetName='MilestoneElements')] + [int] $Milestone, + [string] $AccessToken, [switch] $NoStatus @@ -85,9 +108,36 @@ function Get-GitHubLabel 'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName) } + $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('Milestone')) + { + $uriFragment = "/repos/$OwnerName/$RepositoryName/milestones/$Milestone/labels" + $description = "Getting labels for Milestone $Milestone in $RepositoryName" + } + else + { + $uriFragment = "repos/$OwnerName/$RepositoryName/labels/$Name" + + if ($PSBoundParameters.ContainsKey('Name')) + { + $description = "Getting label $Name for $RepositoryName" + } + else + { + $description = "Getting labels for $RepositoryName" + } + } + $params = @{ - 'UriFragment' = "repos/$OwnerName/$RepositoryName/labels/$Name" - 'Description' = "Getting all labels for $RepositoryName" + 'UriFragment' = $uriFragment + 'Description' = $description 'AcceptHeader' = 'application/vnd.github.symmetra-preview+json' 'AccessToken' = $AccessToken 'TelemetryEventName' = $MyInvocation.MyCommand.Name @@ -284,6 +334,7 @@ function Remove-GitHubLabel [string] $Uri, [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] [Alias('LabelName')] [string] $Name, @@ -565,6 +616,314 @@ function Set-GitHubLabel } } +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 Name + 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. + + .PARAMETER NoStatus + If this switch is specified, long-running commands will run on the main thread + with no commandline status update. When not specified, those commands run in + the background, enabling the command prompt to provide status information. + If not supplied here, the DefaultNoStatus configuration property value will be used. + + .EXAMPLE + Add-GitHubIssueLabel -OwnerName PowerShell -RepositoryName PowerShellForGitHub -Issue 1 -Name $labels + + Adds labels to an issue in the PowerShellForGitHub project. +#> + [CmdletBinding( + SupportsShouldProcess, + DefaultParametersetName='Elements')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Justification="Methods called within here make use of PSShouldProcess, and the switch is passed on to them inherently.")] + param( + [Parameter(Mandatory, ParameterSetName='Elements')] + [string] $OwnerName, + + [Parameter(Mandatory, ParameterSetName='Elements')] + [string] $RepositoryName, + + [Parameter( + Mandatory, + ParameterSetName='Uri')] + [string] $Uri, + + [Parameter(Mandatory)] + [int] $Issue, + + [Parameter(Mandatory)] + [Alias('LabelName')] + [string[]] $Name, + + [string] $AccessToken, + + [switch] $NoStatus + ) + + Write-InvocationLog + + $elements = Resolve-RepositoryElements + $OwnerName = $elements.ownerName + $RepositoryName = $elements.repositoryName + + $telemetryProperties = @{ + 'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName) + 'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName) + 'LabelCount' = $Name.Count + } + + $hashBody = @{ + 'labels' = $Name + } + + $params = @{ + 'UriFragment' = "repos/$OwnerName/$RepositoryName/issues/$Issue/labels" + 'Body' = (ConvertTo-Json -InputObject $hashBody) + 'Method' = 'Post' + 'Description' = "Adding labels to issue $Issue in $RepositoryName" + 'AcceptHeader' = 'application/vnd.github.symmetra-preview+json' + 'AccessToken' = $AccessToken + 'TelemetryEventName' = $MyInvocation.MyCommand.Name + 'TelemetryProperties' = $telemetryProperties + 'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus) + } + + return Invoke-GHRestMethod @params +} + +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 LabelName + Array of label names that will be set on 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. + + .PARAMETER NoStatus + If this switch is specified, long-running commands will run on the main thread + with no commandline status update. When not specified, those commands run in + the background, enabling the command prompt to provide status information. + If not supplied here, the DefaultNoStatus configuration property value will be used. + + .EXAMPLE + Set-GitHubIssueLabel -OwnerName PowerShell -RepositoryName PowerShellForGitHub -Issue 1 -LabelName $labels + + Replaces labels on an issue in the PowerShellForGitHub project. +#> + [CmdletBinding( + SupportsShouldProcess, + DefaultParametersetName='Elements')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Justification="Methods called within here make use of PSShouldProcess, and the switch is passed on to them inherently.")] + param( + [Parameter(ParameterSetName='Elements')] + [string] $OwnerName, + + [Parameter(ParameterSetName='Elements')] + [string] $RepositoryName, + + [Parameter( + Mandatory, + ParameterSetName='Uri')] + [string] $Uri, + + [Parameter(Mandatory)] + [int] $Issue, + + [Parameter(Mandatory)] + [Alias('LabelName')] + [string[]] $Name, + + [string] $AccessToken, + + [switch] $NoStatus + ) + + Write-InvocationLog + + $elements = Resolve-RepositoryElements + $OwnerName = $elements.ownerName + $RepositoryName = $elements.repositoryName + + $telemetryProperties = @{ + 'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName) + 'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName) + 'LabelCount' = $Name.Count + } + + $hashBody = @{ + 'labels' = $Name + } + + $params = @{ + 'UriFragment' = "repos/$OwnerName/$RepositoryName/issues/$Issue/labels" + 'Body' = (ConvertTo-Json -InputObject $hashBody) + 'Method' = 'Put' + 'Description' = "Replacing labels to issue $Issue in $RepositoryName" + 'AcceptHeader' = 'application/vnd.github.symmetra-preview+json' + 'AccessToken' = $AccessToken + 'TelemetryEventName' = $MyInvocation.MyCommand.Name + 'TelemetryProperties' = $telemetryProperties + 'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus) + } + + return Invoke-GHRestMethod @params +} + +function 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 Name + 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 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. + + .PARAMETER NoStatus + If this switch is specified, long-running commands will run on the main thread + with no commandline status update. When not specified, those commands run in + the background, enabling the command prompt to provide status information. + If not supplied here, the DefaultNoStatus configuration property value will be used. + + .EXAMPLE + Remove-GitHubIssueLabel -OwnerName PowerShell -RepositoryName PowerShellForGitHub -Name TestLabel -Issue 1 + + Removes the label called "TestLabel" from issue 1 in the PowerShellForGitHub project. +#> + [CmdletBinding( + SupportsShouldProcess, + DefaultParametersetName='Elements')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Justification="Methods called within here make use of PSShouldProcess, and the switch is passed on to them inherently.")] + [Alias('Delete-GitHubLabel')] + param( + [Parameter(Mandatory, ParameterSetName='Elements')] + [string] $OwnerName, + + [Parameter(Mandatory, ParameterSetName='Elements')] + [string] $RepositoryName, + + [Parameter(Mandatory, ParameterSetName='Uri')] + [string] $Uri, + + [Parameter(Mandatory)] + [int] $Issue, + + [ValidateNotNullOrEmpty()] + [Alias('LabelName')] + [string] $Name, + + [string] $AccessToken, + + [switch] $NoStatus + ) + + 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('Name')) + { + $description = "Deleting label $Name from issue $Issue in $RepositoryName" + } + else + { + $description = "Deleting all labels from issue $Issue in $RepositoryName" + } + + $params = @{ + 'UriFragment' = "/repos/$OwnerName/$RepositoryName/issues/$Issue/labels/$Name" + 'Method' = 'Delete' + 'Description' = $description + 'AcceptHeader' = 'application/vnd.github.symmetra-preview+json' + 'AccessToken' = $AccessToken + 'TelemetryEventName' = $MyInvocation.MyCommand.Name + 'TelemetryProperties' = $telemetryProperties + 'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus) + } + + return Invoke-GHRestMethod @params +} + # 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. diff --git a/PowerShellForGitHub.psd1 b/PowerShellForGitHub.psd1 index fb44f43f..37dd1bf1 100644 --- a/PowerShellForGitHub.psd1 +++ b/PowerShellForGitHub.psd1 @@ -42,6 +42,7 @@ # Functions to export from this module FunctionsToExport = @( + 'Add-GitHubIssueLabel', 'Backup-GitHubConfiguration', 'Clear-GitHubAuthentication', 'ConvertFrom-Markdown', @@ -88,6 +89,7 @@ 'New-GitHubRepositoryFork', 'Remove-GithubAssignee', 'Remove-GitHubComment', + 'Remove-GitHubIssueLabel', 'Remove-GitHubLabel', 'Remove-GitHubRepository', 'Reset-GitHubConfiguration', @@ -95,6 +97,7 @@ 'Set-GitHubAuthentication', 'Set-GitHubComment', 'Set-GitHubConfiguration', + 'Set-GitHubIssueLabel', 'Set-GitHubLabel', 'Set-GitHubRepositoryTopic', 'Split-GitHubUri', diff --git a/Tests/GitHubLabels.tests.ps1 b/Tests/GitHubLabels.tests.ps1 index 5f7a3dff..aaa8ed9d 100644 --- a/Tests/GitHubLabels.tests.ps1 +++ b/Tests/GitHubLabels.tests.ps1 @@ -58,8 +58,8 @@ function Initialize-AppVeyor Initialize-AppVeyor -$script:accessTokenConfigured = Test-GitHubAuthenticationConfigured -if (-not $script:accessTokenConfigured) +$accessTokenConfigured = Test-GitHubAuthenticationConfigured +if (-not $accessTokenConfigured) { $message = @( 'GitHub API Token not defined, some of the tests will be skipped.', @@ -70,208 +70,300 @@ if (-not $script:accessTokenConfigured) # Backup the user's configuration before we begin, and ensure we're at a pure state before running # the tests. We'll restore it at the end. $configFile = New-TemporaryFile -Backup-GitHubConfiguration -Path $configFile -Reset-GitHubConfiguration - -$script:defaultLabels = @( - @{ - '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' - } -) - -if ($script:accessTokenConfigured) +try { - Describe 'Getting labels from repository' { - $repositoryName = [Guid]::NewGuid().Guid - $null = New-GitHubRepository -RepositoryName $repositoryName - Set-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Label $script:defaultLabels + Backup-GitHubConfiguration -Path $configFile + Reset-GitHubConfiguration + + $defaultLabels = @( + @{ + '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' + } + ) - Context 'When querying for all labels' { - $labels = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName + if ($accessTokenConfigured) + { + Describe 'Getting labels from repository' { + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName + Set-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Label $defaultLabels - It 'Should return expected number of labels' { - $($labels).Count | Should be $script:defaultLabels.Count + Context 'When querying for all labels' { + $labels = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName + + It 'Should return expected number of labels' { + $($labels).Count | Should be $:defaultLabels.Count + } } - } - Context 'When querying for specific label' { - $label = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name bug + Context 'When querying for specific label' { + $label = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name bug - It 'Should return expected label' { - $label.name | Should be "bug" + It 'Should return expected label' { + $label.name | Should be "bug" + } } + + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - $null = Remove-GitHubRepository -OwnerName $script:ownerName -RepositoryName $repositoryName - } + Describe 'Creating new label' { + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName - Describe 'Creating new label' { - $repositoryName = [Guid]::NewGuid().Guid - $null = New-GitHubRepository -RepositoryName $repositoryName + $labelName = [Guid]::NewGuid().Guid + New-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB + $label = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName - $labelName = [Guid]::NewGuid().Guid - New-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB - $label = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName + It 'New label should be created' { + $label.name | Should be $labelName + } - It 'New label should be created' { - $label.name | Should be $labelName - } + AfterEach { + Remove-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName + } - AfterEach { - Remove-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - $null = Remove-GitHubRepository -OwnerName $script:ownerName -RepositoryName $repositoryName - } + Describe 'Removing label' { + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName + Set-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Label $defaultLabels - Describe 'Removing label' { - $repositoryName = [Guid]::NewGuid().Guid - $null = New-GitHubRepository -RepositoryName $repositoryName - Set-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Label $script:defaultLabels + $labelName = [Guid]::NewGuid().Guid + New-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB + $labels = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName - $labelName = [Guid]::NewGuid().Guid - New-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB - $labels = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName + It 'Should return increased number of labels' { + $($labels).Count | Should be ($defaultLabels.Count + 1) + } - It 'Should return increased number of labels' { - $($labels).Count | Should be ($script:defaultLabels.Count + 1) - } + Remove-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName + $labels = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName - Remove-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName - $labels = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName + It 'Should return expected number of labels' { + $($labels).Count | Should be $defaultLabels.Count + } - It 'Should return expected number of labels' { - $($labels).Count | Should be $script:defaultLabels.Count + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - $null = Remove-GitHubRepository -OwnerName $script:ownerName -RepositoryName $repositoryName - } + Describe 'Updating label' { + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName - Describe 'Updating label' { - $repositoryName = [Guid]::NewGuid().Guid - $null = New-GitHubRepository -RepositoryName $repositoryName + $labelName = [Guid]::NewGuid().Guid - $labelName = [Guid]::NewGuid().Guid + Context 'Updating label color' { + New-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB + Update-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -NewName $labelName -Color AAAAAA + $label = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName - Context 'Updating label color' { - New-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB - Update-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -NewName $labelName -Color AAAAAA - $label = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName + AfterEach { + Remove-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName + } - AfterEach { - Remove-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName + It 'Label should have different color' { + $label.color | Should be AAAAAA + } } - It 'Label should have different color' { - $label.color | Should be AAAAAA + Context 'Updating label name' { + $newLabelName = $labelName + "2" + New-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB + Update-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -NewName $newLabelName -Color BBBBBB + $label = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $newLabelName + + AfterEach { + Remove-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $newLabelName + } + + It 'Label should have different color' { + $label | Should not be $null + $label.color | Should be BBBBBB + } } + + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - Context 'Updating label name' { - $newLabelName = $labelName + "2" - New-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB - Update-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -NewName $newLabelName -Color BBBBBB - $label = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $newLabelName + Describe 'Applying set of labels on repository' { + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName - AfterEach { - Remove-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $newLabelName + $labelName = [Guid]::NewGuid().Guid + Set-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Label $defaultLabels + + # Add new label + New-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB + $labels = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName + + # Change color of existing label + Update-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name "bug" -NewName "bug" -Color BBBBBB + + # Remove one of approved labels" + Remove-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name "discussion" + + It 'Should return increased number of labels' { + $($labels).Count | Should be ($defaultLabels.Count + 1) } - It 'Label should have different color' { - $label | Should not be $null - $label.color | Should be BBBBBB + Set-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Label $defaultLabels + $labels = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName + + It 'Should return expected number of labels' { + $($labels).Count | Should be $defaultLabels.Count + $bugLabel = $labels | Where-Object {$_.name -eq "bug"} + $bugLabel.color | Should be "fc2929" } + + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - $null = Remove-GitHubRepository -OwnerName $script:ownerName -RepositoryName $repositoryName - } + Describe 'Adding labels to an issue'{ + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName + Set-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Label $defaultLabels - Describe 'Applying set of labels on repository' { - $repositoryName = [Guid]::NewGuid().Guid - $null = New-GitHubRepository -RepositoryName $repositoryName + $issueName = [Guid]::NewGuid().Guid + $issue = New-GitHubIssue -OwnerName $ownerName -RepositoryName $repositoryName -Title $issueName - $labelName = [Guid]::NewGuid().Guid - Set-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Label $script:defaultLabels + Context 'Adding labels to an issue' { + $labelsToAdd = @('pri:lowest', 'pri:low', 'pri:medium', 'pri:high', 'pri:highest', 'bug', 'duplicate', + 'enhancement', 'up for grabs', 'question', 'discussion', 'wontfix', 'in progress', 'ready') + $addedLabels = @(Add-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number -LabelName $labelsToAdd) - # Add new label - New-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name $labelName -Color BBBBBB - $labels = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName + It 'Should return the number of labels that were just added' { + $addedLabels.Count | Should be $defaultLabels.Count + } - # Change color of existing label - Update-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name "bug" -NewName "bug" -Color BBBBBB + $labelIssues = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number - # Remove one of approved labels" - Remove-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Name "discussion" + It 'Should return the number of labels that were just added from querying the issue again' { + $labelIssues.Count | Should be $defaultLabels.Count + } + } - It 'Should return increased number of labels' { - $($labels).Count | Should be ($script:defaultLabels.Count + 1) + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } + Describe 'Removing labels on an issue'{ + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName + + $issueName = [Guid]::NewGuid().Guid + $issue = New-GitHubIssue -OwnerName $ownerName -RepositoryName $repositoryName -Title $issueName + + $labelsToAdd = @('pri:lowest', 'pri:low', 'pri:medium', 'pri:high', 'pri:highest', 'bug', 'duplicate', + 'enhancement', 'up for grabs', 'question', 'discussion', 'wontfix', 'in progress', 'ready') + Add-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number -LabelName $labelsToAdd + + Context 'For removing individual issues'{ + Remove-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name "discussion" -Issue $issue.number + Remove-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name "question" -Issue $issue.number + Remove-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Name "bug" -Issue $issue.number + $labelIssues = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number + + It 'Should have removed three labels from the issue' { + $labelIssues.Count | Should be ($defaultLabels.Count - 3) + } + } + + Context 'For removing all issues'{ + Remove-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number + $labelIssues = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number - Set-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Label $script:defaultLabels - $labels = Get-GitHubLabel -OwnerName $script:ownerName -RepositoryName $repositoryName + It 'Should have removed all labels from the issue' { + $labelIssues.Count | Should be 0 + } + } - It 'Should return expected number of labels' { - $($labels).Count | Should be $script:defaultLabels.Count - $bugLabel = $labels | Where-Object {$_.name -eq "bug"} - $bugLabel.color | Should be "fc2929" + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName } - $null = Remove-GitHubRepository -OwnerName $script:ownerName -RepositoryName $repositoryName + Describe 'Replacing labels on an issue'{ + $repositoryName = [Guid]::NewGuid().Guid + $null = New-GitHubRepository -RepositoryName $repositoryName + + $issueName = [Guid]::NewGuid().Guid + $issue = New-GitHubIssue -OwnerName $ownerName -RepositoryName $repositoryName -Title $issueName + + $labelsToAdd = @('pri:lowest', 'pri:low', 'pri:medium', 'pri:high', 'pri:highest', 'bug', 'duplicate', + 'enhancement', 'up for grabs', 'question', 'discussion', 'wontfix', 'in progress', 'ready') + + Add-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number -LabelName 'pri:medium' + + $addedLabels = @(Set-GitHubIssueLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number -LabelName $labelsToAdd) + + It 'Should return the issue with 14 labels' { + $addedLabels.Count | Should be $labelsToAdd.Count + } + + $labelIssues = Get-GitHubLabel -OwnerName $ownerName -RepositoryName $repositoryName -Issue $issue.number + + It 'Should have 14 labels after querying the issue' { + $labelIssues.Count | Should be $defaultLabels.Count + } + + $null = Remove-GitHubRepository -OwnerName $ownerName -RepositoryName $repositoryName + } } } - -# Restore the user's configuration to its pre-test state -Restore-GitHubConfiguration -Path $configFile +finally +{ + # Restore the user's configuration to its pre-test state + Restore-GitHubConfiguration -Path $configFile +} diff --git a/USAGE.md b/USAGE.md index 0495d294..76dc476d 100644 --- a/USAGE.md +++ b/USAGE.md @@ -13,8 +13,12 @@ * [Quering Team and Organization Membership](#querying-team-and-organization-membership) * [Labels](#labels) * [Getting Labels for a Repository](#getting-labels-for-a-repository) + * [Getting Labels for an issue](#getting-labels-for-an-issue) + * [Getting Labels for a milestone](#getting-labels-for-a-milestone) * [Adding a New Label to a Repository](#adding-a-new-label-to-a-repository) * [Removing a Label From a Repository](#removing-a-label-from-a-repository) + * [Adding Labels to an Issue](#adding-labels-to-an-issue) + * [Removing a Label From an Issue](#removing-a-label-from-an-issue) * [Updating a Label With a New Name and Color](#updating-a-label-with-a-new-name-and-color) * [Bulk Updating Labels in a Repository](#bulk-updating-labels-in-a-repository) * [Users](#users) @@ -270,6 +274,16 @@ $teamMembers = Get-GitHubTeamMembers -OrganizationName 'OrganizationName' -TeamN $labels = Get-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration ``` +#### Getting Labels for an Issue +```powershell +$labels = Get-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration -Issue 1 +``` + +#### Getting Labels for a Milestone +```powershell +$labels = Get-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration -Milestone 1 +``` + #### Adding a New Label to a Repository ```powershell New-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration -Name TestLabel -Color BBBBBB @@ -280,6 +294,17 @@ New-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration Remove-GitHubLabel -OwnerName Powershell -RepositoryName desiredstateconfiguration -Name TestLabel ``` +#### Adding Labels to an Issue +```powershell +$labelNames = @{'bug', 'discussion') +Add-GitHubIssueLabel -OwnerName $script:ownerName -RepositoryName $repositoryName -Issue 1 -LabelName $labelNames +``` + +#### Removing a Label From an Issue +```powershell +Remove-GitHubIssueLabel -OwnerName Powershell -RepositoryName desiredstateconfiguration -Name TestLabel -Issue 1 +``` + #### Updating a Label With a New Name and Color ```powershell Update-GitHubLabel -OwnerName Powershell -RepositoryName DesiredStateConfiguration -Name TestLabel -NewName NewTestLabel -Color BBBB00