-
Notifications
You must be signed in to change notification settings - Fork 187
/
GitHubContents.ps1
145 lines (113 loc) · 5.24 KB
/
GitHubContents.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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
}