Blame tools/daca2-download.py

Packit 2035a7
#!/usr/bin/env python
Packit 2035a7
#
Packit 2035a7
# Downloads all daca2 source code packages.
Packit 2035a7
#
Packit 2035a7
# Usage:
Packit 2035a7
# $ mkdir ~/daca2-packages && python daca2-download.py
Packit 2035a7
Packit 2035a7
Packit 2035a7
import subprocess
Packit 2035a7
import sys
Packit 2035a7
import shutil
Packit 2035a7
import glob
Packit 2035a7
import os
Packit 2035a7
import time
Packit 2035a7
Packit 2035a7
DEBIAN = ('ftp://ftp.se.debian.org/debian/',
Packit 2035a7
          'ftp://ftp.debian.org/debian/')
Packit 2035a7
Packit 2035a7
Packit 2035a7
def wget(filepath):
Packit 2035a7
    filename = filepath
Packit 2035a7
    if '/' in filepath:
Packit 2035a7
        filename = filename[filename.rfind('/') + 1:]
Packit 2035a7
    for d in DEBIAN:
Packit 2035a7
        subprocess.call(
Packit 2035a7
            ['nice', 'wget', '--tries=10', '--timeout=300', '-O', filename, d + filepath])
Packit 2035a7
        if os.path.isfile(filename):
Packit 2035a7
            return True
Packit 2035a7
        print('Sleep for 10 seconds..')
Packit 2035a7
        time.sleep(10)
Packit 2035a7
    return False
Packit 2035a7
Packit 2035a7
Packit 2035a7
def getpackages():
Packit 2035a7
    if not wget('ls-lR.gz'):
Packit 2035a7
        return []
Packit 2035a7
    subprocess.call(['nice', 'gunzip', 'ls-lR.gz'])
Packit 2035a7
    f = open('ls-lR', 'rt')
Packit 2035a7
    lines = f.readlines()
Packit 2035a7
    f.close()
Packit 2035a7
    subprocess.call(['rm', 'ls-lR'])
Packit 2035a7
Packit 2035a7
    path = None
Packit 2035a7
    archives = []
Packit 2035a7
    filename = None
Packit 2035a7
    for line in lines:
Packit 2035a7
        line = line.strip()
Packit 2035a7
        if len(line) < 4:
Packit 2035a7
            if filename:
Packit 2035a7
                archives.append(path + '/' + filename)
Packit 2035a7
            path = None
Packit 2035a7
            filename = None
Packit 2035a7
        elif line[:12] == './pool/main/':
Packit 2035a7
            path = line[2:-1]
Packit 2035a7
        elif path and '.orig.tar.' in line:
Packit 2035a7
            filename = line[1 + line.rfind(' '):]
Packit 2035a7
Packit 2035a7
    for a in archives:
Packit 2035a7
        print(a)
Packit 2035a7
Packit 2035a7
    return archives
Packit 2035a7
Packit 2035a7
Packit 2035a7
def handleRemoveReadonly(func, path, exc):
Packit 2035a7
    import stat
Packit 2035a7
    if not os.access(path, os.W_OK):
Packit 2035a7
        # Is the error an access error ?
Packit 2035a7
        os.chmod(path, stat.S_IWUSR)
Packit 2035a7
        func(path)
Packit 2035a7
Packit 2035a7
Packit 2035a7
def removeAll():
Packit 2035a7
    count = 5
Packit 2035a7
    while count > 0:
Packit 2035a7
        count -= 1
Packit 2035a7
Packit 2035a7
        filenames = []
Packit 2035a7
        filenames.extend(glob.glob('[#_A-Za-z0-9]*'))
Packit 2035a7
        filenames.extend(glob.glob('.[A-Za-z]*'))
Packit 2035a7
Packit 2035a7
        try:
Packit 2035a7
            for filename in filenames:
Packit 2035a7
                if os.path.isdir(filename):
Packit 2035a7
                    shutil.rmtree(filename, onerror=handleRemoveReadonly)
Packit 2035a7
                else:
Packit 2035a7
                    os.remove(filename)
