22import concurrent .futures
33import logging
44import os
5+ import re
56import tempfile
67from datetime import datetime
78from pathlib import Path
@@ -158,9 +159,11 @@ def process_release(
158159 release : dict ,
159160 release_dir : Path ,
160161 tarball : bool ,
162+ exclude_regexes : list [str ],
161163 ) -> int :
162-
164+
163165 release_size = 0
166+ exclude_re = re .compile ("|" .join (exclude_regexes )) if exclude_regexes else None
164167
165168 if tarball :
166169 url = release ["tarball_url" ]
@@ -183,6 +186,9 @@ def process_release(
183186 )
184187
185188 for asset in release ["assets" ]:
189+ if exclude_re and exclude_re .search (asset ["name" ]):
190+ logger .info (f"excluding { asset ['name' ]} by regex" )
191+ continue
186192 url = asset ["browser_download_url" ]
187193 updated = datetime .strptime (
188194 asset ["updated_at" ], "%Y-%m-%dT%H:%M:%SZ"
@@ -245,25 +251,20 @@ def link_latest(name: str, repo_dir: Path) -> None:
245251 total_size = 0
246252
247253 for cfg in REPOS :
248- flat = False # build a folder for each release
249- versions = 1 # keep only one release
250- tarball = False # do not download the tarball
251- prerelease = False # filter out pre-releases
252- perpage = 0
253254 if isinstance (cfg , str ):
254- repo = cfg
255- else :
256- repo = cfg [ "repo" ]
257- if "versions" in cfg :
258- versions = cfg [ "versions" ]
259- if "flat" in cfg :
260- flat = cfg [ "flat" ]
261- if "tarball" in cfg :
262- tarball = cfg [ "tarball" ]
263- if "pre_release" in cfg :
264- prerelease = cfg [ "pre_release" ]
265- if "per_page" in cfg :
266- perpage = cfg [ "per_page" ]
255+ cfg = { "repo" : cfg }
256+ repo = cfg [ "repo" ]
257+ versions = cfg . get ( "versions" , 1 ) # keep # of latest releases
258+ flat = cfg . get ( "flat" , False ) # build a folder for each release
259+ tarball = cfg . get ( "tarball" , False ) # download source tarball
260+ prerelease = cfg . get ( "prerelease" , False ) # include pre-releases
261+ perpage = cfg . get ( "per_page" , 0 ) # number of releases per page
262+ exclude_regexes = cfg . get ( "exclude" , []) # list of file name regexes to exclude
263+
264+ assert type ( perpage ) is int and perpage >= 0 , "`per_page` must be a non-negative integer"
265+ assert type ( tarball ) is bool , "`tarball` must be a boolean"
266+ assert type ( exclude_regexes ) is list , "`exclude` must be a list of regex strings"
267+ assert type ( versions ) is int and versions >= 0 , "`versions` must be a non-negative integer"
267268
268269 repo_dir = working_dir / Path (repo )
269270 logger .info (f"syncing { repo } to { repo_dir } " )
@@ -292,6 +293,7 @@ def link_latest(name: str, repo_dir: Path) -> None:
292293 release ,
293294 (repo_dir if flat else repo_dir / name ),
294295 tarball ,
296+ exclude_regexes
295297 )
296298 if n_downloaded == 0 and not flat :
297299 # create a symbolic link to the latest release folder
0 commit comments