-
Notifications
You must be signed in to change notification settings - Fork 0
feat(catalog): add wslu/wslview, installed only under WSL #99
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| { | ||
| "name": "wslu", | ||
| "category": "platform", | ||
| "install_method": "dedicated_script", | ||
| "description": "WSL utilities; provides wslview to open URLs/files in the Windows default browser", | ||
| "homepage": "https://wslutiliti.es/wslu/", | ||
| "binary_name": "wslview", | ||
| "script": "install_wslu.sh", | ||
| "requires_wsl": true, | ||
| "skip_upstream": true, | ||
| "tags": ["platform", "wsl"], | ||
| "guide": { | ||
| "display_name": "wslu (wslview)", | ||
| "install_action": "install", | ||
| "order": 210 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| #!/usr/bin/env bash | ||
| set -euo pipefail | ||
|
|
||
| # wslu provides `wslview`, which opens URLs/files in the Windows default browser. | ||
| # It is only meaningful under WSL, so every action is a graceful no-op elsewhere. | ||
|
|
||
| DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||
| . "$DIR/lib/common.sh" | ||
|
|
||
| ACTION="${1:-install}" | ||
|
|
||
| wslview_version() { have wslview && wslview --version 2>/dev/null | head -1 || true; } | ||
|
|
||
| set_default_browser() { | ||
| # Point the xdg default browser at wslview so links (xdg-open, Python's | ||
| # webbrowser, MCP servers, etc.) open in the Windows browser instead of a | ||
| # WSLg Linux browser. Opt out with WSLU_SET_DEFAULT_BROWSER=0. | ||
| [ "${WSLU_SET_DEFAULT_BROWSER:-1}" = "1" ] || { | ||
|
Check failure on line 18 in scripts/install_wslu.sh
|
||
| echo "[wslu] WSLU_SET_DEFAULT_BROWSER=0 - leaving default browser unchanged" | ||
| return 0 | ||
| } | ||
| have xdg-settings || { | ||
| echo "[wslu] xdg-settings not found - skipping default-browser setup" | ||
| return 0 | ||
| } | ||
| local current | ||
| current="$(xdg-settings get default-web-browser 2>/dev/null || true)" | ||
| if [ "$current" = "wslview.desktop" ]; then | ||
|
Check failure on line 28 in scripts/install_wslu.sh
|
||
| echo "[wslu] default web browser already wslview.desktop" | ||
| return 0 | ||
| fi | ||
| if xdg-settings set default-web-browser wslview.desktop 2>/dev/null; then | ||
| echo "[wslu] default web browser set to wslview.desktop (was: ${current:-unset})" | ||
| else | ||
| echo "[wslu] could not set default browser (non-fatal); run: xdg-settings set default-web-browser wslview.desktop" | ||
| fi | ||
| } | ||
|
|
||
| install_wslu() { | ||
| if ! is_wsl; then | ||
| echo "[wslu] Not running under WSL - nothing to do (wslu/wslview only applies on WSL)." | ||
| return 0 | ||
| fi | ||
| echo "[wslu] current: $(wslview_version)" | ||
| if have apt-get; then | ||
| apt_install_if_missing wslu || { echo "[wslu] apt install failed" >&2; return 1; } | ||
| elif have dnf; then | ||
| sudo dnf install -y wslu | ||
| elif have pacman; then | ||
| sudo pacman -S --noconfirm wslu | ||
| elif have zypper; then | ||
| sudo zypper install -y wslu | ||
| else | ||
| echo "[wslu] No supported package manager found." >&2 | ||
| echo "[wslu] Install wslu manually: https://wslutiliti.es/wslu/install.html" >&2 | ||
| return 1 | ||
| fi | ||
| echo "[wslu] installed: $(wslview_version)" | ||
| set_default_browser | ||
| } | ||
|
|
||
| uninstall_wslu() { | ||
| if ! is_wsl; then | ||
| echo "[wslu] Not running under WSL - nothing to do." | ||
| echo "[wslu] If wslu was installed manually elsewhere, remove it with your package manager (e.g. sudo apt-get remove wslu)." | ||
| return 0 | ||
| fi | ||
| if have apt-get; then | ||
| apt_remove_if_present wslu | ||
| elif have dnf; then | ||
| sudo dnf remove -y wslu || true | ||
| elif have pacman; then | ||
| sudo pacman -R --noconfirm wslu || true | ||
| elif have zypper; then | ||
| sudo zypper remove -y wslu || true | ||
| else | ||
| echo "[wslu] Please remove wslu via your system package manager." >&2 | ||
| fi | ||
| } | ||
|
|
||
| case "$ACTION" in | ||
| install|update) install_wslu ;; | ||
| uninstall) uninstall_wslu ;; | ||
| *) echo "Usage: $0 {install|update|uninstall}" >&2 ; exit 2 ;; | ||
| esac | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| """Tests for WSL-conditional catalog tools (the ``requires_wsl`` gate). | ||
|
|
||
| A tool flagged ``requires_wsl`` (currently ``wslu``/``wslview``) must only be | ||
| surfaced when running under WSL, so non-WSL machines are neither prompted to | ||
| install it nor shown it as missing. | ||
| """ | ||
|
|
||
| from unittest.mock import patch | ||
|
|
||
| from cli_audit.catalog import ToolCatalog | ||
|
|
||
|
|
||
| @patch("cli_audit.collectors.is_wsl", return_value=True) | ||
| def test_wsl_only_tool_present_on_wsl(_mock_is_wsl): | ||
| names = {t.name for t in ToolCatalog().all_tool_definitions()} | ||
| assert "wslu" in names | ||
|
|
||
|
|
||
| @patch("cli_audit.collectors.is_wsl", return_value=False) | ||
| def test_wsl_only_tool_hidden_off_wsl(_mock_is_wsl): | ||
| names = {t.name for t in ToolCatalog().all_tool_definitions()} | ||
| assert "wslu" not in names | ||
|
|
||
|
|
||
| @patch("cli_audit.collectors.is_wsl", return_value=False) | ||
| def test_non_wsl_tools_unaffected_off_wsl(_mock_is_wsl): | ||
| """Gating a WSL-only tool must not drop ordinary tools.""" | ||
| names = {t.name for t in ToolCatalog().all_tool_definitions()} | ||
| assert "ripgrep" in names | ||
|
|
||
|
|
||
| def test_wslu_catalog_entry_is_wsl_gated(): | ||
| """The wslu entry must stay WSL-gated, apt/skip-upstream, wslview-detected.""" | ||
| raw = ToolCatalog().get_raw_data("wslu") | ||
| assert raw.get("requires_wsl") is True | ||
| assert raw.get("skip_upstream") is True | ||
| assert raw.get("binary_name") == "wslview" | ||
| assert raw.get("install_method") == "dedicated_script" |
Uh oh!
There was an error while loading. Please reload this page.