diff --git a/bin/omarchy-upgrade-to-quattro b/bin/omarchy-upgrade-to-quattro index 6b12a042..230f0601 100755 --- a/bin/omarchy-upgrade-to-quattro +++ b/bin/omarchy-upgrade-to-quattro @@ -1709,6 +1709,62 @@ CHROMIUM_FLAGS_PATCH_PY done } +repair_chromium_copy_url_shortcuts() { + local profile_root preferences + local -a profile_roots=( + "$HOME/.config/chromium" + "$HOME/.config/google-chrome" + "$HOME/.config/google-chrome-beta" + "$HOME/.config/BraveSoftware/Brave-Browser" + "$HOME/.config/BraveSoftware/Brave-Browser-Beta" + "$HOME/.config/microsoft-edge" + "$HOME/.config/microsoft-edge-beta" + "$HOME/.config/vivaldi" + "$HOME/.config/opera" + "$HOME/.config/helium" + ) + + for profile_root in "${profile_roots[@]}"; do + [[ -d $profile_root ]] || continue + + for preferences in "$profile_root"/*/Preferences; do + [[ -f $preferences ]] || continue + grep -qF 'bocglpkldciamkbmlphanhkfnhpmnbma' "$preferences" || continue + + python3 - "$preferences" "$preferences.omarchy-upgrade-to-quattro.$BACKUP_SUFFIX.bak" <<'CHROMIUM_SHORTCUTS_PATCH_PY' +import json +import shutil +import sys +from pathlib import Path + +path = Path(sys.argv[1]) +backup_path = Path(sys.argv[2]) +old_id = "bocglpkldciamkbmlphanhkfnhpmnbma" +new_id = "bgpiichlckmfanooecilcjemknkcpngb" +preferences = json.loads(path.read_text()) +extensions = preferences.get("extensions", {}) +commands = extensions.get("commands", {}) +changed = False + +for command in commands.values(): + if command.get("extension") == old_id and command.get("command_name") == "copy-url": + command["extension"] = new_id + changed = True + +if changed: + settings = extensions.get("settings", {}) + old_command = settings.get(old_id, {}).get("commands", {}).get("copy-url", {}) + new_command = settings.get(new_id, {}).get("commands", {}).get("copy-url", {}) + old_command.pop("was_assigned", None) + if new_command: + new_command["was_assigned"] = True + shutil.copy2(path, backup_path) + path.write_text(json.dumps(preferences, separators=(",", ":"))) +CHROMIUM_SHORTCUTS_PATCH_PY + done + done +} + repair_sleep_lock_unit_override() { local unit="$HOME/.config/systemd/user/omarchy-sleep-lock.service" local legacy_exec='ExecStart=%h/.local/share/omarchy/bin/omarchy-system-sleep-monitor' @@ -1805,6 +1861,7 @@ copy_missing_config_defaults "$root/config" "$HOME/.config" mark_removed_preinstalls_from_legacy_bindings copy_always_config_defaults repair_chromium_copy_url_extension_flags +repair_chromium_copy_url_shortcuts # Carry over user-added backgrounds from the legacy git checkout backup, then # remove old symlinks that pointed ~/.config/omarchy/themes/* back into the @@ -1871,7 +1928,7 @@ repair_sleep_lock_unit_override install_bash_startup unset rel file backup retired_config_files always_copy_config_files uwsm_env known_config_default_hashes_by_key -unset -f file_sha256 known_config_default_hashes default_hash_paths is_known_default_hash backup_config_file migrate_uwsm_env_customizations is_retired_config_file copy_config_default copy_missing_config_defaults refresh_known_config_defaults mark_removed_preinstalls_from_legacy_bindings copy_always_config_defaults repair_chromium_copy_url_extension_flags repair_sleep_lock_unit_override is_known_bashrc_default install_bash_startup +unset -f file_sha256 known_config_default_hashes default_hash_paths is_known_default_hash backup_config_file migrate_uwsm_env_customizations is_retired_config_file copy_config_default copy_missing_config_defaults refresh_known_config_defaults mark_removed_preinstalls_from_legacy_bindings copy_always_config_defaults repair_chromium_copy_url_extension_flags repair_chromium_copy_url_shortcuts repair_sleep_lock_unit_override is_known_bashrc_default install_bash_startup mkdir -p "$HOME/.agents/skills" "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.pi/agent/skills" if [[ -d $root/default/omarchy-skill ]]; then diff --git a/test/shell.d/chromium-copy-url-test.sh b/test/shell.d/chromium-copy-url-test.sh index 19c08c1f..d8fe9bb7 100644 --- a/test/shell.d/chromium-copy-url-test.sh +++ b/test/shell.d/chromium-copy-url-test.sh @@ -4,6 +4,13 @@ source "$(dirname "${BASH_SOURCE[0]}")/base-test.sh" export PATH="$ROOT/bin:$PATH" +TMPDIR="" + +cleanup() { + [[ -n $TMPDIR && -d $TMPDIR ]] && rm -rf "$TMPDIR" +} +trap cleanup EXIT + require_command jq require_command node @@ -28,3 +35,37 @@ JS [[ $copy_url_id == "bgpiichlckmfanooecilcjemknkcpngb" ]] || fail "copy-url extension manifest has the stable id" "$copy_url_id" pass "copy-url extension manifest has the stable id" + +TMPDIR=$(mktemp -d) +preferences="$TMPDIR/Preferences" +backup="$TMPDIR/Preferences.bak" +patch_script="$TMPDIR/repair-shortcuts.py" + +awk ' + /<<'\''CHROMIUM_SHORTCUTS_PATCH_PY'\''/ { copying = 1; next } + copying && $0 == "CHROMIUM_SHORTCUTS_PATCH_PY" { exit } + copying { print } +' "$ROOT/bin/omarchy-upgrade-to-quattro" >"$patch_script" + +cat >"$preferences" <<'JSON' +{"extensions":{"commands":{"linux:Alt+Shift+L":{"command_name":"copy-url","extension":"bocglpkldciamkbmlphanhkfnhpmnbma","global":false},"linux:Alt+Shift+D":{"command_name":"download-video","extension":"dedjgknigfeelejglamclffonmophnfl","global":false}},"settings":{"bocglpkldciamkbmlphanhkfnhpmnbma":{"commands":{"copy-url":{"suggested_key":"Alt+Shift+L","was_assigned":true}}},"bgpiichlckmfanooecilcjemknkcpngb":{"commands":{"copy-url":{"suggested_key":"Alt+Shift+L"}}}}}} +JSON + +python3 "$patch_script" "$preferences" "$backup" + +jq -e ' + .extensions.commands["linux:Alt+Shift+L"].extension == "bgpiichlckmfanooecilcjemknkcpngb" and + .extensions.commands["linux:Alt+Shift+D"].extension == "dedjgknigfeelejglamclffonmophnfl" and + (.extensions.settings.bocglpkldciamkbmlphanhkfnhpmnbma.commands["copy-url"] | has("was_assigned") | not) and + .extensions.settings.bgpiichlckmfanooecilcjemknkcpngb.commands["copy-url"].was_assigned == true +' "$preferences" >/dev/null || fail "quattro upgrade moves the Copy URL shortcut to the stable extension id" +cmp -s "$backup" <(printf '%s\n' '{"extensions":{"commands":{"linux:Alt+Shift+L":{"command_name":"copy-url","extension":"bocglpkldciamkbmlphanhkfnhpmnbma","global":false},"linux:Alt+Shift+D":{"command_name":"download-video","extension":"dedjgknigfeelejglamclffonmophnfl","global":false}},"settings":{"bocglpkldciamkbmlphanhkfnhpmnbma":{"commands":{"copy-url":{"suggested_key":"Alt+Shift+L","was_assigned":true}}},"bgpiichlckmfanooecilcjemknkcpngb":{"commands":{"copy-url":{"suggested_key":"Alt+Shift+L"}}}}}}') || + fail "quattro upgrade backs up Chromium preferences before shortcut repair" +pass "quattro upgrade repairs and backs up the Copy URL shortcut" + +unchanged_hash=$(sha256sum "$preferences" | cut -d' ' -f1) +rm "$backup" +python3 "$patch_script" "$preferences" "$backup" +[[ $(sha256sum "$preferences" | cut -d' ' -f1) == "$unchanged_hash" && ! -e $backup ]] || + fail "Copy URL shortcut repair is idempotent" +pass "Copy URL shortcut repair is idempotent"