diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index a23390c44..a392c6f15 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -9,65 +9,52 @@ on: jobs: CI: + # https://github.com/actions/runner-images/issues/13964 runs-on: ubuntu-26.04 + steps: - - uses: actions/checkout@v3 + # Cache apt + - name: Cache apt + uses: actions/cache@v4 with: - submodules: recursive + path: /var/cache/apt/archives + key: apt-cache-${{ runner.arch }} - - uses: actions/setup-node@v3 + # Cache Flatpak + - name: Cache Flatpak dependencies + uses: actions/cache@v4 with: - node-version: 20 - cache: "npm" + path: ~/.local/share/flatpak + key: flatpak-deps-${{ runner.arch }} + + # Cache flatpak-builder state + - name: Cache .flatpak-builder + uses: actions/cache@v4 + with: + path: .flatpak-builder + key: flatpak-builder-${{ runner.arch }} + + # Cache Foundry + - name: Cache .foundry + uses: actions/cache@v4 + with: + path: .foundry + key: foundry-${{ runner.arch }} - name: Install host dependencies run: | - sudo apt-get update - sudo apt-get install flatpak mutter flatpak-builder foundry + sudo apt-get -y update + sudo apt-get -y install flatpak mutter flatpak-builder foundry - # Restore caches - - name: Restore Flatpak dependencies - uses: actions/cache/restore@v3 - with: - path: ~/.local/share/flatpak - key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }} - restore-keys: | - ${{ runner.os }}-flatpak-dependencies- - - name: Restore .flatpak-builder - uses: actions/cache/restore@v3 + - uses: actions/checkout@v4 with: - path: .flatpak-builder - key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }} - restore-keys: | - ${{ runner.os }}-flatpak-builder- - - name: Restore .foundry - uses: actions/cache/restore@v3 + submodules: recursive + + - uses: actions/setup-node@v4 with: - path: .foundry - key: ${{ runner.os }}-foundry-${{ github.run_id }} - restore-keys: | - ${{ runner.os }}-foundry- + node-version: 24 + cache: "npm" - run: mutter --wayland --no-x11 --headless --wayland-display=wayland-0 --virtual-monitor 1280x720 > /tmp/mutter.log 2>&1 & - run: make ci - run: cat /tmp/mutter.log - - # Save caches - - name: Save Flatpak dependencies - uses: actions/cache/save@v3 - if: always() - with: - path: ~/.local/share/flatpak - key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }} - - name: Save .flatpak-builder - uses: actions/cache/save@v3 - if: always() - with: - path: .flatpak-builder - key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }} - - name: Save .foundry - uses: actions/cache/save@v3 - if: always() - with: - path: .foundry - key: ${{ runner.os }}-foundry-${{ github.run_id }} diff --git a/Makefile b/Makefile index bb483f535..62e66a1d3 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,6 @@ lint: unit: foundry run -- gjs -m $(ROOT)/troll/tst/bin.js $(ROOT)/test/*.test.js -#./build-aux/wip/run.js build-aux/re.sonny.Workbench.Devel.json -- gjs -m ./troll/tst/bin.js test/*.test.js # https://github.com/ximion/appstream/issues/398#issuecomment-1129454985 # flatpak run org.freedesktop.appstream.cli validate --override=release-time-missing=info --no-net data/app.metainfo.xml @@ -60,12 +59,20 @@ unit: test: unit lint foundry run -- workbench-cli ci $(ROOT)/demos/src/Welcome -# ./build-aux/wip/run.js build-aux/re.sonny.Workbench.Devel.json -- workbench-cli ci demos/src/Welcome/ -ci: setup build test -# See Permissions.js -# flatpak override --user --share=network --socket=pulseaudio --device=input re.sonny.Workbench.Devel - foundry run -- workbench-cli ci $(ROOT)/demos/src/* +install: + artifact=$$(foundry export \ + | grep -oE 'file://[^[:space:]]+' \ + | tail -n1 \ + | sed 's|^file://||'); \ + test -n "$$artifact" || { echo "No artifact found"; exit 1; }; \ + flatpak install --user --assumeyes "$$artifact" + +ci: setup build test install +# We install because foundry has no flag to override permissions +# see Permissions.js for why we need them + flatpak run --command="workbench-cli" --share=network --socket=pulseaudio --device=input --filesystem=$(ROOT) re.sonny.Workbench.Devel ci $(ROOT)/demos/src/* + flatpak: flatpak run org.flatpak.Builder --ccache --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json diff --git a/data/app.metainfo.xml b/data/app.metainfo.xml index 68a88ec14..6c89f2b27 100644 --- a/data/app.metainfo.xml +++ b/data/app.metainfo.xml @@ -43,11 +43,12 @@ - +
  • Use GNOME 50
  • -
  • Fix runnng Rust projects
  • +
  • Fix discarding/closing of sessions
  • +
  • Fix running Rust demos

