diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index d8ea056b..97144172 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -5,6 +5,56 @@ VS_CODE_THEME_DESCRIPTOR="$HOME/.config/omarchy/current/theme/vscode.json" GENERATED_THEME="$HOME/.config/omarchy/current/theme/vscode-theme.json" +GENERATED_EXTENSION_NAME="omarchy-theme" +GENERATED_EXTENSION_ID="local.$GENERATED_EXTENSION_NAME" +GENERATED_EXTENSION_VERSION="1.0.0" + +register_generated_extension() { + local ext_dir="$1" + local ext_base extensions_file obsolete_file relative tmp + + ext_base=$(dirname "$ext_dir") + extensions_file="$ext_base/extensions.json" + obsolete_file="$ext_base/.obsolete" + relative=$(basename "$ext_dir") + + if [[ -f $obsolete_file ]]; then + tmp=$(mktemp) + if jq --arg key "$GENERATED_EXTENSION_ID-$GENERATED_EXTENSION_VERSION" 'del(.[$key])' "$obsolete_file" >"$tmp"; then + mv "$tmp" "$obsolete_file" + [[ $(jq 'length' "$obsolete_file") == "0" ]] && rm -f "$obsolete_file" + else + rm -f "$tmp" + fi + fi + + [[ -f $extensions_file ]] || printf '[]\n' >"$extensions_file" + + tmp=$(mktemp) + if jq \ + --arg id "$GENERATED_EXTENSION_ID" \ + --arg version "$GENERATED_EXTENSION_VERSION" \ + --arg fs_path "$ext_dir" \ + --arg external "file://$ext_dir" \ + --arg relative "$relative" \ + 'map(select(.identifier.id != $id)) + [{ + identifier: { id: $id }, + version: $version, + location: { + "$mid": 1, + fsPath: $fs_path, + external: $external, + path: $fs_path, + scheme: "file" + }, + relativeLocation: $relative + }]' \ + "$extensions_file" >"$tmp"; then + mv "$tmp" "$extensions_file" + else + rm -f "$tmp" + fi +} # Install generated theme as a local extension for a given editor install_generated_extension() { @@ -19,15 +69,15 @@ install_generated_extension() { fi mkdir -p "$ext_dir/themes" - cp "$GENERATED_THEME" "$ext_dir/themes/omarchy-color-theme.json" + ln -sfn "$GENERATED_THEME" "$ext_dir/themes/omarchy-color-theme.json" cat > "$ext_dir/package.json" <"$PI_TMPDIR/.vscode/extensions/.obsolete" PATH="$FAKE_BIN:$ROOT/bin:$PATH" HOME="$PI_TMPDIR" "$ROOT/bin/omarchy-theme-set-vscode" jq -e '.contributes.themes[0].uiTheme == "vs"' "$PI_TMPDIR/.vscode/extensions/omarchy-theme/package.json" >/dev/null || fail "vscode generated light theme uses VS Code light uiTheme" pass "vscode generated light theme uses VS Code light uiTheme" +[[ -L $PI_TMPDIR/.vscode/extensions/omarchy-theme/themes/omarchy-color-theme.json ]] || fail "vscode generated theme references current theme file" +[[ $(readlink "$PI_TMPDIR/.vscode/extensions/omarchy-theme/themes/omarchy-color-theme.json") == "$PI_TMPDIR/.config/omarchy/current/theme/vscode-theme.json" ]] || fail "vscode generated theme references current theme file" +pass "vscode generated theme references current theme file" +[[ ! -f $PI_TMPDIR/.vscode/extensions/.obsolete ]] || fail "vscode generated theme clears obsolete extension marker" +pass "vscode generated theme clears obsolete extension marker" +jq -e '.[] | select(.identifier.id == "local.omarchy-theme" and .relativeLocation == "omarchy-theme")' "$PI_TMPDIR/.vscode/extensions/extensions.json" >/dev/null || fail "vscode generated theme registers local extension" +pass "vscode generated theme registers local extension" for binary in \ omarchy-update \