Skip to content

Commit

Permalink
Adding Get Repository.Contents functionality (#146)
Browse files Browse the repository at this point in the history
Adds `Get-GitHubContent` and corresponding tests.

Also adds formatting files for VS Code and EditorConfig.
  • Loading branch information
Shazwazza authored Apr 3, 2020
1 parent e07d3fa commit 9a45908
Show file tree
Hide file tree
Showing 8 changed files with 365 additions and 14 deletions.
8 changes: 8 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# editorconfig.org

# top-most EditorConfig file
root = true

[*]

trim_trailing_whitespace = true
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"[powershell]": {
"files.trimTrailingWhitespace": true
},
"powershell.codeFormatting.openBraceOnSameLine": false,
"powershell.codeFormatting.alignPropertyValuePairs": false
}
6 changes: 3 additions & 3 deletions GitHubComments.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ function Get-GitHubComment
'UriFragment' = $uriFragment
'Description' = $description
'AccessToken' = $AccessToken
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $squirrelAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $squirrelAcceptHeader)
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus)
Expand Down Expand Up @@ -292,7 +292,7 @@ function New-GitHubComment
'Method' = 'Post'
'Description' = "Creating comment under issue $Issue for $RepositoryName"
'AccessToken' = $AccessToken
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $squirrelAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $squirrelAcceptHeader)
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus)
Expand Down Expand Up @@ -403,7 +403,7 @@ function Set-GitHubComment
'Method' = 'Patch'
'Description' = "Update comment $CommentID for $RepositoryName"
'AccessToken' = $AccessToken
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $squirrelAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $squirrelAcceptHeader)
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus)
Expand Down
145 changes: 145 additions & 0 deletions GitHubContents.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
function Get-GitHubContent
{
<#
.SYNOPSIS
Retrieve the contents of a file or directory in a repository on GitHub.
.DESCRIPTION
Retrieve content from files on GitHub.
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 Path
The file path for which to retrieve contents
.PARAMETER MediaType
The format in which the API will return the body of the issue.
Object - Return a json object representation a file or folder. This is the default if you do not pass any specific media type.
Raw - Return the raw contents of a file.
Html - For markup files such as Markdown or AsciiDoc, you can retrieve the rendered HTML using the Html media type.
.PARAMETER ResultAsString
If this switch is specified and the MediaType is either Raw or Html then the resulting bytes will be decoded the result will be
returned as a string instead of bytes. If the MediaType is Object, then an additional property on the object is returned 'contentAsString'
which will be the decoded base64 result as a string.
.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
Get-GitHubContent -OwnerName microsoft -RepositoryName PowerShellForGitHub -Path README.md -MediaType Html
Get the Html output for the README.md file
.EXAMPLE
Get-GitHubContent -OwnerName microsoft -RepositoryName PowerShellForGitHub -Path LICENSE
Get the Binary file output for the LICENSE file
.EXAMPLE
Get-GitHubContent -OwnerName microsoft -RepositoryName PowerShellForGitHub -Path Tests
List the files within the "Tests" path of the repository
#>
[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,

[string] $Path,

[ValidateSet('Raw', 'Html', 'Object')]
[string] $MediaType = 'Object',

[switch] $ResultAsString,

[string] $AccessToken,

[switch] $NoStatus
)

Write-InvocationLog

$elements = Resolve-RepositoryElements -DisableValidation
$OwnerName = $elements.ownerName
$RepositoryName = $elements.repositoryName

$telemetryProperties = @{
'OwnerName' = (Get-PiiSafeString -PlainText $OwnerName)
'RepositoryName' = (Get-PiiSafeString -PlainText $RepositoryName)
}

$description = [String]::Empty

$uriFragment = "/repos/$OwnerName/$RepositoryName/contents"

if ($PSBoundParameters.ContainsKey('Path'))
{
$Path = $Path.TrimStart("\", "/")
$uriFragment += "/$Path"
$description = "Getting content for $Path in $RepositoryName"
}
else
{
$description = "Getting all content for in $RepositoryName"
}

$params = @{
'UriFragment' = $uriFragment
'Description' = $description
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType)
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
'NoStatus' = (Resolve-ParameterWithDefaultConfigurationValue -Name NoStatus -ConfigValueName DefaultNoStatus)
}

$result = Invoke-GHRestMethodMultipleResult @params

if ($ResultAsString)
{
if ($MediaType -eq 'Raw' -or $MediaType -eq 'Html')
{
# Decode bytes to string
$result = [System.Text.Encoding]::UTF8.GetString($result)
}
elseif ($MediaType -eq 'Object')
{
# Convert from base64
$decoded = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($result.content))
Add-Member -InputObject $result -NotePropertyName "contentAsString" -NotePropertyValue $decoded
}
}

