Skip to content

Instantly share code, notes, and snippets.

@akm
Created February 1, 2016 09:06
Show Gist options
  • Save akm/e7b0676792ec6ebcb0c4 to your computer and use it in GitHub Desktop.
Save akm/e7b0676792ec6ebcb0c4 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# https://developer.github.com/v3/auth/#working-with-two-factor-authentication
# https://developer.github.com/v3/orgs/teams/
require 'json'
require 'httpclient'
class GithubRepoMatrix
attr_reader :org, :user, :token, :domain
def initialize
@org = ENV['ORG']
@user = ENV['GITHUB_USER']
@token = ENV['GITHUB_ACCESS_TOKEN']
@domain = "https://api.github.com"
end
def curl_options
@curl_options ||= "-s -u #{user}:#{token}"
end
def teams
load_teams
@teams
end
attr_reader :owners_team, :owners_members, :owners_members_logins
def load_teams
unless @teams
@teams = json_get("#{domain}/orgs/#{org}/teams")
@owners_team = @teams.detect{|t| t["name"] == "Owners"}
@owners_members = json_get(owners_team['members_url'])
@owners_members_logins = owners_members.map{|m| m['login'] }
@teams.delete(@owners_team)
end
end
def json_get(url)
url.sub!(/\{.+?\}\z/, '')
puts "Sending GET #{url}"
res = `curl #{curl_options} "#{url}"`
# puts "res: #{res}"
# case res.status
# when 200 then return JSON.parse(res.body)
# else raise "Something wrong: #{res.inspect}"
# end
JSON.parse(res)
end
def run
member_attrs = {}
member_repos = {}
teams.each do |team|
json_get(team['members_url']).
reject{|m| owners_members_logins.include?(m['login']) }.each do |m|
login = m['login']
member_attrs[login] ||= {}
member_attrs[login][:teams] ||= []
member_attrs[login][:teams] << team['name']
member_attrs[login][:url] = "https://github.com/orgs/#{org}/people/#{login}"
member_repos[login] ||= json_get(team['repositories_url']).map{|r| r['name'] }
end
end
repos = member_repos.values.flatten.compact.uniq.sort
puts( (%w[user check url teams] + repos).join("\t"))
member_attrs.each do |member, attrs|
repo_assigns = repos.map{|r| member_repos[member].include?(r) ? "T" : "-"}
puts(([member, "?", attrs[:url], attrs[:teams].join(",")] + repo_assigns).join("\t"))
end
end
end
GithubRepoMatrix.new.run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment