50 lines
1.8 KiB
Python
Executable file
50 lines
1.8 KiB
Python
Executable file
#!/usr/bin/python3
|
|
"""
|
|
A helper for doing the config layering with sway style `include` expressions
|
|
(which are pretty much just shell/wordexp(3) patterns).
|
|
|
|
The script is meant to be invoked from sway (i3?) config as following
|
|
```
|
|
include '$(/path/to/the/script "/path1/*.conf" "/path2/*.conf" ...)'
|
|
```
|
|
(note the quoting, it is important), expand each expression to a list of files
|
|
and layer them in a way that the files with the same name matched by a later
|
|
patterns loaded over the earlier matches.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from hashlib import sha256
|
|
from glob import iglob
|
|
from os.path import basename, expandvars
|
|
from tempfile import gettempdir
|
|
|
|
|
|
def wordexp(value: str):
|
|
"""A very bad wordexp(3) approximation"""
|
|
value = expandvars(value)
|
|
return iglob(value)
|
|
|
|
|
|
configs: dict[str, str] = {}
|
|
|
|
for arg in sys.argv[1:]:
|
|
# Expand the expression and collect the paths while overwriting previously
|
|
# collected entries with the same filename.
|
|
# Our internal wordexp is quite incomplete, but the calling wordexp should
|
|
# do all the heavy lifting and expand the variables.
|
|
for inc in wordexp(arg):
|
|
configs[basename(inc)] = inc
|
|
|
|
# Write collected paths as an include directives to a temporary file.
|
|
# This step is required because the filenames may contain $IFS characters
|
|
# (whitespaces — I don't expect this to happen, but can't exclude the
|
|
# possibility), and wordexp(3) will handle that quite bad.
|
|
fnhash = sha256("\n".join(sys.argv).encode("UTF-8"))
|
|
fname = f"{gettempdir()}/sway-{os.getuid()}-{str(fnhash.hexdigest())}.conf"
|
|
fd = os.open(fname, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, mode=0o600)
|
|
with open(fd, mode="w", encoding="UTF-8") as file:
|
|
for key in sorted(configs):
|
|
file.write(f"include '{configs[key]}'\n")
|
|
# Send the temporary file name back to a calling wordexp
|
|
print(fname)
|