return $result
}
29 changes: 21 additions & 8 deletions GitHubCore.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ function Invoke-GHRestMethod
# be coming from the Location header in a previous response. Either way, we don't want there
# to be a leading "/" or trailing '/'
if ($UriFragment.StartsWith('/')) { $UriFragment = $UriFragment.Substring(1) }
if ($UriFragment.EndsWIth('/')) { $UriFragment = $UriFragment.Substring(0, $UriFragment.Length - 1) }
if ($UriFragment.EndsWith('/')) { $UriFragment = $UriFragment.Substring(0, $UriFragment.Length - 1) }

if ([String]::IsNullOrEmpty($Description))
{
Expand Down Expand Up @@ -645,7 +645,8 @@ function Invoke-GHRestMethodMultipleResult

try
{
do {
do
{
$params = @{
'UriFragment' = $nextLink
'Method' = 'Get'
Expand Down Expand Up @@ -949,6 +950,10 @@ function Get-MediaAcceptHeader
Text - Return a text only representation of the markdown body. Response will include body_text.
Html - Return HTML rendered from the body's markdown. Response will include body_html.
Full - Return raw, text and HTML representations. Response will include body, body_text, and body_html.
Object - Return a json object representation a file or folder.
.PARAMETER AsJson
If this switch is specified as +json value is appended to the MediaType header.
.PARAMETER AcceptHeader
The accept header that should be included with the MediaType accept header.
Expand All @@ -960,16 +965,24 @@ function Get-MediaAcceptHeader
#>
[CmdletBinding()]
param(
[ValidateSet('Raw', 'Text', 'Html', 'Full')]
[ValidateSet('Raw', 'Text', 'Html', 'Full', 'Object')]
[string] $MediaType = 'Raw',

[Parameter(Mandatory)]
[switch] $AsJson,

[string] $AcceptHeader
)

$acceptHeaders = @(
$AcceptHeader,
"application/vnd.github.$mediaTypeVersion.$($MediaType.ToLower())+json")
$resultHeaders = "application/vnd.github.$mediaTypeVersion.$($MediaType.ToLower())"
if ($AsJson)
{
$resultHeaders = $resultHeaders + "+json"
}

if (-not [String]::IsNullOrEmpty($AcceptHeader))
{
$resultHeaders = "$AcceptHeader,$resultHeaders"
}

return ($acceptHeaders -join ',')
return $resultHeaders
}
6 changes: 3 additions & 3 deletions GitHubIssues.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ function Get-GitHubIssue
$params = @{
'UriFragment' = $uriFragment + '?' + ($getParams -join '&')
'Description' = $description
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $symmetraAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $symmetraAcceptHeader)
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
Expand Down Expand Up @@ -543,7 +543,7 @@ function New-GitHubIssue
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Post'
'Description' = "Creating new Issue ""$Title"" on $RepositoryName"
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $symmetraAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $symmetraAcceptHeader)
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
Expand Down Expand Up @@ -694,7 +694,7 @@ function Update-GitHubIssue
'Body' = (ConvertTo-Json -InputObject $hashBody)
'Method' = 'Patch'
'Description' = "Updating Issue #$Issue on $RepositoryName"
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AcceptHeader $symmetraAcceptHeader)
'AcceptHeader' = (Get-MediaAcceptHeader -MediaType $MediaType -AsJson -AcceptHeader $symmetraAcceptHeader)
'AccessToken' = $AccessToken
'TelemetryEventName' = $MyInvocation.MyCommand.Name
'TelemetryProperties' = $telemetryProperties
Expand Down
2 changes: 2 additions & 0 deletions PowerShellForGitHub.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
'GitHubBranches.ps1',
'GitHubCore.ps1',
'GitHubComments.ps1',
'GitHubContents.ps1',
'GitHubEvents.ps1',
'GitHubIssues.ps1',
'GitHubLabels.ps1',
Expand Down Expand Up @@ -55,6 +56,7 @@
'Get-GitHubCodeOfConduct',
'Get-GitHubComment',
'Get-GitHubConfiguration',
'Get-GitHubContent',
'Get-GitHubEmoji',
'Get-GitHubEvent',
'Get-GitHubGitIgnore',
Expand Down
Loading

0 comments on commit 9a45908

Please sign in to comment.