"""Copia uma arvore do SVN do SourceForge pelas listagens HTML do mod_dav_svn (sem cliente svn), para montar o fonte do pak64 numa revisao fixa (build-simutrans.sh). uso: python3 -I svnexport.py 'https://svn.code.sf.net/p/simutrans/code/!svn/bc//pak64/' """ import concurrent.futures as cf, os, re, sys, urllib.parse, urllib.request base, out = sys.argv[1], sys.argv[2] files = [] def walk(rel): html = urllib.request.urlopen(base + rel).read().decode('utf-8') for href in re.findall(r'
  • ', html): if href == '../': continue if href.endswith('/'): walk(rel + href) else: files.append(rel + href) def get(rel): path = os.path.join(out, urllib.parse.unquote(rel)) os.makedirs(os.path.dirname(path), exist_ok=True) for attempt in range(4): try: data = urllib.request.urlopen(base + rel).read() break except OSError: if attempt == 3: raise with open(path, 'wb') as f: f.write(data) walk('') with cf.ThreadPoolExecutor(8) as ex: list(ex.map(get, files)) print(len(files), 'files')