~aleteoryx/muditaos

844903ad7b93aa4ac1d2be40a4dc7c1ac2c1e231 — Radoslaw Wicik 5 years ago 65023ca
[EGD-5384] Download selected assets from releases

Allows easy downloading of assets in MuditaOS repository, where there
is multiple packages.
1 files changed, 43 insertions(+), 12 deletions(-)

M tools/download_asset.py
M tools/download_asset.py => tools/download_asset.py +43 -12
@@ 15,6 15,7 @@ import os
import requests
import sys
from tqdm import tqdm
import time


class Getter(object):


@@ 24,12 25,6 @@ class Getter(object):
        self.host = 'https://api.github.com/repos'
        self.organisation = 'mudita'
        self.repo = 'ecoboot'
        self.restPrefix = self.host
        self.restPrefix += '/'
        self.restPrefix += self.organisation
        self.restPrefix += '/'
        self.restPrefix += self.repo
        self.restPrefix += '/'
        self.apitoken = None
        self.ghLogin = None
        self.getGitRoot()


@@ 38,6 33,16 @@ class Getter(object):
        self.releases = []
        self.workdir = ""

    def genRestPrefix(self):
        self.restPrefix = self.host
        self.restPrefix += '/'
        self.restPrefix += self.organisation
        self.restPrefix += '/'
        self.restPrefix += self.repo
        self.restPrefix += '/'
        return self.restPrefix


    def getGitRoot(self):
        'Find git root directory'
        self.gitRepo = git.Repo(os.getcwd(), search_parent_directories=True)


@@ 78,7 83,8 @@ class Getter(object):
        self.args = args
        self.getGHLogin(args)
        self.getApiToken(args)
        request = self.restPrefix + "releases"
        request = self.genRestPrefix() + "releases"
        print ("Request:", request)
        headers = {'accept': 'application/vnd.github.v3+json'}
        page = 0
        itemsOnPage = 100


@@ 89,12 95,21 @@ class Getter(object):
            response = requests.get(request, auth=(self.ghLogin, self.apitoken), headers=headers, params=queryParams)
            if response.status_code != requests.codes.ok:
                print("download error:", response.status_code)
                print(response.content)
                print("content:", response.content)
                sys.exit(1)
            items = json.loads(response.content)
            count = len(items)
            self.releases += items
        self.releases.sort(key=lambda r: r['published_at'], reverse=True)
        drafts = []
        releases = []
        for item in self.releases:
            if item['published_at'] is None:
                drafts.append(item)
            else:
                releases.append(item)
        releases.sort(key=lambda r: r['published_at'], reverse=True)
        self.releases=drafts
        self.releases.extend(releases)

    def listReleases(self, args):
        self.getReleases(args)


@@ 106,7 121,8 @@ class Getter(object):
    def downloadRelease(self, args):
        print(sys._getframe().f_code.co_name)
        self.getReleases(args)
        print(args.tag)
        print("tag:", args.tag)
        print("asset:", args.asset)
        release = None
        if args.tag is None:
            release = self.releases[0]


@@ 119,7 135,19 @@ class Getter(object):
            print("No release with tag:", args.tag)
        print("release:", release['tag_name'])
        assets = release['assets']
        self.downloadAsset(assets[0])
        if len(assets) > 1 and args.asset is None:
            print("Available assets")
            i=0
            for asset in assets:
                print(i, asset['name'])
                i+=1
            print("Use `-a <number>` to select file")
            return
        if args.asset is not None:
            self.downloadAsset(assets[int(args.asset)])
        else:
            self.downloadAsset(assets[0])


    def downloadAsset(self, asset):
        self.createWorkdir()


@@ 131,8 159,10 @@ class Getter(object):
                                auth=(self.ghLogin, self.apitoken),
                                headers=headers,
                                stream=True)
        destination_file = self.args.workdir + "/" + asset['name']
        print("downloading to:", destination_file)
        progres_bar = tqdm(total=asset['size'], unit='iB', unit_scale=True)
        with open(self.args.workdir + "/" + asset['name'], 'wb') as fd:
        with open(destination_file, 'wb') as fd:
            for chunk in response.iter_content(chunk_size=1024):
                progres_bar.update(len(chunk))
                fd.write(chunk)


@@ 183,6 213,7 @@ def main():
                                             description="Download Release based on tag or the latest")
    getReleases_args.set_defaults(func=getter.downloadRelease)
    getReleases_args.add_argument('tag', help="Download release with selected tag", nargs='?')
    getReleases_args.add_argument('-a', '--asset', help="Asset name to download, use asset number")

    args = parser.parse_args()
    getter.repo = args.repository