-
Notifications
You must be signed in to change notification settings - Fork 3
/
update_all_sites.py
87 lines (66 loc) · 2.38 KB
/
update_all_sites.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Copyright (c) Mysten Labs, Inc.
# SPDX-License-Identifier: Apache-2.0
"""A script to automatically update all known Walrus sites in this repository.
It reads a configuration that provides the directories of the sites and their object IDs, and calls
the site-builder CLI.
"""
import os
import subprocess
from argparse import ArgumentParser, Namespace
import yaml
from pydantic import BaseModel, TypeAdapter
SITE_BUILDER = "site-builder"
SITE_BUILDER_CONFIG = "~/.config/walrus/site-builder-config.yaml"
CONFIG = "publish-config.yaml"
class Site(BaseModel):
name: str
object_id: str
path: os.PathLike
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.path = os.path.expanduser(kwargs["path"])
sites_ta = TypeAdapter(list[Site])
def parse_args() -> Namespace:
parser = ArgumentParser(
description="Update all known Walrus sites in this repository. NOTE: This \
script require the walrus CLI and the site-builder CLI to be installed. \
Further, the script can only be called by the owner of the sites."
)
parser.add_argument("--builder-config", default=SITE_BUILDER_CONFIG)
parser.add_argument("--builder-bin", default=SITE_BUILDER)
parser.add_argument("--config", default=CONFIG)
return parser.parse_args()
def read_config(filename: str) -> list[Site]:
with open(filename, "r") as infile:
config = yaml.safe_load(infile.read())
sites = sites_ta.validate_python(config)
return sites
def update_site(builder_name: str, builder_config: str, site: Site) -> None:
print(
f"Update site {site.name} with object ID {site.object_id} at path {site.path}"
)
cmd = [
builder_name,
"--config",
builder_config,
"update",
site.path,
site.object_id,
"--force",
]
print(" ".join(cmd))
subprocess.run(cmd, check=True)
def main():
args = parse_args()
print(f"Running with the config: {SITE_BUILDER_CONFIG}")
config = read_config(args.config)
print("Sites to update:")
for site in config:
print(f" - {site.name}")
print("NOTE: THIS SCRIPT CAN ONLY BE CALLED BY THE OWNER OF THE SITES.\n")
print("Continue? [Enter/Ctrl+c]")
input()
for site in config:
update_site(args.builder_bin, os.path.expanduser(args.builder_config), site)
if __name__ == "__main__":
main()