|
|
|
#!/usr/bin/env python3
|
|
|
|
# (re)uploads reseed file to github repository releases as an asset
|
|
|
|
import requests
|
|
|
|
|
|
|
|
from urllib.parse import urljoin
|
|
|
|
from mimetypes import guess_type
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
|
|
|
|
from pyseeder.utils import TransportException
|
|
|
|
|
|
|
|
TRANSPORT_NAME = "github"
|
|
|
|
|
|
|
|
def run(filename, config):
|
|
|
|
API_URL = "https://api.github.com/"
|
|
|
|
asset_name = os.path.split(filename)[-1]
|
|
|
|
content_type = guess_type(asset_name)[0] or "application/zip"
|
|
|
|
creds = (config["username"], config["token"])
|
|
|
|
release_info_url = urljoin(API_URL, "/repos/{}/releases/tags/{}".format(
|
|
|
|
config["repo"], config["release_tag"]))
|
|
|
|
|
|
|
|
# get release info
|
|
|
|
try:
|
|
|
|
release = requests.get(release_info_url, auth=creds)
|
|
|
|
except:
|
|
|
|
raise TransportException("Failed to connect to GitHub API")
|
|
|
|
|
|
|
|
if release.status_code is not 200:
|
|
|
|
raise TransportException("Check your GitHub API auth settings")
|
|
|
|
|
|
|
|
# fetch release assets
|
|
|
|
try:
|
|
|
|
assets = requests.get(release.json()["assets_url"], auth=creds)
|
|
|
|
except:
|
|
|
|
raise TransportException("Unable get release assets")
|
|
|
|
|
|
|
|
# delete old asset
|
|
|
|
for x in assets.json():
|
|
|
|
if x["name"] == asset_name:
|
|
|
|
r = requests.delete(x["url"], auth=creds)
|
|
|
|
if r.status_code is not 204:
|
|
|
|
raise TransportException("Failed to delete asset from GitHub")
|
|
|
|
|
|
|
|
# upload new asset
|
|
|
|
upload_url = release.json()["upload_url"].split("{")[0] # wat
|
|
|
|
headers = {'Content-Type': content_type}
|
|
|
|
params = {'name': asset_name}
|
|
|
|
|
|
|
|
data = open(filename, 'rb').read()
|
|
|
|
r = requests.post(upload_url, headers=headers, params=params, auth=creds,
|
|
|
|
data=data)
|
|
|
|
|
|
|
|
if r.status_code is not 201:
|
|
|
|
raise TransportException("Failed to upload asset to GitHub API : code %d" % (r.status_code))
|
|
|
|
|