459 строки
14 KiB
PowerShell
459 строки
14 KiB
PowerShell
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
# Licensed under the MIT License.
|
|
|
|
@{
|
|
GitHubUserTypeName = 'GitHub.User'
|
|
GitHubUserContextualInformationTypeName = 'GitHub.UserContextualInformation'
|
|
}.GetEnumerator() | ForEach-Object {
|
|
Set-Variable -Scope Script -Option ReadOnly -Name $_.Key -Value $_.Value
|
|
}
|
|
|
|
filter Get-GitHubUser
|
|
{
|
|
<#
|
|
.SYNOPSIS
|
|
Retrieves information about the specified user on GitHub.
|
|
|
|
.DESCRIPTION
|
|
Retrieves information about the specified user on GitHub.
|
|
|
|
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
|
|
|
|
.PARAMETER UserName
|
|
The GitHub user to retrieve information for.
|
|
If not specified, will retrieve information on all GitHub users
|
|
(and may take a while to complete).
|
|
|
|
.PARAMETER Current
|
|
If specified, gets information on the current user.
|
|
|
|
.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.
|
|
|
|
.NOTES
|
|
The email key in the following response is the publicly visible email address from the
|
|
user's GitHub profile page. You only see publicly visible email addresses when
|
|
authenticated with GitHub.
|
|
|
|
When setting up your profile, a user can select a primary email address to be public
|
|
which provides an email entry for this endpoint. If the user does not set a public
|
|
email address for email, then it will have a value of null.
|
|
|
|
.INPUTS
|
|
GitHub.User
|
|
|
|
.OUTPUTS
|
|
GitHub.User
|
|
|
|
.EXAMPLE
|
|
Get-GitHubUser -UserName octocat
|
|
|
|
Gets information on just the user named 'octocat'
|
|
|
|
.EXAMPLE
|
|
'octocat', 'PowerShellForGitHubTeam' | Get-GitHubUser
|
|
|
|
Gets information on the users named 'octocat' and 'PowerShellForGitHubTeam'
|
|
|
|
.EXAMPLE
|
|
Get-GitHubUser
|
|
|
|
Gets information on every GitHub user.
|
|
|
|
.EXAMPLE
|
|
Get-GitHubUser -Current
|
|
|
|
Gets information on the current authenticated user.
|
|
#>
|
|
[CmdletBinding(DefaultParameterSetName = 'ListAndSearch')]
|
|
[OutputType({$script:GitHubUserTypeName})]
|
|
param(
|
|
[Parameter(
|
|
ValueFromPipeline,
|
|
ValueFromPipelineByPropertyName,
|
|
ParameterSetName='ListAndSearch')]
|
|
[Alias('Name')]
|
|
[Alias('User')]
|
|
[string] $UserName,
|
|
|
|
[Parameter(ParameterSetName='Current')]
|
|
[switch] $Current,
|
|
|
|
[string] $AccessToken
|
|
)
|
|
|
|
Write-InvocationLog
|
|
|
|
$params = @{
|
|
'AccessToken' = $AccessToken
|
|
'TelemetryEventName' = $MyInvocation.MyCommand.Name
|
|
}
|
|
|
|
if ($Current)
|
|
{
|
|
return (Invoke-GHRestMethod -UriFragment "user" -Description "Getting current authenticated user" -Method 'Get' @params |
|
|
Add-GitHubUserAdditionalProperties)
|
|
}
|
|
elseif ([String]::IsNullOrEmpty($UserName))
|
|
{
|
|
return (Invoke-GHRestMethodMultipleResult -UriFragment 'users' -Description 'Getting all users' @params |
|
|
Add-GitHubUserAdditionalProperties)
|
|
}
|
|
else
|
|
{
|
|
return (Invoke-GHRestMethod -UriFragment "users/$UserName" -Description "Getting user $UserName" -Method 'Get' @params |
|
|
Add-GitHubUserAdditionalProperties)
|
|
}
|
|
}
|
|
|
|
filter Get-GitHubUserContextualInformation
|
|
{
|
|
<#
|
|
.SYNOPSIS
|
|
Retrieves contextual information about the specified user on GitHub.
|
|
|
|
.DESCRIPTION
|
|
Retrieves contextual information about the specified user on GitHub.
|
|
|
|
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
|
|
|
|
.PARAMETER User
|
|
The GitHub user to retrieve information for.
|
|
|
|
.PARAMETER OrganizationId
|
|
The ID of an Organization. When provided, this returns back the context for the user
|
|
in relation to this Organization.
|
|
|
|
.PARAMETER RepositoryId
|
|
The ID for a Repository. When provided, this returns back the context for the user
|
|
in relation to this Repository.
|
|
|
|
.PARAMETER IssueId
|
|
The ID for a Issue. When provided, this returns back the context for the user
|
|
in relation to this Issue.
|
|
NOTE: This is the *id* of the issue and not the issue *number*.
|
|
|
|
.PARAMETER PullRequestId
|
|
The ID for a PullRequest. When provided, this returns back the context for the user
|
|
in relation to this Pull Request.
|
|
NOTE: This is the *id* of the pull request and not the pull request *number*.
|
|
|
|
.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.Issue
|
|
GitHub.Organization
|
|
GitHub.PullRequest
|
|
GitHub.Repository
|
|
GitHub.User
|
|
|
|
.OUTPUTS
|
|
GitHub.UserContextualInformation
|
|
|
|
.EXAMPLE
|
|
Get-GitHubUserContextualInformation -User octocat
|
|
|
|
.EXAMPLE
|
|
Get-GitHubUserContextualInformation -User octocat -RepositoryId 1300192
|
|
|
|
.EXAMPLE
|
|
$repo = Get-GitHubRepository -OwnerName microsoft -RepositoryName 'PowerShellForGitHub'
|
|
$repo | Get-GitHubUserContextualInformation -User octocat
|
|
|
|
.EXAMPLE
|
|
Get-GitHubIssue -OwnerName microsoft -RepositoryName PowerShellForGitHub -Issue 70 |
|
|
Get-GitHubUserContextualInformation -User octocat
|
|
#>
|
|
[CmdletBinding(DefaultParameterSetName = 'NoContext')]
|
|
[OutputType({$script:GitHubUserContextualInformationTypeName})]
|
|
param(
|
|
[Parameter(
|
|
Mandatory,
|
|
ValueFromPipeline,
|
|
ValueFromPipelineByPropertyName)]
|
|
[Alias('Name')]
|
|
[Alias('User')]
|
|
[string] $UserName,
|
|
|
|
[Parameter(
|
|
Mandatory,
|
|
ValueFromPipelineByPropertyName,
|
|
ParameterSetName='Organization')]
|
|
[int64] $OrganizationId,
|
|
|
|
[Parameter(
|
|
Mandatory,
|
|
ValueFromPipelineByPropertyName,
|
|
ParameterSetName='Repository')]
|
|
[int64] $RepositoryId,
|
|
|
|
[Parameter(
|
|
Mandatory,
|
|
ValueFromPipelineByPropertyName,
|
|
ParameterSetName='Issue')]
|
|
[int64] $IssueId,
|
|
|
|
[Parameter(
|
|
Mandatory,
|
|
ValueFromPipelineByPropertyName,
|
|
ParameterSetName='PullRequest')]
|
|
[int64] $PullRequestId,
|
|
|
|
[string] $AccessToken
|
|
)
|
|
|
|
Write-InvocationLog
|
|
|
|
$getParams = @()
|
|
|
|
$contextType = [String]::Empty
|
|
$contextId = 0
|
|
if ($PSCmdlet.ParameterSetName -ne 'NoContext')
|
|
{
|
|
if ($PSCmdlet.ParameterSetName -eq 'Organization')
|
|
{
|
|
$getParams += 'subject_type=organization'
|
|
$getParams += "subject_id=$OrganizationId"
|
|
|
|
$contextType = 'OrganizationId'
|
|
$contextId = $OrganizationId
|
|
}
|
|
elseif ($PSCmdlet.ParameterSetName -eq 'Repository')
|
|
{
|
|
$getParams += 'subject_type=repository'
|
|
$getParams += "subject_id=$RepositoryId"
|
|
|
|
$contextType = 'RepositoryId'
|
|
$contextId = $RepositoryId
|
|
}
|
|
elseif ($PSCmdlet.ParameterSetName -eq 'Issue')
|
|
{
|
|
$getParams += 'subject_type=issue'
|
|
$getParams += "subject_id=$IssueId"
|
|
|
|
$contextType = 'IssueId'
|
|
$contextId = $IssueId
|
|
}
|
|
elseif ($PSCmdlet.ParameterSetName -eq 'PullRequest')
|
|
{
|
|
$getParams += 'subject_type=pull_request'
|
|
$getParams += "subject_id=$PullRequestId"
|
|
|
|
$contextType = 'PullRequestId'
|
|
$contextId = $PullRequestId
|
|
}
|
|
}
|
|
|
|
$params = @{
|
|
'UriFragment' = "users/$UserName/hovercard`?" + ($getParams -join '&')
|
|
'Method' = 'Get'
|
|
'Description' = "Getting hovercard information for $UserName"
|
|
'AcceptHeader' = $script:hagarAcceptHeader
|
|
'AccessToken' = $AccessToken
|
|
'TelemetryEventName' = $MyInvocation.MyCommand.Name
|
|
}
|
|
|
|
$result = Invoke-GHRestMethod @params
|
|
foreach ($item in $result.contexts)
|
|
{
|
|
$item.PSObject.TypeNames.Insert(0, $script:GitHubUserContextualInformationTypeName)
|
|
|
|
if (-not (Get-GitHubConfiguration -Name DisablePipelineSupport))
|
|
{
|
|
Add-Member -InputObject $item -Name 'UserName' -Value $UserName -MemberType NoteProperty -Force
|
|
if ($PSCmdlet.ParameterSetName -ne 'NoContext')
|
|
{
|
|
Add-Member -InputObject $item -Name $contextType -Value $contextId -MemberType NoteProperty -Force
|
|
}
|
|
}
|
|
}
|
|
|
|
return $result
|
|
}
|
|
|
|
function Set-GitHubProfile
|
|
{
|
|
<#
|
|
.SYNOPSIS
|
|
Updates profile information for the current authenticated user on GitHub.
|
|
|
|
.DESCRIPTION
|
|
Updates profile information for the current authenticated user on GitHub.
|
|
|
|
The Git repo for this module can be found here: http://aka.ms/PowerShellForGitHub
|
|
|
|
.PARAMETER Name
|
|
The new name of the user.
|
|
|
|
.PARAMETER Email
|
|
The publicly visible email address of the user.
|
|
|
|
.PARAMETER Blog
|
|
The new blog URL of the user.
|
|
|
|
.PARAMETER Company
|
|
The new company of the user.
|
|
|
|
.PARAMETER Location
|
|
The new location of the user.
|
|
|
|
.PARAMETER Bio
|
|
The new short biography of the user.
|
|
|
|
.PARAMETER Hireable
|
|
Specify to indicate a change in hireable availability for the current authenticated user's
|
|
GitHub profile. To change to "not hireable", specify -Hireable:$false
|
|
|
|
.PARAMETER PassThru
|
|
Returns the updated User Profile. By default, this cmdlet does not generate any output.
|
|
You can use "Set-GitHubConfiguration -DefaultPassThru" to control the default behavior
|
|
of this switch.
|
|
|
|
.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.
|
|
|
|
.OUTPUTS
|
|
GitHub.User
|
|
|
|
.EXAMPLE
|
|
Set-GitHubProfile -Location 'Seattle, WA' -Hireable:$false
|
|
|
|
Updates the current user to indicate that their location is "Seattle, WA" and that they
|
|
are not currently hireable.
|
|
#>
|
|
[CmdletBinding(SupportsShouldProcess)]
|
|
[OutputType({$script:GitHubUserTypeName})]
|
|
[Alias('Update-GitHubCurrentUser')] # Non-standard usage of the Update verb, but done to avoid a breaking change post 0.14.0
|
|
param(
|
|
[string] $Name,
|
|
|
|
[string] $Email,
|
|
|
|
[string] $Blog,
|
|
|
|
[string] $Company,
|
|
|
|
[string] $Location,
|
|
|
|
[string] $Bio,
|
|
|
|
[switch] $Hireable,
|
|
|
|
[switch] $PassThru,
|
|
|
|
[string] $AccessToken
|
|
)
|
|
|
|
Write-InvocationLog
|
|
|
|
$hashBody = @{}
|
|
if ($PSBoundParameters.ContainsKey('Name')) { $hashBody['name'] = $Name }
|
|
if ($PSBoundParameters.ContainsKey('Email')) { $hashBody['email'] = $Email }
|
|
if ($PSBoundParameters.ContainsKey('Blog')) { $hashBody['blog'] = $Blog }
|
|
if ($PSBoundParameters.ContainsKey('Company')) { $hashBody['company'] = $Company }
|
|
if ($PSBoundParameters.ContainsKey('Location')) { $hashBody['location'] = $Location }
|
|
if ($PSBoundParameters.ContainsKey('Bio')) { $hashBody['bio'] = $Bio }
|
|
if ($PSBoundParameters.ContainsKey('Hireable')) { $hashBody['hireable'] = $Hireable.ToBool() }
|
|
|
|
if (-not $PSCmdlet.ShouldProcess('Update Current GitHub User'))
|
|
{
|
|
return
|
|
}
|
|
|
|
$params = @{
|
|
'UriFragment' = 'user'
|
|
'Method' = 'Patch'
|
|
'Body' = (ConvertTo-Json -InputObject $hashBody)
|
|
'Description' = "Updating current authenticated user"
|
|
'AccessToken' = $AccessToken
|
|
'TelemetryEventName' = $MyInvocation.MyCommand.Name
|
|
}
|
|
|
|
$result = (Invoke-GHRestMethod @params | Add-GitHubUserAdditionalProperties)
|
|
if (Resolve-ParameterWithDefaultConfigurationValue -Name PassThru -ConfigValueName DefaultPassThru)
|
|
{
|
|
return $result
|
|
}
|
|
}
|
|
|
|
filter Add-GitHubUserAdditionalProperties
|
|
{
|
|
<#
|
|
.SYNOPSIS
|
|
Adds type name and additional properties to ease pipelining to GitHub User objects.
|
|
|
|
.PARAMETER InputObject
|
|
The GitHub object to add additional properties to.
|
|
|
|
.PARAMETER TypeName
|
|
The type that should be assigned to the object.
|
|
|
|
.PARAMETER Name
|
|
The name of the user. This information might be obtainable from InputObject, so this
|
|
is optional based on what InputObject contains.
|
|
|
|
.PARAMETER Id
|
|
The ID of the user. This information might be obtainable from InputObject, so this
|
|
is optional based on what InputObject contains.
|
|
|
|
.INPUTS
|
|
[PSCustomObject]
|
|
|
|
.OUTPUTS
|
|
GitHub.User
|
|
#>
|
|
[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:GitHubUserTypeName,
|
|
|
|
[string] $Name,
|
|
|
|
[int64] $Id
|
|
)
|
|
|
|
foreach ($item in $InputObject)
|
|
{
|
|
$item.PSObject.TypeNames.Insert(0, $TypeName)
|
|
|
|
if (-not (Get-GitHubConfiguration -Name DisablePipelineSupport))
|
|
{
|
|
$userName = $item.login
|
|
if ([String]::IsNullOrEmpty($userName) -and $PSBoundParameters.ContainsKey('Name'))
|
|
{
|
|
$userName = $Name
|
|
}
|
|
|
|
if (-not [String]::IsNullOrEmpty($userName))
|
|
{
|
|
Add-Member -InputObject $item -Name 'UserName' -Value $userName -MemberType NoteProperty -Force
|
|
}
|
|
|
|
$userId = $item.id
|
|
if (($userId -eq 0) -and $PSBoundParameters.ContainsKey('Id'))
|
|
{
|
|
$userId = $Id
|
|
}
|
|
|
|
if ($userId -ne 0)
|
|
{
|
|
Add-Member -InputObject $item -Name 'UserId' -Value $userId -MemberType NoteProperty -Force
|
|
}
|
|
}
|
|
|
|
Write-Output $item
|
|
}
|
|
}
|