build: new build system (#178)

* build: start new build system

* fix: keys

* fix: suffixes

* feat: assets

* fix: naming; xfwm4; remove todos

* style: refactor the whole build script

* feat: actually use our palette

* feat: zipping

* ci: adapt to new build system

* ci: whoops

* fix: allow all accents to be generated in 1 task

* ci: don't explode the ci

* fix: allow skipping of patch procedures

* fix: daArKrDaRkdarkdark

* feat: first pass at install script

* fix: use shebang

* fix: use `dark` for gtk css universally
This commit is contained in:
nullishamy
2024-05-19 18:37:46 +01:00
committed by GitHub
parent fb3ceb6211
commit 4050bab0f1
19 changed files with 1406 additions and 527 deletions

View File

@@ -1,109 +1,147 @@
"""
Main script to clone, recolor and install the theme.
Run this from the root of the repo.
#!/usr/bin/env python3
Usage:
python install.py [options]
"""
import argparse
import os
import subprocess
import os, zipfile, argparse, logging, io
from pathlib import Path
from dataclasses import dataclass
from urllib.request import urlopen, Request
from scripts.ctp_colors import get_all_accent, get_all_flavors
from scripts.create_theme import create_theme
from scripts.var import theme_name, work_dir
logger = logging.getLogger("catppuccin-gtk")
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
formatter = logging.Formatter("[%(name)s] [%(levelname)s] - %(message)s")
ch.setFormatter(formatter)
logger.addHandler(ch)
parser = argparse.ArgumentParser(description="Catppuccin theme")
parser.add_argument("flavor",
metavar="theme flavor",
type=str,
nargs="+",
choices=["mocha", "frappe", "macchiato", "latte", "all"],
help="Flavor of the theme to apply. Can be frappe, mocha, macchiato, latte")
parser.add_argument("--name", "-n",
metavar="theme name",
type=str,
default=theme_name,
dest="name",
help="Name of the theme to apply. Defaults to Catppuccin")
@dataclass
class InstallContext:
flavor: str
accent: str
dest: Path
link: bool
parser.add_argument("--dest", "-d",
metavar="destination",
type=str,
dest="dest",
help="Destination of the files. defaults to releases folder inside the root")
parser.add_argument("--accent", "-a",
metavar="Accent of the theme",
type=str,
nargs="+",
default=["blue"],
dest="accent",
choices=["rosewater", "flamingo", "pink", "mauve", "red", "maroon", "peach",
"yellow", "green", "teal", "sky", "sapphire", "blue", "lavender", "all"],
help="Accent of the theme. Can include 'rosewater', 'flamingo', 'pink', 'mauve', 'red', 'maroon', \
'peach', 'yellow', 'green', 'teal', 'sky', 'sapphire', 'blue', 'lavender'")
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"flavor",
type=str,
choices=["mocha", "frappe", "macchiato", "latte"],
help="Flavor of the theme to apply.",
)
parser.add_argument("--size", "-s",
metavar="Size of the theme",
type=str,
default="standard",
dest="size",
choices=["standard", "compact"],
help="Size variant of the theme. Can be standard or compact")
parser.add_argument(
"accent",
type=str,
default="mauve",
choices=[
"rosewater",
"flamingo",
"pink",
"mauve",
"red",
"maroon",
"peach",
"yellow",
"green",
"teal",
"sky",
"sapphire",
"blue",
"lavender",
"all",
],
help="Accent of the theme.",
)
parser.add_argument("--tweaks",
metavar="Colloid specific tweaks",
type=str,
default=[],
nargs="+",
dest="tweaks",
choices=["black", "rimless", "normal", "float"],
help="Some specifc tweaks. like black, rimless, normal buttons")
parser.add_argument(
"--dest",
"-d",
type=str,
dest="dest",
help="Destination of the files.",
)
parser.add_argument("-l", "--link",
help="Link advaita themes to our catppuccin theme",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="link")
parser.add_argument(
"--link",
help="Whether to add symlinks for libadwaita",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
)
parser.add_argument("--zip",
help="Zip catppuccin theme",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="zip")
return parser.parse_args()
parser.add_argument("--recreate-asset",
help="Recreate assets for xfwm4 and such",
type=bool,
default=False,
action=argparse.BooleanOptionalAction,
dest="rec_asset")
args = parser.parse_args()
def build_release_url(ctx: InstallContext) -> str:
repo_root = "https://github.com/catppuccin/gtk/releases/download"
release = "v1.0.0-alpha"
zip_name = f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default.zip"
if "all" in args.flavor:
flavors = get_all_flavors()
else:
flavors = args.flavor
return f"{repo_root}/{release}/{zip_name}"
if "all" in args.accent:
accents = get_all_accent()
else:
accents = args.accent
if args.dest:
dest = args.dest
elif os.geteuid() == 0: # Sudo
dest = "/usr/share/themes"
else:
dest = os.path.expanduser('~') + "/.themes"
def install(ctx: InstallContext):
url = build_release_url(ctx)
build_info = f"""Installation info:
flavor: {ctx.flavor}
accent: {ctx.accent}
dest: {ctx.dest.absolute()}
link: {ctx.link}
remote_url: {url}"""
logger.info(build_info)
httprequest = Request(url)
if not os.listdir(work_dir):
subprocess.call("git submodule update --init --recursive", shell=True)
zip_file = None
logger.info("Starting download...")
with urlopen(httprequest) as response:
logger.info(f"Response status: {response.status}")
zip_file = zipfile.ZipFile(io.BytesIO(response.read()))
logger.info("Download finished, zip is valid")
filename = create_theme(flavors, accents, dest,
args.link, args.name, args.size, args.tweaks, args.zip, args.rec_asset)
logger.info("Verifying download..")
first_bad_file = zip_file.testzip()
if first_bad_file is not None:
logger.error(f'Zip appears to be corrupt, first bad file is "{first_bad_file}"')
return
logger.info("Download verified")
logger.info("Extracting...")
zip_file.extractall(ctx.dest)
logger.info("Extraction complete")
if ctx.link:
dir_name = (ctx.dest / f"catppuccin-{ctx.flavor}-{ctx.accent}-standard+default" / 'gtk-4.0').absolute()
gtk4_dir = (Path(os.path.expanduser('~')) / '.config' / 'gtk-4.0').absolute()
os.makedirs(gtk4_dir, exist_ok=True)
logger.info("Adding symlinks for libadwaita")
logger.info(f'Root: {dir_name}')
logger.info(f'Target: {gtk4_dir}')
os.symlink(dir_name / 'assets', gtk4_dir / 'assets')
os.symlink(dir_name / 'gtk.css', gtk4_dir / 'gtk.css')
os.symlink(dir_name / 'gtk-dark.css', gtk4_dir / 'gtk-dark.css')
def main():
args = parse_args()
dest = Path(os.path.expanduser("~")) / ".local" / "share" / "themes"
os.makedirs(dest, exist_ok=True)
if args.dest:
dest = Path(args.dest)
ctx = InstallContext(
flavor=args.flavor, accent=args.accent, dest=dest, link=args.link
)
install(ctx)
logger.info('Theme installation complete!')
try:
main()
except Exception as e:
logger.error("Something went wrong when installing the theme:", exc_info=e)