Skip to content

Instantly share code, notes, and snippets.

@lurch
Created December 8, 2016 15:14
Show Gist options
  • Select an option

  • Save lurch/7fd7e5af3a315a1f12edc7201290d6a6 to your computer and use it in GitHub Desktop.

Select an option

Save lurch/7fd7e5af3a315a1f12edc7201290d6a6 to your computer and use it in GitHub Desktop.

Revisions

  1. lurch created this gist Dec 8, 2016.
    53 changes: 53 additions & 0 deletions download_all_releases.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    #!/usr/bin/env python
    from __future__ import print_function
    import requests
    import re
    import os

    github_project = 'resin-io/etcher'

    releases_url = 'https://github.com/' + github_project + '/releases'
    aws_url = 'https://resin-production-downloads.s3.amazonaws.com/etcher'

    def download_file(url, filename):
    if os.path.exists(filename):
    print("%s already exists, skipping" % filename)
    else:
    print("Downloading %s" % url)
    r = requests.get(url, stream=True)
    with open(filename+'.tmp', 'wb') as f:
    for chunk in r.iter_content(chunk_size=10240):
    if chunk:
    f.write(chunk)
    os.rename(filename+'.tmp', filename)

    def download_releases_from(url):
    current_release = None
    for line in requests.get(url).text.split('\n'):
    m = re.search('<a href="/%s/releases/tag/(.*?)">(.*?)</a>' % github_project, line)
    if m:
    assert m.group(1) == m.group(2)
    release = m.group(1)
    assert release[0] == 'v'
    current_release = release[1:]
    print("Found release %s" % release)
    if not os.path.exists(release):
    os.mkdir(release)
    for filename in (release + '.tar.gz', release + '.zip'):
    download_file('https://github.com/' + github_project + '/archive/' + filename, os.path.join(release, filename))
    m = re.search('<li><a href="(%s/(.*?)/(.*?))">(.*?)</a></li>' % re.escape(aws_url), line)
    if m:
    assert current_release is not None
    file_url = m.group(1)
    assert m.group(2) == current_release
    filename = m.group(3)
    assert m.group(4) == filename
    #print("Release: %s Filename: %s" % (current_release, filename))
    download_file(file_url, os.path.join(release, filename))
    m = re.search('<a href="(%s\?after=(.*?))" rel="nofollow">Next</a>' % releases_url, line)
    if m:
    next_url = m.group(1)
    assert m.group(2) == release
    download_releases_from(next_url)

    download_releases_from(releases_url)