diff --git a/.eslintignore b/.eslintignore index 4172a623a..af3bfa9f5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,3 @@ src/lib troll -flatpak demos diff --git a/.foundry/.gitignore b/.foundry/.gitignore new file mode 100644 index 000000000..a30dfbfa8 --- /dev/null +++ b/.foundry/.gitignore @@ -0,0 +1,3 @@ +tmp/ +user/ +cache/ diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 468e9794f..a23390c44 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -9,7 +9,7 @@ on: jobs: CI: - runs-on: ubuntu-24.04 + runs-on: ubuntu-26.04 steps: - uses: actions/checkout@v3 with: @@ -23,7 +23,7 @@ jobs: - name: Install host dependencies run: | sudo apt-get update - sudo apt-get install flatpak mutter flatpak-builder + sudo apt-get install flatpak mutter flatpak-builder foundry # Restore caches - name: Restore Flatpak dependencies @@ -40,6 +40,13 @@ jobs: key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }} restore-keys: | ${{ runner.os }}-flatpak-builder- + - name: Restore .foundry + uses: actions/cache/restore@v3 + with: + path: .foundry + key: ${{ runner.os }}-foundry-${{ github.run_id }} + restore-keys: | + ${{ runner.os }}-foundry- - run: mutter --wayland --no-x11 --headless --wayland-display=wayland-0 --virtual-monitor 1280x720 > /tmp/mutter.log 2>&1 & - run: make ci @@ -58,3 +65,9 @@ jobs: 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/.gitignore b/.gitignore index 116b3114d..3c3629e64 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1 @@ -.flatpak -.flatpak-builder -build -builddir -/flatpak node_modules -repo -install -.eslintcache -*~ -*.compiled -*.flatpak -.fenv -.venv -__pycache__ -*.pyc -*.gresource -.frun - -# IDEs / editors -.idea - -target -.foundry diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7883f3db7..bc2188677 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,16 +65,6 @@ See also Workbench doesn't currently support translations for its user interface. GNOME documentation is only available in English and we do not want to mislead non-English speakers. - - ## Troubleshooting ### The app won't build/run anymore - even on clean `main` diff --git a/Makefile b/Makefile index b71ce5284..bb483f535 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ SHELL:=/bin/bash -O globstar +ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) .PHONY: setup build lint unit test ci sandbox flatpak .DEFAULT_GOAL := setup @@ -13,41 +14,38 @@ setup: @echo "✅ You can use "make build" to build Workbench" stable: -# flatpak --user run org.flatpak.Builder --delete-build-dirs --disable-updates --build-only --ccache --force-clean flatpak build-aux/re.sonny.Workbench.json - flatpak-builder --delete-build-dirs --disable-updates --build-only --ccache --force-clean flatpak build-aux/re.sonny.Workbench.json + foundry build build-aux/re.sonny.Workbench.json devel: -# flatpak --user run org.flatpak.Builder --delete-build-dirs --disable-updates --build-only --ccache --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json - flatpak-builder --delete-build-dirs --disable-updates --build-only --ccache --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json - + foundry build build-aux/re.sonny.Workbench.Devel.json build: devel cli: ./troll/gjspack/bin/gjspack src/cli/main.js --appid=re.sonny.Workbench.cli --prefix=/re/sonny/Workbench --resource-root=src/ --no-executable flatpak/files/share/re.sonny.Workbench.cli/ - cp src/cli/bin.js flatpak/files/bin/workbench-cli + cp src/cli/bin.js flatpak/files/bin/workbench-cli # FIXME lint: # JavaScript ./node_modules/.bin/eslint --max-warnings=0 src # Rust - ./build-aux/fun rustfmt --check --edition 2021 src/**/*.rs + foundry devenv -- rustfmt --check --edition 2021 $(ROOT)/src/**/*.rs # Python - ./build-aux/fun ruff check --config=src/langs/python/ruff.toml src/**/*.py - ./build-aux/fun ruff format --config=src/langs/python/ruff.toml --check src/**/*.py + foundry devenv -- ruff check --config=$(ROOT)/src/langs/python/ruff.toml $(ROOT)/src/**/*.py + foundry devenv -- ruff format --config=$(ROOT)/src/langs/python/ruff.toml --check $(ROOT)/src/**/*.py # Blueprint - ./build-aux/fun blueprint-compiler format src/**/*.blp - ./build-aux/fun workbench-cli check blueprint src/**/*.blp + foundry devenv -- blueprint-compiler format $(ROOT)/src/**/*.blp + foundry run -- workbench-cli check blueprint $(ROOT)/src/**/*.blp # Vala -# ./build-aux/fun workbench-cli check vala src/**/*.vala + # foundry run -- workbench-cli check vala $(ROOT)/src/**/*.vala # CSS - ./build-aux/fun workbench-cli check css src/**/*.css + foundry run -- workbench-cli check css $(ROOT)/src/**/*.css # Flatpak manifests flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions --user-exceptions ./build-aux/exceptions.json build-aux/re.sonny.Workbench.json flatpak run --user --command=flatpak-builder-lint org.flatpak.Builder manifest --exceptions --user-exceptions ./build-aux/exceptions.json build-aux/re.sonny.Workbench.Devel.json unit: - ./build-aux/fun gjs -m ./troll/tst/bin.js test/*.test.js + 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 @@ -61,20 +59,13 @@ unit: # flatpak run --env=G_DEBUG=fatal-criticals --command=appstream-util org.flatpak.Builder validate data/app.metainfo.xml test: unit lint - ./build-aux/fun workbench-cli ci demos/src/Welcome + 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 - ./build-aux/fun workbench-cli ci demos/src/* - -# Note that if you have Sdk extensions installed they will be used -# make sure to test without the sdk extensions installed -sandbox: setup - flatpak run org.flatpak.Builder --ccache --user --install --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json -# flatpak remove --noninteractive org.freedesktop.Sdk.Extension.rust-stable//25.08 org.freedesktop.Sdk.Extension.vala//25.08 org.freedesktop.Sdk.Extension.llvm20//25.08 - flatpak run --command="bash" re.sonny.Workbench.Devel + foundry run -- workbench-cli ci $(ROOT)/demos/src/* flatpak: flatpak run org.flatpak.Builder --ccache --force-clean flatpak build-aux/re.sonny.Workbench.Devel.json @@ -83,14 +74,3 @@ flatpak: flatpak run --command="desktop-file-validate" --filesystem=host:ro org.freedesktop.Sdk//25.08 flatpak/files/share/applications/re.sonny.Workbench.Devel.desktop # appstreamcli validate --override=release-time-missing=info /path/to/your/app.metainfo.xml flatpak run org.flatpak.Builder --run flatpak build-aux/re.sonny.Workbench.Devel.json bash - -# Sync with .gitignore -clean: - rm -f re.sonny.Workbench.Devel.flatpak - rm -f re.sonny.Workbench.flatpak - rm -rf _build - rm -rf .flatpak - rm -rf .flatpak-builder - rm -rf flatpak - rm -rf flatpak-builder - rm -rf repo diff --git a/Workbench.doap b/Workbench.doap index 83c33a3e5..adbfe0aed 100644 --- a/Workbench.doap +++ b/Workbench.doap @@ -23,7 +23,7 @@ Sonny Piers - + sonnyp diff --git a/build-aux/fun b/build-aux/fun deleted file mode 100755 index dfee6c60f..000000000 --- a/build-aux/fun +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -# fun stands for Flatpak Run -flatpak-builder --run $(dirname $0)/../flatpak $(dirname $0)/re.sonny.Workbench.Devel.json "$@" -# flatpak-builder --env=G_MESSAGES_DEBUG=workbench-cli --run flatpak build-aux/re.sonny.Workbench.Devel.json "$@" diff --git a/build-aux/wip/minimist.js b/build-aux/wip/minimist.js deleted file mode 100644 index c34298e8c..000000000 --- a/build-aux/wip/minimist.js +++ /dev/null @@ -1,308 +0,0 @@ -/* eslint-disable */ - -// https://github.com/minimistjs/minimist/blob/bedaa8b9ab5a901fa342aad4494cbbf676b11a21/index.js - -function hasKey(obj, keys) { - var o = obj; - keys.slice(0, -1).forEach(function (key) { - o = o[key] || {}; - }); - - var key = keys[keys.length - 1]; - return key in o; -} - -function isNumber(x) { - if (typeof x === "number") { - return true; - } - if (/^0x[0-9a-f]+$/i.test(x)) { - return true; - } - return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); -} - -function isConstructorOrProto(obj, key) { - return ( - (key === "constructor" && typeof obj[key] === "function") || - key === "__proto__" - ); -} - -export default function minimist(args, opts) { - if (!opts) { - opts = {}; - } - - var flags = { - bools: {}, - strings: {}, - unknownFn: null, - }; - - if (typeof opts.unknown === "function") { - flags.unknownFn = opts.unknown; - } - - if (typeof opts.boolean === "boolean" && opts.boolean) { - flags.allBools = true; - } else { - [] - .concat(opts.boolean) - .filter(Boolean) - .forEach(function (key) { - flags.bools[key] = true; - }); - } - - var aliases = {}; - - function isBooleanKey(key) { - if (flags.bools[key]) { - return true; - } - if (!aliases[key]) { - return false; - } - return aliases[key].some(function (x) { - return flags.bools[x]; - }); - } - - Object.keys(opts.alias || {}).forEach(function (key) { - aliases[key] = [].concat(opts.alias[key]); - aliases[key].forEach(function (x) { - aliases[x] = [key].concat( - aliases[key].filter(function (y) { - return x !== y; - }), - ); - }); - }); - - [] - .concat(opts.string) - .filter(Boolean) - .forEach(function (key) { - flags.strings[key] = true; - if (aliases[key]) { - [].concat(aliases[key]).forEach(function (k) { - flags.strings[k] = true; - }); - } - }); - - var defaults = opts.default || {}; - - var argv = { _: [] }; - - function argDefined(key, arg) { - return ( - (flags.allBools && /^--[^=]+$/.test(arg)) || - flags.strings[key] || - flags.bools[key] || - aliases[key] - ); - } - - function setKey(obj, keys, value) { - var o = obj; - for (var i = 0; i < keys.length - 1; i++) { - var key = keys[i]; - if (isConstructorOrProto(o, key)) { - return; - } - if (o[key] === undefined) { - o[key] = {}; - } - if ( - o[key] === Object.prototype || - o[key] === Number.prototype || - o[key] === String.prototype - ) { - o[key] = {}; - } - if (o[key] === Array.prototype) { - o[key] = []; - } - o = o[key]; - } - - var lastKey = keys[keys.length - 1]; - if (isConstructorOrProto(o, lastKey)) { - return; - } - if ( - o === Object.prototype || - o === Number.prototype || - o === String.prototype - ) { - o = {}; - } - if (o === Array.prototype) { - o = []; - } - if ( - o[lastKey] === undefined || - isBooleanKey(lastKey) || - typeof o[lastKey] === "boolean" - ) { - o[lastKey] = value; - } else if (Array.isArray(o[lastKey])) { - o[lastKey].push(value); - } else { - o[lastKey] = [o[lastKey], value]; - } - } - - function setArg(key, val, arg) { - if (arg && flags.unknownFn && !argDefined(key, arg)) { - if (flags.unknownFn(arg) === false) { - return; - } - } - - var value = !flags.strings[key] && isNumber(val) ? Number(val) : val; - setKey(argv, key.split("."), value); - - (aliases[key] || []).forEach(function (x) { - setKey(argv, x.split("."), value); - }); - } - - // Set booleans to false by default. - Object.keys(flags.bools).forEach(function (key) { - setArg(key, false); - }); - // Set booleans to user defined default if supplied. - Object.keys(defaults) - .filter(isBooleanKey) - .forEach(function (key) { - setArg(key, defaults[key]); - }); - var notFlags = []; - - if (args.indexOf("--") !== -1) { - notFlags = args.slice(args.indexOf("--") + 1); - args = args.slice(0, args.indexOf("--")); - } - - for (var i = 0; i < args.length; i++) { - var arg = args[i]; - var key; - var next; - - if (/^--.+=/.test(arg)) { - // Using [\s\S] instead of . because js doesn't support the - // 'dotall' regex modifier. See: - // http://stackoverflow.com/a/1068308/13216 - var m = arg.match(/^--([^=]+)=([\s\S]*)$/); - key = m[1]; - var value = m[2]; - if (isBooleanKey(key)) { - value = value !== "false"; - } - setArg(key, value, arg); - } else if (/^--no-.+/.test(arg)) { - key = arg.match(/^--no-(.+)/)[1]; - setArg(key, false, arg); - } else if (/^--.+/.test(arg)) { - key = arg.match(/^--(.+)/)[1]; - next = args[i + 1]; - if ( - next !== undefined && - !/^(-|--)[^-]/.test(next) && - !isBooleanKey(key) && - !flags.allBools - ) { - setArg(key, next, arg); - i += 1; - } else if (/^(true|false)$/.test(next)) { - setArg(key, next === "true", arg); - i += 1; - } else { - setArg(key, flags.strings[key] ? "" : true, arg); - } - } else if (/^-[^-]+/.test(arg)) { - var letters = arg.slice(1, -1).split(""); - - var broken = false; - for (var j = 0; j < letters.length; j++) { - next = arg.slice(j + 2); - - if (next === "-") { - setArg(letters[j], next, arg); - continue; - } - - if (/[A-Za-z]/.test(letters[j]) && next[0] === "=") { - setArg(letters[j], next.slice(1), arg); - broken = true; - break; - } - - if ( - /[A-Za-z]/.test(letters[j]) && - /-?\d+(\.\d*)?(e-?\d+)?$/.test(next) - ) { - setArg(letters[j], next, arg); - broken = true; - break; - } - - if (letters[j + 1] && letters[j + 1].match(/\W/)) { - setArg(letters[j], arg.slice(j + 2), arg); - broken = true; - break; - } else { - setArg(letters[j], flags.strings[letters[j]] ? "" : true, arg); - } - } - - key = arg.slice(-1)[0]; - if (!broken && key !== "-") { - if ( - args[i + 1] && - !/^(-|--)[^-]/.test(args[i + 1]) && - !isBooleanKey(key) - ) { - setArg(key, args[i + 1], arg); - i += 1; - } else if (args[i + 1] && /^(true|false)$/.test(args[i + 1])) { - setArg(key, args[i + 1] === "true", arg); - i += 1; - } else { - setArg(key, flags.strings[key] ? "" : true, arg); - } - } - } else { - if (!flags.unknownFn || flags.unknownFn(arg) !== false) { - argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg)); - } - if (opts.stopEarly) { - argv._.push.apply(argv._, args.slice(i + 1)); - break; - } - } - } - - Object.keys(defaults).forEach(function (k) { - if (!hasKey(argv, k.split("."))) { - setKey(argv, k.split("."), defaults[k]); - - (aliases[k] || []).forEach(function (x) { - setKey(argv, x.split("."), defaults[k]); - }); - } - }); - - if (opts["--"]) { - argv["--"] = notFlags.slice(); - } else { - notFlags.forEach(function (k) { - argv._.push(k); - }); - } - - return argv; -} diff --git a/build-aux/wip/run.js b/build-aux/wip/run.js deleted file mode 100755 index 5e0643f97..000000000 --- a/build-aux/wip/run.js +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env -S gjs -m - -import Gio from "gi://Gio"; -import { exit, programArgs, programInvocationName } from "system"; -import GLib from "gi://GLib"; -import minimist from "./minimist.js"; - -// export G_MESSAGES_DEBUG=Gjs-Console && ./run.js - -Gio._promisify( - Gio.File.prototype, - "load_contents_async", - "load_contents_finish", -); - -Gio._promisify( - Gio.Subprocess.prototype, - "wait_check_async", - "wait_check_finish", -); - -const path = GLib.get_current_dir(); -console.debug(programInvocationName, programArgs); -const argv = minimist(programArgs, { boolean: true, "--": true }); -console.debug(argv); - -const [manifest_path] = argv._; -if (!manifest_path) { - // eslint-disable-next-line no-restricted-globals - print(`${programInvocationName} [--verbose] [--debug] MANIFEST [-- command]`); - exit(0); -} - -const home = GLib.get_home_dir(); - -const manifest_file = Gio.File.new_for_path(manifest_path); -const [contents] = await manifest_file.load_contents_async(null); -const manifest = JSON.parse(new TextDecoder().decode(contents)); - -// console.log(JSON.parse(manifest)); - -const flatpak_id = manifest.id; -// We assume the last module is the app itself -const app_module = manifest.modules.at(-1); - -function exists(path) { - const result = Gio.File.new_for_path(path).query_exists(null); - console.debug(`${path} ${result ? "exists" : "non existant"}`); - return result; -} - -if (!exists(`${path}/.flatpak/repo`)) { - const { runtime, sdk } = manifest; - const runtime_version = manifest["runtime-version"]; - // initializes repo - await run([ - "flatpak", - "build-init", - `${path}/.flatpak/repo`, - flatpak_id, - sdk, - runtime, - runtime_version, - ]); -} - -const prefix = [ - "flatpak-builder", - "--ccache", - "--force-clean", - "--disable-updates", -]; -const suffix = [ - `--state-dir=${path}/.flatpak/flatpak-builder`, - `--stop-at=${app_module.name}`, - `${path}/.flatpak/repo`, - Gio.File.new_for_path(path).get_relative_path(manifest_file), -]; - -// de-initializes -async function downloadSources() { - await run([...prefix, "--download-only", ...suffix]); -} - -// de-initializes -async function buildModules() { - await run([ - ...prefix, - "--disable-download", - "--build-only", - "--keep-build-dirs", - ...suffix, - ]); -} - -if (!exists(`${path}/.flatpak/flatpak-builder`)) { - await downloadSources(); - await buildModules(); -} - -// builds workbench -if (!exists(`${path}/_build`)) { - await buildModules(); - await buildCommand([ - "meson", - "--prefix", - "/app", - "_build", - "-Dprofile=development", - ]); -} - -await buildCommand(["meson", "install", "-C", "_build"]); -// await buildCommand([ -// `troll/gjspack/bin/gjspack`, -// `--appid=${flatpak_id}`, -// "--prefix=/re/sonny/Workbench", -// `--project-root=.`, -// `--resource-root=./src`, -// "--blueprint-compiler=/app/bin/blueprint-compiler", -// "--no-executable", -// `${path}/src/main.js`, -// `/app/share/${flatpak_id}.src.gresource`, -// ]); - -// starts workbench -const command = argv["--"].length ? argv["--"] : [manifest.command]; -await runCommand(command); - -function buildCommand(argv) { - let PATH = - "/app/bin:/app/bin:/app/bin:/usr/bin:${home}/.var/app/com.visualstudio.code/data/node_modules/bin:/app/bin:/usr/bin"; - const append_path = manifest["build-options"]?.["append-path"]; - if (append_path) PATH += `:${append_path}`; - - let LD_LIBRARY_PATH = "/app/lib:/app/lib"; - const append_ld_library_path = - manifest["build-options"]?.["append-ls-library-path"]; - if (append_ld_library_path) LD_LIBRARY_PATH += `:${append_ld_library_path}`; - - const PKG_CONFIG_PATH = - "/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:/app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig"; - - return run([ - "flatpak", - "build", - "--share=network", - `--filesystem=${path}`, - `--filesystem=${path}/.flatpak/repo`, - `--env=PATH=${PATH}`, - `--env=LD_LIBRARY_PATH=${LD_LIBRARY_PATH}`, - `--env=PKG_CONFIG_PATH=${PKG_CONFIG_PATH}`, - `--filesystem=${path}/_build`, - `${path}/.flatpak/repo`, - ...argv, - ]); -} - -async function runCommand(argv) { - await exec( - [ - "flatpak", - "build", - "--with-appdir", - "--allow=devel", - `--bind-mount=/run/user/1000/doc=/run/user/1000/doc/by-app/${flatpak_id}`, - ...manifest["finish-args"], - - // Non default permissions, see Permissions.js - // consider getting installed overrides instead with - // flatpak override --user --show re.sonny.Workbench.Devel - "--share=network", - "--socket=pulseaudio", - "--device=input", - - "--talk-name=org.freedesktop.portal.*", - "--talk-name=org.a11y.Bus", - "--bind-mount=/run/flatpak/at-spi-bus=/run/user/1000/at-spi/bus", - "--env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus", - ...getHostEnv(), - "--bind-mount=/run/host/fonts=/usr/share/fonts", - "--bind-mount=/run/host/fonts-cache=/usr/lib/fontconfig/cache", - `--filesystem=${home}/.local/share/fonts:ro`, - `--filesystem=${home}/.cache/fontconfig:ro`, - `--bind-mount=/run/host/user-fonts-cache=${home}/.cache/fontconfig`, - `--bind-mount=/run/host/font-dirs.xml=${home}/.cache/font-dirs.xml`, - `${path}/.flatpak/repo`, - ...argv, - ], - { verbose: true }, - ); -} - -function getHostEnv() { - // https://github.com/bilelmoussaoui/flatpak-vscode/blob/6424e7d8f53924faa33c9043153e08b0aedf6225/src/utils.ts#L88 - const forwarded_env_keys = [ - "COLORTERM", - "DESKTOP_SESSION", - "LANG", - "WAYLAND_DISPLAY", - "XDG_CURRENT_DESKTOP", - "XDG_SEAT", - "XDG_SESSION_DESKTOP", - "XDG_SESSION_ID", - "XDG_SESSION_TYPE", - "XDG_VTNR", - "AT_SPI_BUS_ADDRESS", - ]; - - const env_vars = []; - forwarded_env_keys.forEach((key) => { - const value = GLib.getenv(key); - if (value === undefined) env_vars.push(key + "=" + value); - }); - - return env_vars; -} - -async function run(_) { - return exec(_, { verbose: argv.verbose }); -} - -async function exec(argv, { cancellable = null /*, verbose = false*/ }) { - argv = argv.map((arg) => { - return arg.toString(); - }); - - console.debug(`$ ${argv.join(" ")}`); - - let cancelId = 0; - - // meson uses stdout for logs - // const flags = verbose - // ? Gio.SubprocessFlags.NONE - // : Gio.SubprocessFlags.STDOUT_SILENCE; - - const flags = Gio.SubprocessFlags.NONE; - - const proc = new Gio.Subprocess({ - argv, - flags, - }); - proc.init(cancellable); - - if (cancellable instanceof Gio.Cancellable) - cancelId = cancellable.connect(() => proc.force_exit()); - - try { - const success = await proc.wait_check_async(null); - - if (!success) { - const status = proc.get_exit_status(); - throw new Gio.IOErrorEnum({ - code: Gio.IOErrorEnum.FAILED, - message: `Command '${argv}' failed with exit code ${status}`, - }); - } - } catch (err) { - console.debug(err); - exit(1); - } finally { - if (cancelId > 0) cancellable.disconnect(cancelId); - } -} diff --git a/build-aux/wip/run.sh b/build-aux/wip/run.sh deleted file mode 100755 index fda3b89f2..000000000 --- a/build-aux/wip/run.sh +++ /dev/null @@ -1,34 +0,0 @@ -set -eux - -flatpak_id=re.sonny.Workbench.Devel -path=/home/sonny/Projects/Workbench -manifest=$path/build-aux/$flatpak_id.json -module_name=Workbench -command=workbench - -function run_build_command { - flatpak build --share=network --filesystem=$path --filesystem=$path/.flatpak/repo --env=PATH=/app/bin:/app/bin:/app/bin:/usr/bin:/home/sonny/.var/app/com.visualstudio.code/data/node_modules/bin:/app/bin:/usr/bin:/usr/lib/sdk/vala/bin:/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/node20/bin:/usr/lib/sdk/typescript/bin --env=LD_LIBRARY_PATH=/app/lib:/app/lib:/usr/lib/sdk/vala/lib --env=PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:/app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig --filesystem=$path/_build $path/.flatpak/repo $1 -} - -if [ ! -d "$path/.flatpak/repo" ]; then - # initializes repo - flatpak build-init $path/.flatpak/repo $flatpak_id org.gnome.Sdk org.gnome.Sdk 47 -fi - -if [ ! -d "$path/.flatpak/flatpak-builder" ]; then - # downloads sources (de-initializes) - flatpak-builder --ccache --force-clean --disable-updates --download-only --state-dir=$path/.flatpak/flatpak-builder --stop-at=$module_name $path/.flatpak/repo $manifest - # builds modules (de-initializes) - flatpak-builder --ccache --force-clean --disable-updates --disable-download --build-only --keep-build-dirs --state-dir=$path/.flatpak/flatpak-builder --stop-at=$module_name $path/.flatpak/repo $manifest -fi - -# builds Workbench module -if [ ! -d "$path/_build" ]; then - run_build_command "meson --prefix /app _build -Dprofile=development" -else - time run_build_command "meson install -C _build" - # time run_build_command "$path/troll/gjspack/bin/gjspack --appid=$flatpak_id --prefix=/re.sonny.Workbench --project-root=$path --resource-root=$path/src --blueprint-compiler=/app/bin/blueprint-compiler --no-executable $path/src/main.js /app/share/$flatpak_id.src.gresource" -fi - -# starts workbench -flatpak build --with-appdir --allow=devel --bind-mount=/run/user/1000/doc=/run/user/1000/doc/by-app/$flatpak_id --share=ipc --socket=fallback-x11 --socket=wayland --device=dri --share=network --socket=pulseaudio --talk-name='org.freedesktop.portal.*' --talk-name=org.a11y.Bus --bind-mount=/run/flatpak/at-spi-bus=/run/user/1000/at-spi/bus --env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus --env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus --env=COLORTERM=truecolor --env=DESKTOP_SESSION=gnome --env=LANG=en_US.UTF-8 --env=WAYLAND_DISPLAY=wayland-0 --env=XDG_CURRENT_DESKTOP=GNOME --env=XDG_SESSION_DESKTOP=gnome --env=XDG_SESSION_TYPE=wayland --bind-mount=/run/host/fonts=/usr/share/fonts --bind-mount=/run/host/fonts-cache=/usr/lib/fontconfig/cache --filesystem=/home/sonny/.local/share/fonts:ro --filesystem=/home/sonny/.cache/fontconfig:ro --bind-mount=/run/host/user-fonts-cache=/home/sonny/.cache/fontconfig --bind-mount=/run/host/font-dirs.xml=/home/sonny/.cache/font-dirs.xml $path/.flatpak/repo $command diff --git a/data/app.metainfo.xml b/data/app.metainfo.xml index e9eac2d64..68a88ec14 100644 --- a/data/app.metainfo.xml +++ b/data/app.metainfo.xml @@ -6,7 +6,7 @@ Sonny Piers - sonnyp@gnome.org + workbench@sonny.re CC0-1.0 GPL-3.0 Prototype with GNOME technologies diff --git a/package-lock.json b/package-lock.json index cfd2d6c3b..7e2d92bf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,6 +74,7 @@ "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", @@ -703,6 +704,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -967,6 +969,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001663", "electron-to-chromium": "^1.5.28", @@ -1397,6 +1400,7 @@ "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", @@ -3351,6 +3355,7 @@ "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" }, @@ -3521,6 +3526,7 @@ "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" }, @@ -4338,6 +4344,7 @@ "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", @@ -4806,7 +4813,8 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true + "dev": true, + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -4979,6 +4987,7 @@ "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", @@ -5285,6 +5294,7 @@ "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", @@ -6656,7 +6666,8 @@ "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 + "dev": true, + "peer": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -6760,6 +6771,7 @@ "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/cli/README.md b/src/cli/README.md index c51c3fc30..5474ea762 100644 --- a/src/cli/README.md +++ b/src/cli/README.md @@ -7,6 +7,8 @@ It exposes the formatter and linter used in Workbench for the different language ## Hack ```sh +# Build make cli -./build-aux/fun workbench-cli ci demos/src/* +# Run +foundry run -- workbench-cli ci demos/src/* ```