Skip to content

Instantly share code, notes, and snippets.

@raphink
Last active December 25, 2015 16:49
Show Gist options
  • Save raphink/7009117 to your computer and use it in GitHub Desktop.
Save raphink/7009117 to your computer and use it in GitHub Desktop.
Lists forked Puppet modules. Require 'octokit' and 'netrc' gems.
<html>
<head>
<script src="base64.js"></script>
<script src="underscore-min.js"></script>
<script src="github.js"></script>
<script language="JavaScript">
var github = new Github({
username: "user",
password: "pass"
})
var user = github.getUser();
var org = 'camptocamp'
var repositories = {};
user.orgRepos(org, listRepos)
function listRepos(err, repos) {
for (var i=0; i<repos.length; i++) {
var name = repos[i].name;
if (! name.match(/^puppet-/)) continue;
var r = github.getRepo(org, name);
//console.log(r);
repositories[name] = {};
repositories[name]['repo'] = r;
r.show(showRepo);
}
}
function showRepo(err, repo) {
if (repo.fork) {
var p = repo.parent
var pOwner = p.owner.login
repositories[repo.name]['parent'] = p
r = repositories[repo.name]['repo']
r.compare(pOwner+':master', 'master', function(err, diff) {
if (! err) {
console.log(repo.name + ':' + diff.status);
}
});
}
}
</script>
</head>
<body>
</body>
</html>
#!/usr/bin/env ruby
require 'octokit'
# Set organization
org = 'camptocamp'
# Filter on repositories named "puppet-*"
filter = /^puppet-/
Octokit.auto_paginate = true
# Use ~/.netrc to authenticate
client = Octokit::Client.new(:netrc => true)
repos = {
:behind => [],
:ahead => [],
:diverged => [],
:identical => [],
:notfound => [],
:original => [],
:unknown => []
}
client.org_repos(org).each do |r|
next unless r.name =~ filter
rr = client.repository("#{org}/#{r.name}")
status = 'unknown'
comp = nil
parent = nil
if parent = rr.parent
begin
comp = client.compare("#{org}/#{rr.name}", "#{parent.owner.login}:master", "#{org}:master")
priv = rr.private ? ', private' : ''
case comp.status
when 'behind'
msg = "#{comp.status} (by #{comp.behind_by} commits#{priv})"
when 'ahead'
msg = "#{comp.status} (by #{comp.ahead_by} commits#{priv})"
when 'diverged'
msg = "#{comp.status} (#{comp.behind_by} behind and #{comp.ahead_by} ahead#{priv})"
else
msg = comp.status
end
status = comp.status
rescue Octokit::NotFound
priv = rr.private ? ' (private)' : ''
msg = "NOT FOUND#{priv}"
status = "notfound"
end
else
priv = rr.private ? ' (private)' : ''
status = 'original'
msg = "not forked#{priv}"
end
repo = { :repository => rr, :parent => parent, :compare => comp, :msg => msg }
repos[status.to_sym] << repo
end
puts "# Forked\n"
[:diverged, :ahead, :behind, :identical].each do |s|
puts "## #{s}\n"
repos[s].sort_by { |r| r[:compare].total_commits }.reverse.each do |r|
name = r[:repository].name
parent = r[:parent]
msg = r[:msg]
puts "- #{name} (forked from #{parent.owner.login}/#{parent.name}): #{msg}"
end
puts "\n"
end
puts "# Not forked\n"
[:notfound, :original].each do |s|
puts "## #{s}\n"
repos[s].each do |r|
name = r[:repository].name
msg = r[:msg]
puts "- #{name}: #{msg}"
end
puts "\n"
end
puts "# Unknown\n"
repos[:unknown].each do |r|
name = r[:repository].name
msg = r[:msg]
puts "- #{name}: #{msg}"
puts "\n"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment