Skip to content

Instantly share code, notes, and snippets.

@realdubb
Forked from Hellowlol/whatthefork
Last active November 12, 2016 20:29
Show Gist options
  • Save realdubb/41db863b37898be863517817b52a5c32 to your computer and use it in GitHub Desktop.
Save realdubb/41db863b37898be863517817b52a5c32 to your computer and use it in GitHub Desktop.
Check all forked branches if they are ahead of master/self open in browser
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Dirty script to check if any forks in ahead of master and open that branch commitlist
Warning: Uses alot of api calls
"""
import requests
from requests.auth import HTTPBasicAuth
import json
import webbrowser
from math import ceil
import time
### My username and password ###
username = ''
password = ''
### Open a the commitlist on github if repo is a head of branch/master ###
openbrwser = False
### Github user and repo to check ###
usr = "styxit"
rpo = "HTPC-Manager"
### Placeholders ###
branches_ahead = 0
apicalls = 0
apicalls_left = 0
ahead_list = []
apicalls_reset = None
start_time = None
def behind_by(fork, latest, branch):
global usr
global openbrwser
global ahead_list
global branches_ahead
mrepo = "%s:master" % usr
try:
""" comparison example https://api.github.com/repos/rezn5447/silverspoon/compare/sachin:master...master
comparing fork rezn5447/silverspoon to sachin:silverspoon on branch master
"""
url = 'https://api.github.com/repos/%s/compare/%s:%s...%s' % (fork, usr, branch, branch)
result = fetch(url)
if result["message"] == "Not Found":
url = 'https://api.github.com/repos/%s/compare/%s...%s' % (fork, mrepo, branch)
result = fetch(url)
except:
pass
try:
if result["total_commits"] > 0 and result["ahead_by"] > 0:
branches_ahead += 1
curl = "https://github.com/%s/commits/%s" % (fork, branch)
print "Ahead", result["total_commits"], fork, branch, curl
d = {
"fork": fork,
"branch": branch,
"ahead": result["ahead_by"],
"url": curl
}
ahead_list.append(d)
if openbrwser:
webbrowser.open(curl, new=2, autoraise=False)
except:
pass
# Isnt used for anything
def latest_commit(fork, branch):
url = 'https://api.github.com/repos/%s/commits/%s' % (fork, branch)
lastest = fetch(url)
behind_by(fork, lastest, branch)
def findbranches(fork):
url = "https://api.github.com/repos/%s/branches" % fork
branches = fetch(url)
for branch in branches:
behind_by(fork, lastest, branch)
#latest_commit(fork, branch["name"])
def find_all_forks():
""" Finds all forks, check if the result is more then 30, follow links"""
global usr
global rpo
global apicalls
global apicalls_left
global ahead_list
global apicalls_reset
global start_time
start_time = time.time()
# Find all the repos of the user
url = "https://api.github.com/users/%s/repos" % usr
result = fetch(url)
# Try to find the correct repo
for r in result:
# Found correct repo
if r["name"] == rpo:
#Round up
pages = float(r["forks_count"])/ 30 # Results per page
pages_round = ceil(pages)
# make baseurl
baseurl = "https://api.github.com/repositories/%s/forks?page=" % r["id"]
for l in range(1, int(pages_round) + 1):
forks = fetch("%s%s" % (baseurl, l))
for fork in forks:
findbranches(fork["full_name"])
print "\n"
print "There was %s forks in total" % r["forks_count"]
print "There was %s branches ahead" % branches_ahead
print "%i apicalls left" % int(apicalls_left)
print "Api limit will reset in %s" % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(apicalls_reset)))
print '"Scan" took %s sec' % (time.time() - start_time)
print ahead_list
def fetch(url):
''' Used to connect to github api'''
global username
global password
global apicalls
global apicalls_left
global apicalls_reset
try:
#Github api req user-agent
headers = {'User-Agent': 'Mozilla/5.0'}
data = requests.get(url, auth=HTTPBasicAuth(username, password), timeout=15, headers=headers)
apicalls += 1
apicalls_left = data.headers["X-RateLimit-Remaining"]
apicalls_reset = data.headers["X-RateLimit-Reset"]
#print "%s sec" % (time.time() - start_time)
# data.json() returns a error
return json.loads(data.text)
except Exception as e:
print e, url
find_all_forks()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment