mirror of
https://github.com/tuna/tunasync-scripts.git
synced 2025-04-20 04:12:42 +00:00
support download options
This commit is contained in:
parent
cd6f7067b0
commit
df123d6cb4
@ -14,9 +14,9 @@ BASE_URL = os.getenv("TUNASYNC_UPSTREAM_URL", "https://api.github.com/repos/")
|
|||||||
WORKING_DIR = os.getenv("TUNASYNC_WORKING_DIR")
|
WORKING_DIR = os.getenv("TUNASYNC_WORKING_DIR")
|
||||||
REPOS = [
|
REPOS = [
|
||||||
"Homebrew/homebrew-portable-ruby", # Used by homebrew-bottles
|
"Homebrew/homebrew-portable-ruby", # Used by homebrew-bottles
|
||||||
"googlefonts/noto-fonts",
|
{"repo": "googlefonts/noto-fonts", "tarball": True},
|
||||||
"googlefonts/noto-cjk",
|
{"repo": "googlefonts/noto-cjk", "tarball": True},
|
||||||
"googlefonts/noto-emoji",
|
{"repo": "googlefonts/noto-emoji", "tarball": True},
|
||||||
"be5invis/Sarasa-Gothic",
|
"be5invis/Sarasa-Gothic",
|
||||||
"z4yx/GoAuthing",
|
"z4yx/GoAuthing",
|
||||||
"VSCodium/vscodium",
|
"VSCodium/vscodium",
|
||||||
@ -24,16 +24,11 @@ REPOS = [
|
|||||||
"git-lfs/git-lfs",
|
"git-lfs/git-lfs",
|
||||||
"prometheus/prometheus",
|
"prometheus/prometheus",
|
||||||
"commercialhaskell/stackage-content", # Used by stackage
|
"commercialhaskell/stackage-content", # Used by stackage
|
||||||
"xxr3376/Learn-Project",
|
{"repo": "xxr3376/Learn-Project", "all_versions": True},
|
||||||
"robertying/learnX",
|
{"repo": "robertying/learnX", "all_versions": True},
|
||||||
"rust-analyzer/rust-analyzer",
|
"rust-analyzer/rust-analyzer",
|
||||||
]
|
]
|
||||||
|
|
||||||
FULL_DOWNLOAD_REPOS = [
|
|
||||||
"xxr3376/Learn-Project",
|
|
||||||
"robertying/learnX",
|
|
||||||
]
|
|
||||||
|
|
||||||
# connect and read timeout value
|
# connect and read timeout value
|
||||||
TIMEOUT_OPTION = (7, 10)
|
TIMEOUT_OPTION = (7, 10)
|
||||||
|
|
||||||
@ -103,8 +98,6 @@ def main():
|
|||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--base-url", default=BASE_URL)
|
parser.add_argument("--base-url", default=BASE_URL)
|
||||||
parser.add_argument("--working-dir", default=WORKING_DIR)
|
parser.add_argument("--working-dir", default=WORKING_DIR)
|
||||||
parser.add_argument("--repo", type=str, nargs='*', default=REPOS,
|
|
||||||
help='repositories to download (e.g. --repo be5invis/Sarasa-Gothic googlefonts/noto-emoji)')
|
|
||||||
parser.add_argument("--workers", default=1, type=int,
|
parser.add_argument("--workers", default=1, type=int,
|
||||||
help='number of concurrent downloading jobs')
|
help='number of concurrent downloading jobs')
|
||||||
parser.add_argument("--fast-skip", action='store_true',
|
parser.add_argument("--fast-skip", action='store_true',
|
||||||
@ -119,17 +112,13 @@ def main():
|
|||||||
remote_filelist = []
|
remote_filelist = []
|
||||||
cleaning = False
|
cleaning = False
|
||||||
|
|
||||||
def download(release, repo_dir, latest = False):
|
def download(release, release_dir, tarball = False):
|
||||||
name = ensure_safe_name(release['name'] or release['tag_name'])
|
|
||||||
if len(name) == 0:
|
|
||||||
print("Error: Unnamed release")
|
|
||||||
return
|
|
||||||
|
|
||||||
if len(release['assets']) == 0:
|
if tarball:
|
||||||
url = release['tarball_url']
|
url = release['tarball_url']
|
||||||
updated = datetime.strptime(
|
updated = datetime.strptime(
|
||||||
release['published_at'], '%Y-%m-%dT%H:%M:%SZ').timestamp()
|
release['published_at'], '%Y-%m-%dT%H:%M:%SZ').timestamp()
|
||||||
dst_file = repo_dir / name / 'repo-snapshot.tar.gz'
|
dst_file = release_dir / 'repo-snapshot.tar.gz'
|
||||||
remote_filelist.append(dst_file.relative_to(working_dir))
|
remote_filelist.append(dst_file.relative_to(working_dir))
|
||||||
|
|
||||||
if dst_file.is_file():
|
if dst_file.is_file():
|
||||||
@ -142,7 +131,7 @@ def main():
|
|||||||
url = asset['browser_download_url']
|
url = asset['browser_download_url']
|
||||||
updated = datetime.strptime(
|
updated = datetime.strptime(
|
||||||
asset['updated_at'], '%Y-%m-%dT%H:%M:%SZ').timestamp()
|
asset['updated_at'], '%Y-%m-%dT%H:%M:%SZ').timestamp()
|
||||||
dst_file = repo_dir / name / ensure_safe_name(asset['name'])
|
dst_file = release_dir / ensure_safe_name(asset['name'])
|
||||||
remote_filelist.append(dst_file.relative_to(working_dir))
|
remote_filelist.append(dst_file.relative_to(working_dir))
|
||||||
|
|
||||||
if dst_file.is_file():
|
if dst_file.is_file():
|
||||||
@ -156,7 +145,8 @@ def main():
|
|||||||
local_mtime = stat.st_mtime
|
local_mtime = stat.st_mtime
|
||||||
# print(f"{local_filesize} vs {asset['size']}")
|
# print(f"{local_filesize} vs {asset['size']}")
|
||||||
# print(f"{local_mtime} vs {updated}")
|
# print(f"{local_mtime} vs {updated}")
|
||||||
if asset['size'] == local_filesize and local_mtime == updated:
|
if local_mtime > updated or \
|
||||||
|
asset['size'] == local_filesize and local_mtime == updated:
|
||||||
print("skipping", dst_file.relative_to(
|
print("skipping", dst_file.relative_to(
|
||||||
working_dir), flush=True)
|
working_dir), flush=True)
|
||||||
continue
|
continue
|
||||||
@ -165,7 +155,7 @@ def main():
|
|||||||
|
|
||||||
task_queue.put((url, dst_file, working_dir, updated))
|
task_queue.put((url, dst_file, working_dir, updated))
|
||||||
|
|
||||||
if latest:
|
def link_latest(name, repo_dir):
|
||||||
try:
|
try:
|
||||||
os.unlink(repo_dir / "LatestRelease")
|
os.unlink(repo_dir / "LatestRelease")
|
||||||
except OSError:
|
except OSError:
|
||||||
@ -175,7 +165,24 @@ def main():
|
|||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
for repo in args.repo:
|
for cfg in REPOS:
|
||||||
|
flat = False
|
||||||
|
all_versions = False
|
||||||
|
tarball = False
|
||||||
|
prerelease = False
|
||||||
|
if isinstance(cfg, str):
|
||||||
|
repo = cfg
|
||||||
|
else:
|
||||||
|
repo = cfg["repo"]
|
||||||
|
if "all_versions" in cfg:
|
||||||
|
all_versions = cfg["all_versions"]
|
||||||
|
if "flat" in cfg:
|
||||||
|
flat = cfg["flat"]
|
||||||
|
if "tarball" in cfg:
|
||||||
|
tarball = cfg["tarball"]
|
||||||
|
if "pre_release" in cfg:
|
||||||
|
prerelease = cfg["pre_release"]
|
||||||
|
|
||||||
repo_dir = working_dir / Path(repo)
|
repo_dir = working_dir / Path(repo)
|
||||||
print(f"syncing {repo} to {repo_dir}")
|
print(f"syncing {repo} to {repo_dir}")
|
||||||
|
|
||||||
@ -187,15 +194,21 @@ def main():
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
break
|
break
|
||||||
|
|
||||||
latest = True
|
nothing = True
|
||||||
for release in releases:
|
for release in releases:
|
||||||
if not release['draft'] and not release['prerelease']:
|
if not release['draft'] and (prerelease or not release['prerelease']):
|
||||||
download(release, repo_dir, latest)
|
name = ensure_safe_name(release['name'] or release['tag_name'])
|
||||||
latest = False
|
if len(name) == 0:
|
||||||
if repo not in FULL_DOWNLOAD_REPOS: # only download the latest release
|
print("Error: Unnamed release")
|
||||||
|
continue
|
||||||
|
download(release, (repo_dir if flat else repo_dir / name), tarball)
|
||||||
|
if nothing and not flat:
|
||||||
|
link_latest(name, repo_dir)
|
||||||
|
nothing = False
|
||||||
|
if not all_versions: # only download the latest release
|
||||||
break
|
break
|
||||||
else:
|
if nothing:
|
||||||
print("Error: No release version found")
|
print(f"Error: No release version found for {repo}")
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
cleaning = True
|
cleaning = True
|
||||||
|
Loading…
x
Reference in New Issue
Block a user