Packit 2035a7
        except WindowsError as err:
Packit 2035a7
            time.sleep(30)
Packit 2035a7
            if count == 0:
Packit 2035a7
                print('Failed to cleanup files/folders')
Packit 2035a7
                print(err)
Packit 2035a7
                sys.exit(1)
Packit 2035a7
            continue
Packit 2035a7
        except OSError as err:
Packit 2035a7
            time.sleep(30)
Packit 2035a7
            if count == 0:
Packit 2035a7
                print('Failed to cleanup files/folders')
Packit 2035a7
                print(err)
Packit 2035a7
                sys.exit(1)
Packit 2035a7
            continue
Packit 2035a7
        count = 0
Packit 2035a7
Packit 2035a7
Packit 2035a7
def removeLargeFiles(path):
Packit 2035a7
    for g in glob.glob(path + '*'):
Packit 2035a7
        if g == '.' or g == '..':
Packit 2035a7
            continue
Packit 2035a7
        if os.path.islink(g):
Packit 2035a7
            continue
Packit 2035a7
        if os.path.isdir(g):
Packit 2035a7
            removeLargeFiles(g + '/')
Packit 2035a7
        elif os.path.isfile(g):
Packit 2035a7
            # remove large files
Packit 2035a7
            statinfo = os.stat(g)
Packit 2035a7
            if statinfo.st_size > 100000:
Packit 2035a7
                os.remove(g)
Packit 2035a7
Packit 2035a7
            # remove non-source files
Packit 2035a7
            elif g[-2:] not in {'.C', '.c', '.H', '.h'} and g[-3:] != '.cc' and\
Packit 2035a7
                    g[-4:] not in {'.cpp', '.cxx', '.c++', '.hpp', '.tpp', '.t++'}:
Packit 2035a7
                os.remove(g)
Packit 2035a7
Packit 2035a7
Packit 2035a7
def downloadpackage(filepath, outpath):
Packit 2035a7
    # remove all files/folders
Packit 2035a7
    removeAll()
Packit 2035a7
Packit 2035a7
    if not wget(filepath):
Packit 2035a7
        print('Failed to download ' + filepath)
Packit 2035a7
        return
Packit 2035a7
Packit 2035a7
    filename = filepath[filepath.rfind('/') + 1:]
Packit 2035a7
    if filename[-3:] == '.gz':
Packit 2035a7
        subprocess.call(['tar', 'xzvf', filename])
Packit 2035a7
    elif filename[-3:] == '.xz':
Packit 2035a7
        subprocess.call(['tar', 'xJvf', filename])
Packit 2035a7
    elif filename[-4:] == '.bz2':
Packit 2035a7
        subprocess.call(['tar', 'xjvf', filename])
Packit 2035a7
    else:
Packit 2035a7
        return
Packit 2035a7
Packit 2035a7
    removeLargeFiles('')
Packit 2035a7
Packit 2035a7
    for g in glob.glob('[#_A-Za-z0-9]*'):
Packit 2035a7
        if os.path.isdir(g):
Packit 2035a7
            subprocess.call(['tar', '-cJvf', outpath + filename[:filename.rfind('.')] + '.xz', g])
Packit 2035a7
            break
Packit 2035a7
Packit 2035a7
workdir = os.path.expanduser('~/daca2-packages/tmp/')
Packit 2035a7
if not os.path.isdir(workdir):
Packit 2035a7
    os.makedirs(workdir)
Packit 2035a7
os.chdir(workdir)
Packit 2035a7
Packit 2035a7
packages = getpackages()
Packit 2035a7
if len(packages) == 0:
Packit 2035a7
    print('failed to load packages')
Packit 2035a7
    sys.exit(1)
Packit 2035a7
Packit 2035a7
print('Sleep for 10 seconds..')
Packit 2035a7
time.sleep(10)
Packit 2035a7
Packit 2035a7
for package in packages:
Packit 2035a7
    downloadpackage(package, os.path.expanduser('~/daca2-packages/'))
Packit 2035a7
Packit 2035a7
# remove all files/folders
Packit 2035a7
removeAll()