Skip to content

Instantly share code, notes, and snippets.

@SteveL-MSFT
Last active July 10, 2024 21:16
Show Gist options
  • Save SteveL-MSFT/cf203e5bae6bc5d9556bd6067b92199d to your computer and use it in GitHub Desktop.
Save SteveL-MSFT/cf203e5bae6bc5d9556bd6067b92199d to your computer and use it in GitHub Desktop.
param(
[parameter()]
[string]
$org = 'PowerShell'
)
# PowerShell Team members
$exclude = @(
'adityapatwardhan'
'alerickson'
'anamnavi'
'andyleejordan'
'anmenaga'
'daxian-dbw'
'JamesWTruher'
'maertendMSFT'
'mgreenegit'
'msftgits'
'sdwheeler'
'seeminglyscience'
'SteveL-MSFT'
'StevenBucher98'
'SydneyhSmith'
'tgauth'
'theJasonHelmick'
'TravisEz13'
'vthiebaut10'
)
function Query-GitHub($query) {
$body = @{query=$query} | ConvertTo-Json
$data = Invoke-RestMethod https://api.github.com/graphql -Authentication OAuth -Token (Get-Secret GitHub) -Body $body -Method Post
if ($null -ne $data.errors) {
$data.errors
throw $data.errors.message
}
$data.data
}
# first get all repositories for the org
$cursor = 'null'
$hasNextPage = $true
while ($hasNextPage) {
$repositoryQuery = @"
query {
organization(login: "$org") {
repositories(first: 100, after: $cursor) {
nodes {
name
id
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
"@
$repositoryData = Query-GitHub -query $repositoryQuery
$pageInfo = $repositoryData.organization.repositories.pageInfo
$hasNextPage = $pageInfo.hasNextPage -eq 'true'
$cursor = "`"$($pageInfo.endCursor)`""
foreach ($repo in $repositoryData.organization.repositories.nodes) {
Write-Progress -Activity "Repository: $($repo.name)"
$query = @"
query {
repository(owner: "$org", name: "$($repo.name)") {
collaborators {
edges {
permission
}
nodes {
login
name
company
}
}
}
}
"@
$data = Query-GitHub -query $query
$collaborators = $data.repository.collaborators
for ($i = 0; $i -lt $collaborators.nodes.count; $i++) {
$permission = $collaborators.edges[$i].permission
$user = $collaborators.nodes[$i]
if (@('ADMIN', 'MAINTAIN', 'WRITE') -contains $permission -and $exclude -notcontains $user.login) {
[pscustomobject]@{
name = $user.name
login = $user.login
company = $user.company
permission = $permission
repository = $repo.name
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment