merge mimeapps defaults via modify_ script instead of full replace
mimeapps.list is rewritten by the desktop environment, so managing it as a whole file made chezmoi update clobber each machine's own associations. Replace the full-file template with a modify_ script that merges only the enforced entries (per-host browser for text/html + http/https, and the nvim text-type defaults) into whatever the machine already has, preserving everything else.
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
{{ $browser := "firefox.desktop" }}{{ if hasPrefix "UGC" .chezmoi.hostname }}{{ $browser = "default-browser.desktop" }}{{ end }}
|
||||
# chezmoi modify_ script: merge a curated set of default associations into the
|
||||
# machine's existing mimeapps.list (read from stdin) instead of replacing the
|
||||
# whole file, so each machine keeps its own entries.
|
||||
import sys
|
||||
|
||||
BROWSER = "{{ $browser }}"
|
||||
SECTION = "[Default Applications]"
|
||||
|
||||
# Associations enforced on every machine, in [Default Applications].
|
||||
ENFORCED = {
|
||||
"application/json": "nvim.desktop",
|
||||
"application/x-docbook+xml": "nvim.desktop",
|
||||
"application/x-yaml": "nvim.desktop",
|
||||
"text/markdown": "nvim.desktop",
|
||||
"text/x-cmake": "nvim.desktop",
|
||||
"text/html": BROWSER,
|
||||
"x-scheme-handler/http": BROWSER,
|
||||
"x-scheme-handler/https": BROWSER,
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
lines = sys.stdin.read().splitlines()
|
||||
|
||||
# Split into sections, preserving header lines and body order. The first
|
||||
# (headerless) section holds any preamble before the first [Header].
|
||||
sections = [[None, []]]
|
||||
for line in lines:
|
||||
stripped = line.strip()
|
||||
if stripped.startswith("[") and stripped.endswith("]"):
|
||||
sections.append([stripped, []])
|
||||
else:
|
||||
sections[-1][1].append(line)
|
||||
|
||||
target = next((s for s in sections if s[0] == SECTION), None)
|
||||
if target is None:
|
||||
target = [SECTION, []]
|
||||
sections.append(target)
|
||||
|
||||
remaining = dict(ENFORCED)
|
||||
body = []
|
||||
for line in target[1]:
|
||||
key = line.split("=", 1)[0].strip() if "=" in line else None
|
||||
if key in remaining:
|
||||
body.append("{}={};".format(key, remaining.pop(key)))
|
||||
else:
|
||||
body.append(line)
|
||||
|
||||
# Append any still-missing enforced keys before trailing blank lines.
|
||||
trailing = []
|
||||
while body and body[-1].strip() == "":
|
||||
trailing.insert(0, body.pop())
|
||||
for key, val in ENFORCED.items():
|
||||
if key in remaining:
|
||||
body.append("{}={};".format(key, val))
|
||||
body.extend(trailing)
|
||||
target[1] = body
|
||||
|
||||
out = []
|
||||
for header, section_body in sections:
|
||||
if header is not None:
|
||||
out.append(header)
|
||||
out.extend(section_body)
|
||||
sys.stdout.write("\n".join(out) + "\n")
|
||||
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user