Library:

    diff --git a/demos b/demos index b74e83e57..d49188e64 160000 --- a/demos +++ b/demos @@ -1 +1 @@ -Subproject commit b74e83e5759e4c1aaa9f61d3400a83ca94d82a01 +Subproject commit d49188e6441d7103304d29739672101db1b95cae diff --git a/package-lock.json b/package-lock.json index 7e2d92bf6..cfd2d6c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -704,7 +703,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -969,7 +967,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001663", "electron-to-chromium": "^1.5.28", @@ -1400,7 +1397,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3355,7 +3351,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -3526,7 +3521,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz", "integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==", "dev": true, - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -4344,7 +4338,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, - "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -4813,8 +4806,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "peer": true + "dev": true }, "acorn-jsx": { "version": "5.3.2", @@ -4987,7 +4979,6 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, - "peer": true, "requires": { "caniuse-lite": "^1.0.30001663", "electron-to-chromium": "^1.5.28", @@ -5294,7 +5285,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, - "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6666,8 +6656,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "peer": true + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -6771,7 +6760,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz", "integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==", "dev": true, - "peer": true, "requires": { "fsevents": "~2.3.2" } diff --git a/src/Previewer/meson.build b/src/Previewer/meson.build index 154246e1e..6b4556e41 100644 --- a/src/Previewer/meson.build +++ b/src/Previewer/meson.build @@ -1,6 +1,6 @@ executable('workbench-previewer-module', 'previewer.vala', - dependencies: [ dependency('gtksourceview-5'), dependency('gmodule-2.0'), dependency('libadwaita-1'), dependency('shumate-1.0'), dependency('webkitgtk-6.0'), libworkbench_vapi ], + dependencies: [ dependency('gtksourceview-5'), dependency('gmodule-2.0'), dependency('libadwaita-1'), dependency('glycin-2'), dependency('shumate-1.0'), dependency('webkitgtk-6.0'), libworkbench_vapi ], # vala_args: [ '--gresourcesdir=' + meson.current_build_dir() ], install: true, link_with: libworkbench, diff --git a/src/cli/blueprint.js b/src/cli/blueprint.js index 42de8e31d..1cb6d9d7c 100644 --- a/src/cli/blueprint.js +++ b/src/cli/blueprint.js @@ -6,9 +6,19 @@ import { getLanguage } from "../common.js"; import { parse } from "../langs/xml/xml.js"; import { LSPError } from "../lsp/LSP.js"; import { checkFile, diagnose } from "./util.js"; +import { ignore_codes } from "../langs/blueprint/blueprint.js"; const languageId = "blueprint"; +// No replacements yet +const ignore_messages = [ + "Gtk.ShortcutsShortcut is deprecated\nhint: This widget will be removed in GTK 5", + "Gtk.ShortcutLabel is deprecated\nhint: This widget will be removed in GTK 5", + "Gtk.ShortcutsWindow is deprecated\nhint: This widget will be removed in GTK 5", + "Gtk.ShortcutsGroup is deprecated\nhint: This widget will be removed in GTK 5", + "Gtk.ShortcutsSection is deprecated\nhint: This widget will be removed in GTK 5", +]; + export default async function blueprint({ file, lspc }) { print(` ${file.get_path()}`); @@ -17,14 +27,9 @@ export default async function blueprint({ file, lspc }) { lspc, languageId, filter(diagnostic) { - // No replacements yet - return ![ - "Gtk.ShortcutsShortcut is deprecated\nhint: This widget will be removed in GTK 5", - "Gtk.ShortcutLabel is deprecated\nhint: This widget will be removed in GTK 5", - "Gtk.ShortcutsWindow is deprecated\nhint: This widget will be removed in GTK 5", - "Gtk.ShortcutsGroup is deprecated\nhint: This widget will be removed in GTK 5", - "Gtk.ShortcutsSection is deprecated\nhint: This widget will be removed in GTK 5", - ].includes(diagnostic.message); + if (ignore_codes.includes(diagnostic.code)) return false; + if (ignore_messages.includes(diagnostic.message)) return false; + return true; }, }); diff --git a/src/cli/main.js b/src/cli/main.js index 5fc584860..4958d3e69 100644 --- a/src/cli/main.js +++ b/src/cli/main.js @@ -22,6 +22,7 @@ import vala from "./vala.js"; import python from "./python.js"; import rust from "./rust.js"; import { Interrupt } from "./util.js"; +import { isTypeScriptEnabled } from "../Extensions/Extensions.js"; GObject.type_ensure(Shumate.SimpleMap); GObject.type_ensure(WebKit.WebView); @@ -102,16 +103,12 @@ const application = new Adw.Application(); const window = new Adw.ApplicationWindow(); function createLSPClients({ root_uri }) { + const langs = ["javascript", "blueprint", "css", "vala", "rust", "python"]; + if (isTypeScriptEnabled()) { + langs.push("typescript"); + } return Object.fromEntries( - [ - "javascript", - "blueprint", - "css", - "vala", - "rust", - "python", - "typescript", - ].map((id) => { + langs.map((id) => { const lang = languages.find((language) => language.id === id); const lspc = createLSPClient({ lang, @@ -175,18 +172,20 @@ async function ci({ filenames }) { }); } - const file_typescript = demo_dir.get_child("main.ts"); - if (file_typescript.query_exists(null)) { - await typescript({ - file: file_typescript, - lspc: lsp_clients.typescript, - blueprint_object_ids, - demo_dir, - application, - builder, - template, - window, - }); + if (isTypeScriptEnabled()) { + const file_typescript = demo_dir.get_child("main.ts"); + if (file_typescript.query_exists(null)) { + await typescript({ + file: file_typescript, + lspc: lsp_clients.typescript, + blueprint_object_ids, + demo_dir, + application, + builder, + template, + window, + }); + } } const file_vala = demo_dir.get_child("main.vala"); diff --git a/src/cli/vala.js b/src/cli/vala.js index f5bbefb1d..e50a6f93a 100644 --- a/src/cli/vala.js +++ b/src/cli/vala.js @@ -42,6 +42,16 @@ export default async function vala({ file, lspc, demo_dir }) { diagnostic.message !== "`Gtk.StyleContext' has been deprecated since 4.10" ); + } else if (demo_dir.get_basename() === "Drag and Drop") { + // I don't see what else we can use + // var icon = Gtk.DragIcon.get_for_drag(drag); + return !["use `new' operator to create new objects"].includes( + diagnostic.message, + ); + } else if (demo_dir.get_basename() === "Shortcuts Window") { + return ![ + "`Gtk.ShortcutsWindow' has been deprecated since 4.18", + ].includes(diagnostic.message); } return true; }, diff --git a/src/langs/blueprint/blueprint.js b/src/langs/blueprint/blueprint.js index 66249f88e..7e5682e8d 100644 --- a/src/langs/blueprint/blueprint.js +++ b/src/langs/blueprint/blueprint.js @@ -4,6 +4,39 @@ import { createLSPClient } from "../../common.js"; import { getLanguage } from "../../util.js"; import { CompletionItemKind } from "../../lsp/LSP.js"; +export const ignore_codes = [ + // FIXME: let's add a11y label to all demo images? + "missing_descriptive_text", + // This is potentially confusing to newcomers? + // Should we update all demos to use Adw.Bin instead of Box? + "use_adw_bin", + // The top level widget in Workbench demos has no ID + "unused_widget", + // Fails for: + // adjustment: Adjustment { + // lower: 100; + // upper: 1000; + // value: 200; + // step-increment: 10; + // }; + // TODO: file an issue + "adjustment_prop_order", + // Fails for: + // Label { + // label: "foo" + // use-markup: true + // } + // TODO: file an issue + "use_unicode", + // TODO: many warnings, investigate + "missing_user_facing_text", + // "SVG" or "CSS" is all caps and that's fine + "avoid_all_caps", + // Sometimes we don't want the widget to scroll + // e.g. CSS Gradients demo GtkSource.View + "scrollable_parent", +]; + export function setup({ document }) { const { file, code_view, buffer } = document; @@ -20,7 +53,11 @@ export function setup({ document }) { if (params.uri !== file.get_uri()) { return; } - code_view.handleDiagnostics(params.diagnostics); + // FIXME: Somehow merge with the similar logic of cli/blueprint.js + const diagnostics = params.diagnostics.filter( + (diag) => !ignore_codes.includes(diag.code), + ); + code_view.handleDiagnostics(diagnostics); }, );