Skip to content

Instantly share code, notes, and snippets.

@mindw
Last active October 8, 2018 08:24
Show Gist options
  • Select an option

  • Save mindw/81f6df3ea78c7f8c787b066ac29f3d77 to your computer and use it in GitHub Desktop.

Select an option

Save mindw/81f6df3ea78c7f8c787b066ac29f3d77 to your computer and use it in GitHub Desktop.
A poor man's sibbel replacement.
# python 3.6
# github3.py > 1.1.0
# developer token must have the repo & user outh2 scopes!
import github3
from github3 import login
from github3.git import Tag
from urllib.parse import urlparse
from pathlib import Path
import datetime
import dateutil.parser
import sys
# import itertools
# import logging
# __gh_logger__ = logging.getLogger('github3')
#
# stream_handler = logging.StreamHandler(sys.stdout)
# __gh_logger__.addHandler(stream_handler)
# __gh_logger__.setLevel(logging.INFO)
def get_tags(repo):
for t in repo.tags():
git_commit = repo.git_commit(t.commit.sha)
# git_commit = repo.git_commit(t.commit['sha'])
commit_date = dateutil.parser.parse(git_commit.committer['date'])
yield t.name, commit_date
def get_releases(repo):
for rel in repo.releases():
yield rel.tag_name, rel.published_at
def get_decorated_tags(repo):
for ref in repo.refs(subspace='tags'):
sha = ref.object.sha
try:
t = ref.tag(sha)
yield t.tag, dateutil.parser.parse(t.tagger['date'])
except github3.exceptions.NotFoundError:
pass
def get_tags_since(repo, start_date, end_date):
for t in repo.tags():
git_commit = repo.git_commit(t.commit.sha)
commit_date = dateutil.parser.parse(git_commit.committer['date'])
if start_date < commit_date <= end_date:
yield t.name, commit_date
else:
# print('get_tags_since:', git_commit.ratelimit_remaining)
break
def get_releases_since(repo, start_date, end_date):
try:
for rel in repo.releases():
if start_date < rel.published_at <= end_date:
yield rel.tag_name, rel.published_at
else:
# print('get_releases_since:', rel.ratelimit_remaining)
break
except github3.exceptions.ServerError as e:
print(f'{repo.name} - {e}')
def get_decorated_tags_since(repo, start_date, end_date):
try:
refs = list(repo.refs(subspace='tags'))
except github3.exceptions.NotFoundError:
return
refs.reverse()
for ref in refs:
sha = ref.object.sha
try:
if ref.object.type == 'commit':
commit = repo.git_commit(sha)
date = dateutil.parser.parse(commit.committer['date'])
path = urlparse(ref.url).path
name = path.split('/')[-1]
# print('commit ', end='')
else:
t = repo.tag(sha)
date = dateutil.parser.parse(t.tagger['date'])
name = t.tag
# print('tag ', end='')
# print(name, date)
if start_date < date <= end_date:
yield name, date
else:
break
except github3.exceptions.NotFoundError:
pass
# print('get_decorated_tags_since:', ref.ratelimit_remaining)
def print_repo_tags_since(repo, start_date, end_date):
# print(repo.name, repo.ratelimit_remaining)
rels = list(get_releases_since(repo, start_date, end_date))
tags = list(get_tags_since(repo, start_date, end_date))
decorated_tags = list(get_decorated_tags_since(repo, start_date, end_date))
# all_ = dict(tags + rels)
all_ = dict(tags + decorated_tags + rels)
# all_ = dict(decorated_tags + rels)
if all_:
print('%s %s:' % (repo, repo.html_url + '/releases'))
for e in all_.items():
print(' %s at %s' % e)
# r = gh.repository('kubernetes', 'heapster')
# r = gh.repository('ksonnet', 'kubecfg')
# releases = get_decorated_tags_since(r, end - last_check, end)
# for t in get_decorated_tags(r):
# print(' %s at %s' % t)
#i = r.refs(subspace='tags')
#first = next(i)
#print(first.last_url)
#first = next(i)
#print(i.last_url)
# for ref in r.refs(subspace='tags'):
# sha = ref.object.sha
# try:
# t = r.tag(sha)
# print(t.tag, t.tagger['date'])
# except github3.exceptions.NotFoundError:
# pass
# for t in get_tags(r):
# print(' %s at %s' % t)
#
# for t in get_releases(r):
# print(' %s at %s' % t)
#
# sys.exit()
# r = gh.repository('elastic', 'elasticsearch')
# r = gh.repository('git-for-windows', 'git')
# r = gh.repository('ksonnet', 'kubecfg')
# r = gh.repository('curl', 'curl')
# print('%s %s:' % (r, r.html_url + '/releases'))
# for t in get_decorated_tags_since(r, end - last_check, end):
# print(' %s at %s' % t)
#
# print_repo_tags_since(r, end - last_check, end)
# for rel in releases:
# print(rel)
# sys.exit()
#r = gh.repository('git-for-windows', 'git')
#list_newer_tags_in_repo('ARMmbed', 'paas', now - week)
#latest_release_in_repo('kubernetes', 'kubernetes')
#latest_release_in_repo('ARMmbed', 'paas')
def dump_repo():
gh, user = setup()
r = gh.repository('kubernetes', 'heapster')
tags = list(r.tags())
print(tags)
def print_all_since():
# week = datetime.timedelta(days=7)
# two_week = datetime.timedelta(days=14)
last_check = datetime.timedelta(days=1.1)
end = datetime.datetime.now(datetime.timezone.utc)
# end -= datetime.timedelta(days=2)
# end = end - datetime.timedelta(days=1.0)
print(end)
print(end - last_check)
gh, user = setup()
for i, starred in enumerate(user.starred_repositories()):
print_repo_tags_since(starred.repo, end - last_check, end)
CACHE_DIR = 'sybil_cache'
def setup():
github_token = 'XXX'
# github_user = 'mindw'
gh = login(token=github_token)
# Path(CACHE_DIR).mkdir(exist_ok=True)
user = gh.me()
return gh, user
def main():
# dump_repo()
print_all_since()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment