Skip to content

Instantly share code, notes, and snippets.

@camillebaldock
Last active August 29, 2015 14:17
Show Gist options
  • Select an option

  • Save camillebaldock/1d4eedb3d6564b423bdd to your computer and use it in GitHub Desktop.

Select an option

Save camillebaldock/1d4eedb3d6564b423bdd to your computer and use it in GitHub Desktop.
Dashing GitHub forks to update widget

Description

A Dashing widget for displaying GitHub forks that need updating.

See a live demo here.

Usage

Setup the following environment variables:

  • GITHUB_USER
  • GITHUB_TOKEN: Create an application token
  • MANUAL_FORKS: comma-separated list of repos that are not flagged as forks in your GitHub repos but are actually a fork!

What do you mean manual fork?

For example my boxen repo is actually a fork of this repo (just a copy of their repo, not marked as a fork in GitHub). I am not planning on contributing my changes back to the parent repo since they are very specific to me, wanted to subscribe to any updates on our-boxen, and I occasionally choose to make it private if I'm experimenting with some settings.

Dependencies

octokit

Add it to your Dashing application's Gemfile:

gem 'octokit'

and run bundle install.

<li data-row="1" data-col="1" data-sizex="1" data-sizey="2">
<div data-id="forks" data-view="List" data-unordered="true" data-title="Forks to update" style="background-color:#DA81F5"></div>
</li>
require 'octokit'
def is_in_sync(client, parent, fork)
parent_commits = parent.rels[:commits].get.data
latest_parent_commit_date = parent_commits.first.commit.committer.date
latest_parent_commit_sha = parent_commits.first.sha
repo_commits = fork.rels[:commits].get.data
while repo_commits.last.commit.committer.date > latest_parent_commit_date do
repo_commits = client.last_response.rels[:next].get.data
end
repo_shas = repo_commits.map(&:sha)
repo_shas.index(latest_parent_commit_sha)
end
SCHEDULER.every "30m", first_in: 0 do
Octokit.auto_paginate = true
client = Octokit::Client.new(:access_token => ENV["GITHUB_TOKEN"])
number_prs = 0
repos = client.repositories(:user => ENV["GITHUB_USER"])
forks = repos.select do |repo|
repo.fork
end
out_of_date_forks = []
forks.each do |fork|
if fork.full_name.include?(ENV["GITHUB_USER"])
parent = client.repository("#{ENV["GITHUB_USER"]}/#{fork.name}").parent
unless is_in_sync(client, parent, fork)
out_of_date_forks << fork.name
end
end
end
manual_forks = ENV["MANUAL_FORKS"].split(";")
manual_forks.each do |manual_fork|
repos = manual_fork.split(",")
parent = client.repository(repos[0])
fork = client.repository(repos[1])
unless is_in_sync(client, parent, fork)
out_of_date_forks << fork.name
end
end
formatted_forks = {"items" => []}
out_of_date_forks.each do |out_of_date_fork|
hash = {"label" => out_of_date_fork}
formatted_forks["items"] << hash
end
send_event("forks", formatted_forks)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment