From 929e0fea9f5ae1002e277ac5797da6f8da1e5b78 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 06:41:32 +0700 Subject: [PATCH 01/26] feat(obs-integration): add OBS integration plugin --- .../obs-integration-thumbnail.webp | Bin 0 -> 46182 bytes obs-integration/panel.luau | 942 ++++++++++++++++++ obs-integration/plugin.toml | 36 + obs-integration/translations/en.json | 37 + obs-integration/widget.luau | 46 + 5 files changed, 1061 insertions(+) create mode 100644 obs-integration/obs-integration-thumbnail.webp create mode 100644 obs-integration/panel.luau create mode 100644 obs-integration/plugin.toml create mode 100644 obs-integration/translations/en.json create mode 100644 obs-integration/widget.luau diff --git a/obs-integration/obs-integration-thumbnail.webp b/obs-integration/obs-integration-thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e64bd5997bbe8d0ddb159119936caadc4695af8 GIT binary patch literal 46182 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∓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 a&2SyO@7t0ZD%PPYMI|&DzB5Le27mza5c1ss literal 0 HcmV?d00001 diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau new file mode 100644 index 00000000..3cf71904 --- /dev/null +++ b/obs-integration/panel.luau @@ -0,0 +1,942 @@ +--!nonstrict + +local OSC_CONFIG = noctalia.expandPath("~/.config/osc/oscrc") +local CACHE_FILE = "projects_cache.json" +local NAV_FILE = "nav_state.json" + +local projects = {} +local packages = {} +local selectedProject = nil +local selectedPackage = nil +local packageFilter = "" +local projectFilter = "" +local sortAsc = true +local editFilesOpen = false +local filesOpen = false +local packageFiles = {} +local rebuildArches = {} +local rebuildArchIndex = 0 +local maintainerMap = {} +local ownedProjects = {} +local projectsLoading = false +local packagesLoading = false +local errorText = "" +local pendingProject = nil +local removeConfirm = false +local restoreProject = nil +local restorePackage = nil +local saveCache +local saveNav +local maybeVerify + +local ownedDone = false +local oscUser = nil + +local function shellQuote(value) + return "'" .. tostring(value):gsub("'", "'\\''") .. "'" +end + +-- OBS project/package identifiers: reject anything that could escape the +-- checkout dir or inject into shell commands (slashes, dots-as-prefix, spaces). +local function validName(value) + return type(value) == "string" + and value ~= "" + and not value:find("/", 1, true) + and value:match("^[%w:.+%-_]+$") ~= nil +end + +local function resolveCheckoutDir() + local checkoutDir = noctalia.getConfig("checkout_dir") or "~/OBS" + return noctalia.expandPath(checkoutDir) +end + +local function parseLines(stdout) + local out = {} + for line in tostring(stdout or ""):gmatch("[^\n]+") do + line = noctalia.string.trim(line) + if line ~= "" then + table.insert(out, line) + end + end + return out +end + +local function filterList(list, filter, ascending) + local lower = filter:lower() + local filtered = {} + if filter == "" then + for _, name in ipairs(list) do + table.insert(filtered, name) + end + else + for _, name in ipairs(list) do + if name:lower():find(lower, 1, true) then + table.insert(filtered, name) + end + end + end + table.sort(filtered, function(a, b) + if ascending then + return a < b + else + return a > b + end + end) + return filtered +end + +local function configureOsc() + noctalia.runInTerminal("osc version") +end + +local function checkoutPackage(project, pkg) + if not validName(project) or not validName(pkg) then + return + end + noctalia.runInTerminal( + "cd " .. shellQuote(resolveCheckoutDir()) .. " && osc co " .. shellQuote(project) .. " " .. shellQuote(pkg) + ) +end + +local function editProjectMeta(project) + if not validName(project) then + return + end + noctalia.runInTerminal("osc meta prj " .. shellQuote(project) .. " -e") +end + +local function editPackageMeta(project, pkg) + if not validName(project) or not validName(pkg) then + return + end + noctalia.runInTerminal("osc meta pkg " .. shellQuote(project) .. " " .. shellQuote(pkg) .. " -e") +end + +local function rebuildPackage(project, pkg, arch) + if not validName(project) or not validName(pkg) then + return + end + local cmd = "osc rebuild " .. shellQuote(project) .. " " .. shellQuote(pkg) + if arch ~= nil and arch ~= "All" and arch ~= "" then + cmd = cmd .. " -a " .. shellQuote(arch) + end + noctalia.runInTerminal(cmd) +end + +local function loadPackageFiles(pkgDir, pkg) + noctalia.runAsync( + "find " .. shellQuote(pkgDir) .. " -maxdepth 1 -not -name '.*' -printf '%f\\n'", + function(result) + local list = {} + if result.exitCode == 0 then + for _, f in ipairs(parseLines(result.stdout)) do + if f ~= pkg and f ~= ".osc" then + table.insert(list, f) + end + end + end + table.sort(list) + packageFiles = list + render() + end, + 5000 + ) +end + +local function loadRebuildArches(project, pkg) + noctalia.runAsync("osc results " .. shellQuote(project) .. " " .. shellQuote(pkg), function(result) + local arches = {} + local seen = {} + if result.exitCode == 0 then + for line in tostring(result.stdout):gmatch("[^\n]+") do + line = noctalia.string.trim(line) + local _, _, repo, arch = line:find("^(%S+)%s+(%S+)") + if repo ~= nil and arch ~= nil and not seen[arch] then + seen[arch] = true + table.insert(arches, arch) + end + end + end + table.sort(arches) + rebuildArches = arches + rebuildArchIndex = 0 + render() + end, 15000) +end + +local function removeFileLocal(path, pkgDir, pkg) + noctalia.runAsync("rm " .. shellQuote(path), function(result) + if result.exitCode == 0 then + loadPackageFiles(pkgDir, pkg) + else + errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) + render() + end + end, 15000) +end + +local function editFile(path, pkgDir, pkg, filename) + if not validName(pkg) then + return + end + if filename:match("%.changes$") then + noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc vc") + else + noctalia.runInTerminal("${EDITOR:-nano} " .. shellQuote(path)) + end +end + +local function oscAddRemove(pkgDir) + noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc ar") +end + +local function oscCommit(pkgDir) + noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc ci") +end + +local function removePackageLocal(project, pkg) + if not validName(project) or not validName(pkg) then + return + end + local checkoutDir = resolveCheckoutDir() + local projectDir = checkoutDir .. "/" .. project + local pkgDir = projectDir .. "/" .. pkg + local cmd = "rm -rf " .. shellQuote(pkgDir) + .. "\nif ! ls -A " .. shellQuote(projectDir) .. " | grep -q -v '^\\.osc$'; then rm -rf " .. shellQuote(projectDir) .. "; fi" + noctalia.runAsync(cmd, function(result) + if result.exitCode ~= 0 then + errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) + render() + end + end, 15000) + selectedPackage = nil + removeConfirm = false + render() + saveNav() +end + +local function loadPackages(project) + selectedProject = project + selectedPackage = nil + packageFilter = "" + editFilesOpen = false + filesOpen = false + packageFiles = {} + removeConfirm = false + packages = maintainerMap[project] or {} + + if #packages == 0 and projectsLoading then + pendingProject = project + packagesLoading = true + render() + return + end + + if #packages == 0 and ownedProjects[project] then + packagesLoading = true + render() + noctalia.runAsync("osc ls " .. shellQuote(project), function(result) + packagesLoading = false + if result.exitCode == 0 then + packages = parseLines(result.stdout) + maintainerMap[project] = packages + saveCache() + errorText = "" + elseif errorText == "" then + errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) + end + render() + end, 15000) + saveNav() + return + end + + packagesLoading = false + errorText = "" + render() + saveNav() +end + +local function cachePath() + local dir, _ = noctalia.pluginDataDir() + if not dir then + return nil + end + return dir .. "/" .. CACHE_FILE +end + +local function navPath() + local dir, _ = noctalia.pluginDataDir() + if not dir then + return nil + end + return dir .. "/" .. NAV_FILE +end + +saveNav = function() + local path = navPath() + if not path then + return + end + noctalia.writeFile(path, noctalia.json.encode({ + project = selectedProject, + package = selectedPackage, + })) +end +local function readNav() + local path = navPath() + if not path or not noctalia.fileExists(path) then + return nil, nil + end + local data, _ = noctalia.readFile(path) + if not data then + return nil, nil + end + local parsed, _ = noctalia.json.decode(data) + if type(parsed) ~= "table" then + return nil, nil + end + return parsed.project, parsed.package +end + +saveCache = function() + local path = cachePath() + if not path or #projects == 0 then + return + end + local ownedList = {} + for project in pairs(ownedProjects) do + table.insert(ownedList, project) + end + noctalia.writeFile(path, noctalia.json.encode({ + owned = ownedList, + packages = maintainerMap, + })) +end + +local function prefetchOwnedPackages() + for project in pairs(ownedProjects) do + if not maintainerMap[project] then + noctalia.runAsync("osc ls " .. shellQuote(project), function(result) + if result.exitCode == 0 and not maintainerMap[project] then + local list = parseLines(result.stdout) + maintainerMap[project] = list + saveCache() + if selectedProject == project then + packages = list + packagesLoading = false + errorText = "" + render() + end + end + end, 15000) + end + end +end + +local function readCache() + local path = cachePath() + if not path or not noctalia.fileExists(path) then + return false + end + local data, _ = noctalia.readFile(path) + if not data then + return false + end + local parsed, _ = noctalia.json.decode(data) + if type(parsed) ~= "table" then + return false + end + local cachedPkgs = parsed.packages + local cachedOwned = parsed.owned + if type(cachedPkgs) ~= "table" or type(cachedOwned) ~= "table" then + return false + end + for key, list in pairs(cachedPkgs) do + if type(key) ~= "string" or type(list) ~= "table" then + return false + end + end + maintainerMap = cachedPkgs + ownedProjects = {} + for _, project in ipairs(cachedOwned) do + ownedProjects[project] = true + end + projects = {} + local seen = {} + for project in pairs(maintainerMap) do + projects[#projects + 1] = project + seen[project] = true + end + for project in pairs(ownedProjects) do + if not seen[project] then + projects[#projects + 1] = project + end + end + table.sort(projects) + return true +end + +local function finalize() + local merged = {} + for project in pairs(ownedProjects) do + merged[project] = true + end + for project in pairs(maintainerMap) do + merged[project] = true + end + projects = {} + for project in pairs(merged) do + table.insert(projects, project) + end + table.sort(projects) + + saveCache() + + local deferred = pendingProject + pendingProject = nil + projectsLoading = false + if deferred then + loadPackages(deferred) + return + end + render() + prefetchOwnedPackages() +end + +local function loadProjects(clearNav) + readCache() + + selectedProject = nil + selectedPackage = nil + packages = {} + projectFilter = "" + pendingProject = nil + projectsLoading = true + errorText = "" + ownedDone = false + + if restoreProject then + local proj = restoreProject + local pkg = restorePackage + restoreProject = nil + restorePackage = nil + if proj and (maintainerMap[proj] or ownedProjects[proj]) then + projectsLoading = false + loadPackages(proj) + if pkg then + selectedPackage = pkg + render() + saveNav() + loadRebuildArches(proj, pkg) + return + end + end + end + + render() + if clearNav then + saveNav() + end + + noctalia.runAsync("osc search --project --maintainer --csv", function(result) + if result.exitCode == 0 then + ownedProjects = {} + for _, line in ipairs(parseLines(result.stdout)) do + ownedProjects[line] = true + end + end + ownedDone = true + maybeVerify() + end) + + if oscUser == nil then + noctalia.runAsync("osc who | cut -d: -f1", function(userResult) + if userResult.exitCode == 0 then + oscUser = noctalia.string.trim(userResult.stdout) + end + maybeVerify() + end, 15000) + end +end + +maybeVerify = function() + if not ownedDone then + return + end + + if oscUser == nil then + noctalia.runAsync("osc who | cut -d: -f1", function(userResult) + if userResult.exitCode == 0 then + oscUser = noctalia.string.trim(userResult.stdout) + end + maybeVerify() + end, 15000) + return + end + + if oscUser == "" then + finalize() + return + end + + local url = "/search/package_id?match=person/@userid='" .. oscUser .. "' and person/@role='maintainer'" + noctalia.runAsync("osc api " .. shellQuote(url), function(verifyResult) + if verifyResult.exitCode == 0 then + maintainerMap = {} + for line in tostring(verifyResult.stdout):gmatch("[^\n]+") do + local project, name = line:match(" Date: Sun, 2 Aug 2026 06:57:40 +0700 Subject: [PATCH 02/26] docs(obs-integration): add README.md --- obs-integration/README.md | 78 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 obs-integration/README.md diff --git a/obs-integration/README.md b/obs-integration/README.md new file mode 100644 index 00000000..f54331d5 --- /dev/null +++ b/obs-integration/README.md @@ -0,0 +1,78 @@ +# OBS Integration + +Manage openSUSE Build Service projects and packages from Noctalia. The bar +widget toggles a panel for browsing your projects, checking out packages, +editing metadata and files, and triggering rebuilds on OBS — without leaving +the shell. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `neyfua/obs-integration` | +| Entries | Bar widget: `obs-integrate`; panel: `panel` | + +## Requirements + +Install the openSUSE Build Service `osc` CLI on `PATH` and configure your +credentials in `~/.config/osc/oscrc` (for example with `osc apiservice` setup +or by copying a working `oscrc`). The plugin shells out to `osc` for every +operation, so all authentication stays in your normal OBS configuration. + +## Usage + +Add the `obs-integrate` widget to a bar. Left-click it to open the panel. + +Open the panel directly with: + +```sh +noctalia msg panel-toggle neyfua/obs-integration:panel +``` + +### My Projects + +The panel opens on **My Projects**: every project you maintain, plus every +project where you are listed as a package maintainer on OBS. Search filters the +list, and the sort button toggles A-Z / Z-A order. The pen icon edits the +project metadata (`osc meta prj -e`). + +### Inside a project + +Click a project to list its packages. A package's icon turns **primary** when +that package is checked out in your local directory. Click a package to open +its actions: + +- **Checkout package** — `osc co` in the configured checkout directory + (hidden once the package is already checked out). +- **Edit files** — expandable list of editable sources: `_service` and the + package's `.spec` open in your `$EDITOR`; the `.changes` file runs + `osc vc`. +- **Files** — lists every non-dotfile in the checkout. Each file has a remove + button; below the list, **Add/Remove** runs `osc ar` and **Commit** runs + `osc ci`, both in a terminal so you can watch progress or edit the commit + message. +- **Rebuild package** — pick an architecture (or **All**) and trigger + `osc rebuild`. +- **Edit package meta** — `osc meta pkg -e` in a terminal. +- **Remove package** — deletes the checkout from disk only (never touches the + OBS project); confirm before it runs. If it was the last package in the + project directory, the directory is removed too. + +### Sticky navigation + +The panel reopens where you left off — inside the same project or package. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `checkout_dir` | `string` | `~/OBS` | Base directory where packages are checked out. Packages land in `//`. | +| `show_label` | `bool` | `false` | Show the "OBS" label next to the bar icon. | + +## Notes + +The plugin runs the `osc` CLI with your existing credentials — it stores +nothing itself beyond a small cache of project/package listings and your last +navigated view. Removal is local-only and never modifies the OBS project. +Rebuilds and commits are real OBS operations and open a terminal so you can +confirm what `osc` reports. From b6ab7ff99ad4f4ed1c3123b354626b5e1a5704d9 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 07:05:01 +0700 Subject: [PATCH 03/26] chore(obs-integration): rename obs-integration-thumbnail.webp to thumbnail.webp --- ...bs-integration-thumbnail.webp => thumbnail.webp} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename obs-integration/{obs-integration-thumbnail.webp => thumbnail.webp} (100%) diff --git a/obs-integration/obs-integration-thumbnail.webp b/obs-integration/thumbnail.webp similarity index 100% rename from obs-integration/obs-integration-thumbnail.webp rename to obs-integration/thumbnail.webp From 121ee2e20c8324aa512910e4970197510778bab2 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 07:18:13 +0700 Subject: [PATCH 04/26] i18n(obs-integration): fix PR check --- obs-integration/translations/en.json | 80 ++++++++++++++++------------ 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index 21ac1db8..89543ca7 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -1,37 +1,47 @@ { - "settings.show_label.label": "Show label", - "settings.show_label.description": "Show the OBS label next to the icon.", - "settings.checkout_dir.label": "Package checkout directory", - "settings.checkout_dir.description": "Directory where packages will be checked out.", - "panel.my_projects": "My Projects", - "panel.search_projects": "Search projects...", - "panel.no_projects": "No projects found.", - "panel.no_packages": "No packages found.", - "panel.loading": "Loading...", - "panel.error": "OBS command failed", - "panel.retry": "Retry", - "panel.checkout": "Checkout package", - "panel.edit_files": "Edit files", - "panel.edit_meta": "Edit package meta", - "panel.rebuild": "Rebuild package", - "panel.remove": "Remove package", - "panel.confirm_remove": "Click to confirm removal", - "panel.edit_project_meta": "Edit project meta", - "panel.no_editable": "No editable files found.", - "panel.search_packages": "Search package...", - "panel.loading_packages": "Loading packages...", - "panel.architecture": "Architecture", - "panel.files": "Files", - "panel.no_files": "No files found.", - "panel.remove_file": "Remove file", - "panel.add_remove": "Add/Remove", - "panel.commit": "Commit", - "panel.osc_missing": "Open Build Service CLI not found", - "panel.osc_missing_hint": "Install the 'osc' package to start using this plugin.", - "panel.osc_not_configured": "OBS account not configured", - "panel.osc_not_configured_hint": "Create ~/.config/osc/oscrc before browsing projects.", - "panel.configure_oscrc": "Configure oscrc", - "widget.osc_missing": "OSC missing", - "widget.configure_obs": "Configure OBS", - "widget.obs": "OBS" + "settings": { + "show_label": { + "label": "Show label", + "description": "Show the OBS label next to the icon." + }, + "checkout_dir": { + "label": "Package checkout directory", + "description": "Directory where packages will be checked out." + } + }, + "panel": { + "my_projects": "My Projects", + "search_projects": "Search projects...", + "no_projects": "No projects found.", + "no_packages": "No packages found.", + "loading": "Loading...", + "error": "OBS command failed", + "retry": "Retry", + "checkout": "Checkout package", + "edit_files": "Edit files", + "edit_meta": "Edit package meta", + "rebuild": "Rebuild package", + "remove": "Remove package", + "confirm_remove": "Click to confirm removal", + "edit_project_meta": "Edit project meta", + "no_editable": "No editable files found.", + "search_packages": "Search...", + "loading_packages": "Loading packages...", + "architecture": "Architecture", + "files": "Files", + "no_files": "No files found.", + "remove_file": "Remove file", + "add_remove": "Add/Remove", + "commit": "Commit", + "osc_missing": "Open Build Service CLI not found", + "osc_missing_hint": "Install the 'osc' package to start using this plugin.", + "osc_not_configured": "OBS account not configured", + "osc_not_configured_hint": "Create ~/.config/osc/oscrc before browsing projects.", + "configure_oscrc": "Configure oscrc" + }, + "widget": { + "osc_missing": "OSC missing", + "configure_obs": "Configure OBS", + "obs": "OBS" + } } From 5cc1744e0a0e8e2a2727c423bb42ebdfdc193282 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:06:05 +0700 Subject: [PATCH 05/26] fix(obs-integration): honor selected rebuild architecture --- obs-integration/panel.luau | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 3cf71904..ba8ff5ce 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -734,7 +734,7 @@ function render() placeholder = noctalia.tr("panel.architecture"), flexGrow = 1, onChange = function(index) - rebuildArchIndex = index + rebuildArchIndex = tonumber(index) render() end, }), @@ -743,7 +743,7 @@ function render() glyph = "refresh", variant = "default", onClick = function() - local arch = rebuildOptions[rebuildArchIndex] + local arch = rebuildOptions[rebuildArchIndex + 1] rebuildPackage(selectedProject, selectedPackage, arch) end, }), From 1a8fb95880ed751621691d18deb2488b0c739237 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:07:33 +0700 Subject: [PATCH 06/26] fix(obs-integration): reject dot-prefixed names in validName --- obs-integration/panel.luau | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index ba8ff5ce..d9a49587 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -37,12 +37,13 @@ local function shellQuote(value) end -- OBS project/package identifiers: reject anything that could escape the --- checkout dir or inject into shell commands (slashes, dots-as-prefix, spaces). +-- checkout dir or inject into shell commands (slashes, leading dots, spaces). local function validName(value) return type(value) == "string" and value ~= "" and not value:find("/", 1, true) and value:match("^[%w:.+%-_]+$") ~= nil + and value:match("^%.") == nil end local function resolveCheckoutDir() From 30e81eb36315672c8b412e96e870dbe59cbe3e42 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:10:12 +0700 Subject: [PATCH 07/26] fix(obs-integration): treat empty checkout_dir as unset --- obs-integration/panel.luau | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index d9a49587..dfceac45 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -47,7 +47,10 @@ local function validName(value) end local function resolveCheckoutDir() - local checkoutDir = noctalia.getConfig("checkout_dir") or "~/OBS" + local checkoutDir = noctalia.getConfig("checkout_dir") + if type(checkoutDir) ~= "string" or checkoutDir:match("^%s*$") then + checkoutDir = "~/OBS" + end return noctalia.expandPath(checkoutDir) end From e845be44d784544990e2b8686dd023046018136d Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:44:54 +0700 Subject: [PATCH 08/26] feat(obs-integration): add repo/arch rebuild selection with confirmation --- obs-integration/panel.luau | 200 +++++++++++++++++++++------ obs-integration/translations/en.json | 2 +- 2 files changed, 160 insertions(+), 42 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index dfceac45..e86cbf52 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -14,8 +14,14 @@ local sortAsc = true local editFilesOpen = false local filesOpen = false local packageFiles = {} -local rebuildArches = {} local rebuildArchIndex = 0 +local rebuildRepos = {} +local rebuildRepoIndex = 0 +local rebuildConfirm = false +local repoMap = {} +local savedRebuildRepo = nil +local savedRebuildArch = nil +local rebuildLoaded = false local maintainerMap = {} local ownedProjects = {} local projectsLoading = false @@ -116,11 +122,14 @@ local function editPackageMeta(project, pkg) noctalia.runInTerminal("osc meta pkg " .. shellQuote(project) .. " " .. shellQuote(pkg) .. " -e") end -local function rebuildPackage(project, pkg, arch) +local function rebuildPackage(project, pkg, repo, arch) if not validName(project) or not validName(pkg) then return end local cmd = "osc rebuild " .. shellQuote(project) .. " " .. shellQuote(pkg) + if repo ~= nil and repo ~= "All" and repo ~= "" then + cmd = cmd .. " -r " .. shellQuote(repo) + end if arch ~= nil and arch ~= "All" and arch ~= "" then cmd = cmd .. " -a " .. shellQuote(arch) end @@ -148,22 +157,62 @@ local function loadPackageFiles(pkgDir, pkg) end local function loadRebuildArches(project, pkg) + rebuildLoaded = false noctalia.runAsync("osc results " .. shellQuote(project) .. " " .. shellQuote(pkg), function(result) - local arches = {} - local seen = {} + local map = {} if result.exitCode == 0 then for line in tostring(result.stdout):gmatch("[^\n]+") do line = noctalia.string.trim(line) - local _, _, repo, arch = line:find("^(%S+)%s+(%S+)") - if repo ~= nil and arch ~= nil and not seen[arch] then - seen[arch] = true - table.insert(arches, arch) + local repo, arch, _, status = line:match("^(%S+)%s+(%S+)%s+(%S+)%s+(%S+)") + if repo ~= nil and arch ~= nil and status ~= "disabled" then + if not map[repo] then + map[repo] = {} + end + local found = false + for _, a in ipairs(map[repo]) do + if a == arch then + found = true + break + end + end + if not found then + table.insert(map[repo], arch) + end + end + end + end + local repos = {} + for repo in pairs(map) do + table.insert(repos, repo) + end + table.sort(repos) + for repo in pairs(map) do + table.sort(map[repo]) + end + repoMap = map + rebuildRepos = repos + local repoIndex = 0 + if savedRebuildRepo then + for i, repo in ipairs(repos) do + if repo == savedRebuildRepo then + repoIndex = i + break + end + end + end + rebuildRepoIndex = repoIndex + local archIndex = 0 + local repoArchs = savedRebuildRepo and map[savedRebuildRepo] or {} + if savedRebuildArch then + for i, arch in ipairs(repoArchs or {}) do + if arch == savedRebuildArch then + archIndex = i + break end end end - table.sort(arches) - rebuildArches = arches - rebuildArchIndex = 0 + rebuildArchIndex = archIndex + rebuildLoaded = true render() end, 15000) end @@ -227,6 +276,7 @@ local function loadPackages(project) filesOpen = false packageFiles = {} removeConfirm = false + rebuildConfirm = false packages = maintainerMap[project] or {} if #packages == 0 and projectsLoading then @@ -550,14 +600,20 @@ function render() editFilesOpen = false filesOpen = false packageFiles = {} - rebuildArches = {} rebuildArchIndex = 0 + rebuildRepos = {} + rebuildRepoIndex = 0 + repoMap = {} + savedRebuildRepo = nil + savedRebuildArch = nil + rebuildLoaded = false + rebuildConfirm = false removeConfirm = false render() saveNav() end, }), - ui.glyph({ name = "package", color = "primary", size = 18 }), + ui.glyph({ name = "package", color = checkedOut and "primary" or "on_surface", size = 18 }), ui.label({ text = selectedPackage, fontWeight = "bold", flexGrow = 1 }), } if checkedOut then @@ -724,35 +780,93 @@ function render() end end - local rebuildOptions = { "All" } - for _, arch in ipairs(rebuildArches) do - table.insert(rebuildOptions, arch) + local repoOptions = { "All" } + for _, repo in ipairs(rebuildRepos) do + table.insert(repoOptions, repo) + end + local selectedRepo = rebuildRepos[rebuildRepoIndex] + local archOptions = { "All" } + if selectedRepo then + for _, arch in ipairs(repoMap[selectedRepo] or {}) do + table.insert(archOptions, arch) + end + else + local seen = {} + for _, archs in pairs(repoMap) do + for _, arch in ipairs(archs) do + if not seen[arch] then + seen[arch] = true + table.insert(archOptions, arch) + end + end + end + table.sort(archOptions, function(a, b) + return a < b + end) + end + + if not rebuildLoaded then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.label({ text = noctalia.tr("panel.loading"), color = "on_surface_variant", flexGrow = 1 }), + ui.button({ + glyph = "refresh", + tooltip = noctalia.tr("panel.rebuild"), + variant = "default", + onClick = function() + loadRebuildArches(selectedProject, selectedPackage) + end, + }), + }) + ) + else + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.select({ + key = "rebuild-repo-" .. #repoOptions, + options = repoOptions, + selectedIndex = rebuildRepoIndex, + flexGrow = 1, + onChange = function(index) + rebuildRepoIndex = tonumber(index) + savedRebuildRepo = repoOptions[rebuildRepoIndex + 1] + rebuildArchIndex = 0 + savedRebuildArch = nil + render() + end, + }), + ui.select({ + key = "rebuild-arch-" .. tostring(selectedRepo) .. "-" .. #archOptions, + options = archOptions, + selectedIndex = rebuildArchIndex, + flexGrow = 1, + onChange = function(index) + rebuildArchIndex = tonumber(index) + savedRebuildArch = archOptions[rebuildArchIndex + 1] + render() + end, + }), + ui.button({ + glyph = rebuildConfirm and "check" or "refresh", + tooltip = rebuildConfirm and noctalia.tr("panel.confirm_rebuild") or noctalia.tr("panel.rebuild"), + variant = rebuildConfirm and "secondary" or "default", + onClick = function() + if rebuildConfirm then + local repo = repoOptions[rebuildRepoIndex + 1] + local arch = archOptions[rebuildArchIndex + 1] + rebuildPackage(selectedProject, selectedPackage, repo, arch) + rebuildConfirm = false + else + rebuildConfirm = true + end + render() + end, + }), + }) + ) end - table.insert( - body, - ui.row({ align = "center", gap = 8 }, { - ui.select({ - key = "rebuild-arch", - options = rebuildOptions, - selectedIndex = rebuildArchIndex, - placeholder = noctalia.tr("panel.architecture"), - flexGrow = 1, - onChange = function(index) - rebuildArchIndex = tonumber(index) - render() - end, - }), - ui.button({ - text = noctalia.tr("panel.rebuild"), - glyph = "refresh", - variant = "default", - onClick = function() - local arch = rebuildOptions[rebuildArchIndex + 1] - rebuildPackage(selectedProject, selectedPackage, arch) - end, - }), - }) - ) table.insert( body, @@ -841,6 +955,10 @@ function render() align = "left", onClick = function() selectedPackage = name + savedRebuildRepo = nil + savedRebuildArch = nil + rebuildLoaded = false + rebuildConfirm = false render() saveNav() loadRebuildArches(selectedProject, name) diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index 89543ca7..56e3b598 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -21,13 +21,13 @@ "edit_files": "Edit files", "edit_meta": "Edit package meta", "rebuild": "Rebuild package", + "confirm_rebuild": "Confirm rebuild", "remove": "Remove package", "confirm_remove": "Click to confirm removal", "edit_project_meta": "Edit project meta", "no_editable": "No editable files found.", "search_packages": "Search...", "loading_packages": "Loading packages...", - "architecture": "Architecture", "files": "Files", "no_files": "No files found.", "remove_file": "Remove file", From c3899ad95b80f648bd39f65e7bd70541f4d9a3ce Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:49:39 +0700 Subject: [PATCH 09/26] chore(obs-integration): add opensuse tag to plugin.toml --- obs-integration/plugin.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obs-integration/plugin.toml b/obs-integration/plugin.toml index b5823eac..e460e248 100644 --- a/obs-integration/plugin.toml +++ b/obs-integration/plugin.toml @@ -5,7 +5,7 @@ plugin_api = 9 author = "neyfua" license = "MIT" dependencies = ["osc"] -tags = ["productivity", "service", "utility"] +tags = ["productivity", "service", "utility", "opensuse"] icon = "buildings" description = "Manage your openSUSE Build Service projects and packages." From bb770688b75d59ec8198e35090ea0b6c99e705d2 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 18:49:56 +0700 Subject: [PATCH 10/26] chore(obs-integration): new thumbnail --- obs-integration/thumbnail.webp | Bin 46182 -> 46580 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obs-integration/thumbnail.webp b/obs-integration/thumbnail.webp index 8e64bd5997bbe8d0ddb159119936caadc4695af8..c7e91ebf6944133dc8b8ad3824239ac2009c2d51 100644 GIT binary patch literal 46580 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∓BZfEK+xLq0~63O)k)7Md9$-#yE!xnYVlhNIj!sh(4?}lWF~>{ zvTBzYnsU^iZ?XyCx+?39{Nnk}TN*}Z4wXgUNWl`1j%okWhL{yt*DQAR`ox%(frd|- z!^2QDzc4gs;xyZv|5vTExx25)sZW@?FJ5(EZZj8X0WzB*wFML8E?54|Va-?55Xd#A zg0Z&hG>JVT=Ea@+1g>H{=N6oVVBN^}Sy5aI$^YZ*q!MkbVmPD;T{FEAwcT8K95AVj z2+NeZL|&s}#?+}UlJXw#Cyx*n`%hPaSOCwAJ1x2Bb+C*nD1mER^MR)B%ob<(C}GBu zhhVugKBOl-8~Ty_jezm663?=EATrCnAJ&rz(=oDns}K_WBAm@#D*6y=g472xx!=18 zU1x$L6HsU6Y3+3q)!#tyIih*x_;$k`gR@rkery~RCw(!!4$<3ui>QcRWys~O_Lrgl z$G53!fyX;dQdn8SI64u!1++-0Pw=q2pV6boMQHVsI|B^Msu6oikbf-_Dvk#J)}O-- zTU+&R(DEN-8Vcnfa>NVz5gbvyO;JtL>0n2)Z&0dr=Ys8ZMBT_g)f2l;Rcyc+{fyCH zoXesBhnY9kC%rOnXK7L#VX{HT^45!RA+^y1#_)EtZBAoaL>i}}iS9s43Bg+z=y+?bEVkHaL zpnj%Sx&+*9UsH~&9WGeiE$5AX|PKim?DIA2V)G#MjVN}T#ljoEt z3i_deA5vMN66pGkOf$Ld2SA~2cv~Ghq2p{RWfwdNIN%u67?|?_-vw+LdN^PI^q$5` zlSe#I8k6#`T?i((HVw(=K%QA>55leW3Wh0hhBj@>O+pp_@g( zW}wSA5fARn6)+?$wS66aKBg-Th%e4NQ7#?H==x0vG%5&BKSA&bYaBAHydw4ha0C`~fKbM~~3Z%MFJ~cCa##dYc28Xqa(|HH$ zA^dT=}u@XOd?d91k}I=<72k@jR1gT`Cw~d^7sq#3smrg3Ey7?P zoHZCeJA)3$y1b=+atKQ%0)^)sbACs*m7La(vfGgJwVoCR7^hd=Scn*J%##s+jnpOT z^3r4)5h#Roz=e)oTIoF12%YH0YW~rf+bhl3X`tzF{DmvLWma;N1xOrX%|uabl3Jg( zN1(Ngm832jDufMNaUzR{&VRbZ@Q0A79?5I7$6D*>X5{iLeR%<4|D25AczUQKDwAm| ziJ@i=O^Ru`hw5lnv^{i8lsH}*r3HF0>$2c3X`p3g9v#Oq$X}QtG$#2W?-i1VFAd6W z-(ArLYb0@y%6;Wl<^-Tox78M|M3L9RZyW;eqhil7K9^Viei1!PI{eNzR-Wcj#+>ve z3({h^WyB&wPIKHNcnp&idHd`hhUiS=2CVf{hw%e0-|!ZaTb`la z4UBP)!^8|BlPy6KC807A3k+*n)EkQ~i~5F{vtiOLG6|X9Bm}bd27mRJ&}u`tb?C;z zi)}ozZ=>5s3jt(!Q!`1zXsL<=HLTYE5vqMID@_O~ ze$&XMW)*d$nADvwFlG~#M{6$`Gr1`}%v1MuaJ1`=?F)T?tDGC-%X5F^Px#Z1eivUo ztZ-UAoNDEX<13YoUB|>)BE5Pp$%v#U#M|s+*v2X2Nym_lv|I?@`8S2XHLRh%GZ%dFNqSadz1QJ&v_Rdl5i5W{ekpU-99 z!NeN0Y%8OJ`wpg04qdJGSHq(yOpB9ywa49$w1llp9dGgzF2#iT)VK^qPbkc>VSmBc z!3$>s(?(Iy3-*2ClR|_%P$_b5y7X#Unap5RD5*u6RWs)nNyGoT>~hJQ6*!|F`Sl|t zk>LEF^hkMmPOwN8aE!nZJa;=GW)P7(vz!FLxr4}j2(_37Qvxn4vOO=zOLz+)1G{GP z(sKVPr9C`hLQHo!SNgPX7ZEp?J^EVWkrffXTHBmfSfM))*cnNxmJ#!_X2cy}RWQ*= z7hWe?iEwjfrm2e}`M&rc`A5VCN17Zl$@#yd2&s%u$HulVo_XzWyzQ^n$4c6BcvN*9dGIT##R49*M;TLA%ppZ17wE|!PaXwbye^+UILl}L zy_z=WtYbnCbbU(mpdBK2^j|4;8b^QPmv4YdU8@0b7x_zCD?(!WF!Yr#-j$^JoZv?> zgQq8h$O6exieTE}hYSNqn*v`FI^b!t%Uny863=3pTaFcPquyCcQzGM2id<%xHzDKm zAWb0clGQ#8YPT@huGsz#igd2CuC31K-2+}bY=IUbyk{n;HAuMt{Ex)!sc+ma>=M7D zyzwx1u!He9n5?mI)J-!iJ}?J{Vk;5TTixc zCdw@&`UO_dwODgX1yj@*j8jC#DE#s4x`boX-tfZvi_F!h2|xbv5QrwpX0K4w92L{v zM)YT`i!`$&(kCeiq8J6^DipDE*=4z4QHS}biXVs+%GyCtfTs_zM~lF4PygB&W`EM+ zLKUA;A?MWF#el{Og66T-;1~~Nsmr6eb5h~kiKgk$Cyx;NREu{+Vkp0{Ybh)Cl_1Dz zDMr$B%du#@--+~W#AGjIEM*D(+kl3wywk=Cb~yxJJ0MkJB?5-U1MJ`cS>ZK?*#(R@nvf z65(l+6J?oQhpm|ad2a>O%pWLTEKi)D+k2SvDn<hZ5 z2v<;~m1JHL(~Y+1{bRHwe25na{^(cf?SP@{MaA&fVQfj}T(yhYJ>$F@Di7fOY$^<` zRq&^@LwpOeHjr_foRD0)6Ne#F4W!#{UK3*-vY>%De%Bc_gy!=mkm0Z?fnep4zj@@M z3uMX~{gu63m%T4b9UslGH-=FCoMUirAWNY8V|&lTw+_+sqLuUsVfqJ4PD4~N@+MGM z=gDrVNY(9b@b`H;)RSFTAyX1Og$~Yy>G??C@{=pQB=VW`#spP4RBrSGXmXXsNdUNN0!5A#oUaDg3Fm z!1|RzwDPcc$*ZC%7I$~cTdZd5wO$p%(w{0E3raY6K2w*m+>)!=X|+)f|DfsC#9oit z)eBlR#f@I?_IOo|u_?rJJcTdg^5gry-2IR5EP8COA zDj2O7ppybLSL0xT@JFfqd)EYCHJGn3wAM!7L4x2E=Byy?m9Y~9V5yPTpax|ua~c|E zYsU3(K5tHyeZ9O@z^N0_+Ftmlth?d!_b${m;nb~w$vdePDPAXI<71rfhaqYl^S6k^8+oIi6v@A;e4 z(0wO4LKnGv-gJNEf;pvDFk#}!!&3_9&Y9fVy1TTAMF56~Gf&f@Y|vutOiT}`7_`+6 zNK(%>OqMtKBuL#}o^-{!I=xPw-W|kD7i-nQX+{*cAuYn`i2Rx|H=VtQJ3tYjgJT%3 z5bTLOCV(jF$IHIZq)z$S5A4~VW7!qQ_uLMjCo*aAKBRrNnEh6b{R? zERjm4|71pU_ASn5sP`%)-v7T-c|f#l=rIa%qowYyeM~kQE{!|)-vExxbz^%_9vXT_ zP+hlxe%YPkGM0wXz({9mPjCBnz@UigvC!(rV&F?#+B@BprDM1ZG1KynIduz(5RN#% zY3~mSQZbnl0I=63XPw$79sj~x|27p!i;aE++;Wa2Oc(ch%!|KqQndKZp3+}=ruD3;cjJ`tk(jjd}?s1 z?-XpSqL?)|t|n`>^qLa6loiFR?0uF2XZmh(DQMsHRP9`TQ0haJK=+A3~6W)IPMj4q}PW z#u)~V9D^&vsG|zx77#>C;ak)x8uE@b-DWinUJOK!_W!>|MaVq)MD{9N6RJnV8u1G2% z2L#p&c5Y&`?8ML@-8N=Bs$Dy}XyMH^t0v9DJUjg!HIst$5{`dTF$s^l7^wqx;sPHI z%^Y;YVyghT5qd_Y6N@Uo*^R2Es{8UX+OJWlF<>;zvBW@v7Ev>=OVcRp2ykEK=LM!( z9JKI)FTl*?m9jYP>!oZwwuoGD4Mpv?u8^udf7$`ZIiLj|JV*2dvtg zbVC|j#oP(k%O@Z;Vqe(J#sS{V4V6+x809yN=)GwHh}<`#?PdPWUD%%-m_~c4VY_Xi zXUG;z{Ibc?aZ2gco^-raVwW(g28|`M1%{K`o>&bABA=}ZGY0}k5h&`L>5uxd#ogx2 zndh@lao3CUt=5l?Oc%HX^xc4Dp3o)RdM60>EdK(5~7S(*!Q9`7+@nn!UGmFN3 z!Pm6Si6OW}P?nSp(sn=E{{}oom-&iu+?zde3*L&#E$zJ_+79#*#6jFFkTl1=Z13*693P8@7iXa-aP&z`0~wrq{``@g?4>%Io7aL3&-(WoEF0GOVt$ck+%6jJ9HJ0LFVEqAVVGlxI7A%zp-sH69NkcDR-?5Vw2drEux2YwMTA8Of4=i z^EQ{lS0WG-_B>UnCruy-JS+P;Cp)c&m^b@2)Z*b2F!pkQ&fcA<%BrKE0^C`ohnY>m zGwjOK3=%G*%Sz`){n_8*T#wL)6=rjudvR-N;-9?5CYG-rbfw#U&9Q=V#e?0>HtmHb zQ9m5{RhSr@X@;<5@e5SXjGMDCYAs?6@om?M#)p_Cgi;a(0=oqmLS9b~!o)gOVS5S+ z7F_r45E_t^?Lh78`($mf`-^(^6j!_T-<-uzLG}!#3ZF}p*ipCO!NAV-7i1^2`W^t%G5_=r&e5pMy!0n2b|w810oDh@gHx?E9tzJZ5P6_BdZ3R^K2W zF=9F8i?Mys$D_s3xCPn8g~^!y{K^`{l?Ufk=Ci=0+Pu zC6JMyrS=nBREp?m-rt{wtPJi^wEUrv`>V<%kN_$ApJo@@=nsro7Ae6iusXe;7I%;h z*~s%GsQ@IpG_63JH)l9m-5SlFA+}zJxSeb)WaM*`ZMe{d%9y}2)r{WiuB%GMsP?i! z6(PyACEWWj;UBvwK1eFd&`Q(`ZUqw$2}})+qOh)Cvle#pG%?v%BF=Fjdq`46KIC{W z=^P$PpT?;4smT4_0>LUKSIh$e@}hhYoY*;vRSD4GxP=hlAqSVZc_e^c5J6JX5BH9; zuQPpj4_2t9$I_dTBR#MWfR5bUB|48ZaEwpMdp3g*_%qa z8cHsQlO|o?BroEyXe#XS5B(x?e$wvn>zdpmT z5vtdFEk9fhry&t1;M)Xvi1-v#tD?#7lKV$7$&~|naq8F8L9J}ArhHMbYId^fK7nyB zHMl?|+sDl@^bsBvWzV6~F_3k;78QagQ?L2bNfhcZE&%$*{tUt-{5qtoi_hO_;kjYi a&2SyO@7t0ZD%PPYMI|&DzB5Le27mza5c1ss From bf71a1713dfe87d0db3c7c7bc490aabe4c8adecd Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 19:12:09 +0700 Subject: [PATCH 11/26] fix(obs-integration): fix rebuild controls inheriting flexGrow from reused nodes --- obs-integration/panel.luau | 81 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index e86cbf52..d04bccd0 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -824,46 +824,47 @@ function render() table.insert( body, ui.row({ align = "center", gap = 8 }, { - ui.select({ - key = "rebuild-repo-" .. #repoOptions, - options = repoOptions, - selectedIndex = rebuildRepoIndex, - flexGrow = 1, - onChange = function(index) - rebuildRepoIndex = tonumber(index) - savedRebuildRepo = repoOptions[rebuildRepoIndex + 1] - rebuildArchIndex = 0 - savedRebuildArch = nil - render() - end, - }), - ui.select({ - key = "rebuild-arch-" .. tostring(selectedRepo) .. "-" .. #archOptions, - options = archOptions, - selectedIndex = rebuildArchIndex, - flexGrow = 1, - onChange = function(index) - rebuildArchIndex = tonumber(index) - savedRebuildArch = archOptions[rebuildArchIndex + 1] - render() - end, - }), - ui.button({ - glyph = rebuildConfirm and "check" or "refresh", - tooltip = rebuildConfirm and noctalia.tr("panel.confirm_rebuild") or noctalia.tr("panel.rebuild"), - variant = rebuildConfirm and "secondary" or "default", - onClick = function() - if rebuildConfirm then - local repo = repoOptions[rebuildRepoIndex + 1] - local arch = archOptions[rebuildArchIndex + 1] - rebuildPackage(selectedProject, selectedPackage, repo, arch) - rebuildConfirm = false - else - rebuildConfirm = true - end - render() - end, - }), + ui.select({ + key = "rebuild-repo-" .. tostring(rebuildArchIndex), + options = repoOptions, + selectedIndex = rebuildRepoIndex, + flexGrow = 1, + onChange = function(index) + rebuildRepoIndex = tonumber(index) + savedRebuildRepo = repoOptions[rebuildRepoIndex + 1] + rebuildArchIndex = 0 + savedRebuildArch = nil + render() + end, + }), + ui.select({ + key = "rebuild-arch-" .. tostring(rebuildRepoIndex), + options = archOptions, + selectedIndex = rebuildArchIndex, + flexGrow = 1, + onChange = function(index) + rebuildArchIndex = tonumber(index) + savedRebuildArch = archOptions[rebuildArchIndex + 1] + render() + end, + }), + ui.button({ + key = "rebuild-btn", + glyph = rebuildConfirm and "check" or "refresh", + tooltip = rebuildConfirm and noctalia.tr("panel.confirm_rebuild") or noctalia.tr("panel.rebuild"), + variant = rebuildConfirm and "secondary" or "default", + onClick = function() + if rebuildConfirm then + local repo = repoOptions[rebuildRepoIndex + 1] + local arch = archOptions[rebuildArchIndex + 1] + rebuildPackage(selectedProject, selectedPackage, repo, arch) + rebuildConfirm = false + else + rebuildConfirm = true + end + render() + end, + }), }) ) end From f4fdd45cf852302f28e1cfec8c53b43e0e2aa9a7 Mon Sep 17 00:00:00 2001 From: neyfua Date: Sun, 2 Aug 2026 23:15:41 +0700 Subject: [PATCH 12/26] feat(obs-integration): overhaul package actions, logging, and navigation --- obs-integration/panel.luau | 464 ++++++++++++++++++++++----- obs-integration/translations/en.json | 14 +- 2 files changed, 402 insertions(+), 76 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index d04bccd0..f27397b9 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -13,6 +13,7 @@ local projectFilter = "" local sortAsc = true local editFilesOpen = false local filesOpen = false +local filesPackage = nil local packageFiles = {} local rebuildArchIndex = 0 local rebuildRepos = {} @@ -22,15 +23,27 @@ local repoMap = {} local savedRebuildRepo = nil local savedRebuildArch = nil local rebuildLoaded = false +local isCheckingOut = false +local checkoutLog = "" +local isActionLoading = false +local actionStatus = "" +local loadPackageFiles +local resolveCheckoutDir local maintainerMap = {} local ownedProjects = {} local projectsLoading = false local packagesLoading = false local errorText = "" +local commandLog = "" +local logPackage = nil local pendingProject = nil local removeConfirm = false local restoreProject = nil local restorePackage = nil +local restoreFilesOpen = false +local restoreFilesPackage = nil +local restoreCommandLog = nil +local restoreErrorText = nil local saveCache local saveNav local maybeVerify @@ -42,6 +55,55 @@ local function shellQuote(value) return "'" .. tostring(value):gsub("'", "'\\''") .. "'" end +local function commandError(result) + return noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) +end + +local function setCommandLog(result, refreshFiles, emptyMsg) + local err = commandError(result) + if result.exitCode ~= 0 then + errorText = err ~= "" and err or ("Command failed (exit " .. tostring(result.exitCode) .. ")") + commandLog = "" + else + errorText = "" + commandLog = noctalia.string.trim(result.stdout) + if commandLog == "" and emptyMsg then + commandLog = emptyMsg + end + if refreshFiles then + local checkoutDir = resolveCheckoutDir() + loadPackageFiles(checkoutDir .. "/" .. selectedProject .. "/" .. selectedPackage, selectedPackage) + end + end + logPackage = selectedPackage + render() + saveNav() +end + +local function showCommandLog(result) + setCommandLog(result, false) +end + +local function runActionAsync(cmd, statusText, refreshFiles, pkgDir, pkg, emptyMsg) + isActionLoading = true + actionStatus = statusText + errorText = "" + commandLog = "" + render() + noctalia.runAsync(cmd, function(result) + isActionLoading = false + if refreshFiles and result.exitCode == 0 then + local dir = pkgDir + if not dir then + local checkoutDir = resolveCheckoutDir() + dir = checkoutDir .. "/" .. selectedProject .. "/" .. selectedPackage + end + loadPackageFiles(dir, pkg or selectedPackage) + end + setCommandLog(result, false, emptyMsg) + end, 60000) +end + -- OBS project/package identifiers: reject anything that could escape the -- checkout dir or inject into shell commands (slashes, leading dots, spaces). local function validName(value) @@ -52,7 +114,7 @@ local function validName(value) and value:match("^%.") == nil end -local function resolveCheckoutDir() +resolveCheckoutDir = function() local checkoutDir = noctalia.getConfig("checkout_dir") if type(checkoutDir) ~= "string" or checkoutDir:match("^%s*$") then checkoutDir = "~/OBS" @@ -60,6 +122,18 @@ local function resolveCheckoutDir() return noctalia.expandPath(checkoutDir) end + +-- Estimate the combined width (px) of the two .changes buttons to decide +-- whether they fit side-by-side or must stack. +local function changesButtonsFit(pkg) + -- Rough per-char width at the button font size, plus glyph+padding budget. + local charW = 7 + local base = 16 + 24 + local editW = (#"Edit " + #pkg + #".changes") * charW + base + local updateW = (#"Update " + #pkg + #".changes") * charW + base + return editW + updateW + 8 <= 396 +end + local function parseLines(stdout) local out = {} for line in tostring(stdout or ""):gmatch("[^\n]+") do @@ -103,8 +177,26 @@ local function checkoutPackage(project, pkg) if not validName(project) or not validName(pkg) then return end - noctalia.runInTerminal( - "cd " .. shellQuote(resolveCheckoutDir()) .. " && osc co " .. shellQuote(project) .. " " .. shellQuote(pkg) + local checkoutDir = resolveCheckoutDir() + local pkgPath = checkoutDir .. "/" .. project .. "/" .. pkg + isCheckingOut = true + checkoutLog = noctalia.tr("panel.checking_out") + render() + + noctalia.runAsync( + "cd " .. shellQuote(checkoutDir) .. " && osc co " .. shellQuote(project) .. " " .. shellQuote(pkg), + function(result) + isCheckingOut = false + if result.exitCode == 0 then + errorText = "" + loadPackageFiles(pkgPath, pkg) + else + errorText = commandError(result) + end + render() + saveNav() + end, + 60000 ) end @@ -136,7 +228,7 @@ local function rebuildPackage(project, pkg, repo, arch) noctalia.runInTerminal(cmd) end -local function loadPackageFiles(pkgDir, pkg) +loadPackageFiles = function(pkgDir, pkg) noctalia.runAsync( "find " .. shellQuote(pkgDir) .. " -maxdepth 1 -not -name '.*' -printf '%f\\n'", function(result) @@ -154,6 +246,27 @@ local function loadPackageFiles(pkgDir, pkg) end, 5000 ) + -- Re-fetch after a short delay so callers that just created the dir (checkout, + -- osc up, service runs) settle into the complete file list. + noctalia.runAsync("sleep 1", function() + noctalia.runAsync( + "find " .. shellQuote(pkgDir) .. " -maxdepth 1 -not -name '.*' -printf '%f\\n'", + function(result) + local list = {} + if result.exitCode == 0 then + for _, f in ipairs(parseLines(result.stdout)) do + if f ~= pkg and f ~= ".osc" then + table.insert(list, f) + end + end + end + table.sort(list) + packageFiles = list + render() + end, + 5000 + ) + end, 2000) end local function loadRebuildArches(project, pkg) @@ -222,12 +335,16 @@ local function removeFileLocal(path, pkgDir, pkg) if result.exitCode == 0 then loadPackageFiles(pkgDir, pkg) else - errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) + errorText = commandError(result) render() end end, 15000) end +local function editFilePlain(path) + noctalia.runInTerminal("${EDITOR:-nano} " .. shellQuote(path)) +end + local function editFile(path, pkgDir, pkg, filename) if not validName(pkg) then return @@ -235,16 +352,64 @@ local function editFile(path, pkgDir, pkg, filename) if filename:match("%.changes$") then noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc vc") else - noctalia.runInTerminal("${EDITOR:-nano} " .. shellQuote(path)) + editFilePlain(path) end end local function oscAddRemove(pkgDir) - noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc ar") + runActionAsync( + "cd " .. shellQuote(pkgDir) .. " && osc ar", + noctalia.tr("panel.adding_removing"), + true, + pkgDir, + nil, + noctalia.tr("panel.no_changes", { name = selectedPackage }) + ) end local function oscCommit(pkgDir) - noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc ci") + local cmd = "cd " .. shellQuote(pkgDir) .. " && osc ci" + isActionLoading = true + actionStatus = noctalia.tr("panel.committing") + errorText = "" + commandLog = "" + render() + noctalia.runAsync("cd " .. shellQuote(pkgDir) .. " && osc status", function(result) + local output = result.stdout .. "\n" .. result.stderr + local hasChanges = result.exitCode == 0 and noctalia.string.trim(output) ~= "" + isActionLoading = false + if hasChanges then + noctalia.runInTerminal(cmd) + else + noctalia.runAsync(cmd, showCommandLog, 60000) + end + end, 15000) +end + +local function oscUpdate(pkgDir) + runActionAsync( + "cd " .. shellQuote(pkgDir) .. " && osc up", + noctalia.tr("panel.updating_dir"), + true, + pkgDir + ) +end + +local function oscServiceRun(pkgDir) + runActionAsync( + "cd " .. shellQuote(pkgDir) .. " && osc service mr", + noctalia.tr("panel.running_manual_service"), + true, + pkgDir + ) +end + +local function oscServiceRemoteRun(project, pkg) + runActionAsync( + "osc service rr " .. shellQuote(project) .. " " .. shellQuote(pkg), + noctalia.tr("panel.running_remote_service"), + false + ) end local function removePackageLocal(project, pkg) @@ -258,14 +423,13 @@ local function removePackageLocal(project, pkg) .. "\nif ! ls -A " .. shellQuote(projectDir) .. " | grep -q -v '^\\.osc$'; then rm -rf " .. shellQuote(projectDir) .. "; fi" noctalia.runAsync(cmd, function(result) if result.exitCode ~= 0 then - errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) - render() + errorText = commandError(result) end + selectedPackage = nil + removeConfirm = false + render() + saveNav() end, 15000) - selectedPackage = nil - removeConfirm = false - render() - saveNav() end local function loadPackages(project) @@ -277,6 +441,10 @@ local function loadPackages(project) packageFiles = {} removeConfirm = false rebuildConfirm = false + isCheckingOut = false + checkoutLog = "" + isActionLoading = false + actionStatus = "" packages = maintainerMap[project] or {} if #packages == 0 and projectsLoading then @@ -297,7 +465,7 @@ local function loadPackages(project) saveCache() errorText = "" elseif errorText == "" then - errorText = noctalia.string.trim(result.stderr ~= "" and result.stderr or result.stdout) + errorText = commandError(result) end render() end, 15000) @@ -335,22 +503,27 @@ saveNav = function() noctalia.writeFile(path, noctalia.json.encode({ project = selectedProject, package = selectedPackage, + filesOpen = filesOpen, + filesPackage = filesPackage, + commandLog = commandLog, + errorText = errorText, })) end local function readNav() local path = navPath() if not path or not noctalia.fileExists(path) then - return nil, nil + return nil, nil, false, nil, nil, nil end local data, _ = noctalia.readFile(path) if not data then - return nil, nil + return nil, nil, false, nil, nil, nil end local parsed, _ = noctalia.json.decode(data) if type(parsed) ~= "table" then - return nil, nil + return nil, nil, false, nil, nil, nil end - return parsed.project, parsed.package + return parsed.project, parsed.package, parsed.filesOpen == true, parsed.filesPackage, parsed.commandLog, + parsed.errorText end saveCache = function() @@ -473,16 +646,32 @@ local function loadProjects(clearNav) if restoreProject then local proj = restoreProject local pkg = restorePackage + local filesOpenRestore = restoreFilesOpen + local filesPackageRestore = restoreFilesPackage restoreProject = nil restorePackage = nil + restoreFilesOpen = false + restoreFilesPackage = nil if proj and (maintainerMap[proj] or ownedProjects[proj]) then projectsLoading = false loadPackages(proj) if pkg then selectedPackage = pkg + filesOpen = filesOpenRestore + filesPackage = filesPackageRestore + if restoreCommandLog ~= nil then + commandLog = restoreCommandLog + end + if restoreErrorText ~= nil then + errorText = restoreErrorText + end render() saveNav() loadRebuildArches(proj, pkg) + if filesOpen then + local checkoutDir = resolveCheckoutDir() + loadPackageFiles(checkoutDir .. "/" .. proj .. "/" .. pkg, pkg) + end return end end @@ -598,8 +787,6 @@ function render() onClick = function() selectedPackage = nil editFilesOpen = false - filesOpen = false - packageFiles = {} rebuildArchIndex = 0 rebuildRepos = {} rebuildRepoIndex = 0 @@ -609,6 +796,10 @@ function render() rebuildLoaded = false rebuildConfirm = false removeConfirm = false + isCheckingOut = false + checkoutLog = "" + isActionLoading = false + actionStatus = "" render() saveNav() end, @@ -620,7 +811,7 @@ function render() table.insert( headerChildren, ui.button({ - glyph = removeConfirm and "check" or "trash", + glyph = removeConfirm and "check" or "package-off", tooltip = removeConfirm and noctalia.tr("panel.confirm_remove") or noctalia.tr("panel.remove"), variant = "destructive", onClick = function() @@ -639,18 +830,40 @@ function render() ui.row({ align = "center", gap = 8 }, headerChildren) ) + if not checkedOut then - table.insert( - body, - ui.button({ - text = noctalia.tr("panel.checkout"), - glyph = "download", - variant = "default", - onClick = function() - checkoutPackage(selectedProject, selectedPackage) - end, - }) - ) + if isCheckingOut then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = checkoutLog, color = "on_surface_variant" }), + }) + ) + else + table.insert( + body, + ui.button({ + text = noctalia.tr("panel.checkout"), + glyph = "package-import", + variant = "default", + onClick = function() + checkoutPackage(selectedProject, selectedPackage) + end, + }) + ) + table.insert( + body, + ui.button({ + text = noctalia.tr("panel.service_remote_run"), + glyph = "run", + variant = "default", + onClick = function() + oscServiceRemoteRun(selectedProject, selectedPackage) + end, + }) + ) + end end if checkedOut then @@ -692,17 +905,53 @@ function render() table.insert(body, ui.label({ text = noctalia.tr("panel.no_editable"), color = "on_surface_variant" })) else for _, file in ipairs(editable) do - table.insert( - body, - ui.button({ - text = file, - glyph = "file-text", + if file:match("%.changes$") then + local editBtn = ui.button({ + text = noctalia.tr("panel.edit_changes", { name = selectedPackage }), + glyph = "ballpen-filled", variant = "default", + flexGrow = 1, onClick = function() - editFile(pkgDir .. "/" .. file, pkgDir, selectedPackage, file) + editFilePlain(pkgDir .. "/" .. file) end, }) - ) + local updateBtn = ui.button({ + text = noctalia.tr("panel.update_changes", { name = selectedPackage }), + glyph = "square-rounded-chevron-up", + variant = "default", + flexGrow = 1, + onClick = function() + noctalia.runInTerminal("cd " .. shellQuote(pkgDir) .. " && osc vc") + end, + }) + if changesButtonsFit(selectedPackage) then + table.insert( + body, + ui.row({ key = "changes-row-" .. file, align = "center", gap = 8 }, { + editBtn, updateBtn, + }) + ) + else + table.insert( + body, + ui.column({ key = "changes-col-" .. file, gap = 8, align = "stretch" }, { + editBtn, updateBtn, + }) + ) + end + else + table.insert( + body, + ui.button({ + text = file, + glyph = "file-text", + variant = "default", + onClick = function() + editFile(pkgDir .. "/" .. file, pkgDir, selectedPackage, file) + end, + }) + ) + end end end end @@ -710,23 +959,27 @@ function render() table.insert( body, ui.row({ key = "files-row", align = "center", gap = 8 }, { - ui.glyph({ - name = filesOpen and "arrow-badge-down-filled" or "arrow-badge-right-filled", - size = 16, - color = "on_surface", - }), - ui.button({ - text = noctalia.tr("panel.files"), - glyph = "folder", - variant = "default", - flexGrow = 1, - align = "left", + ui.glyph({ + name = filesOpen and "arrow-badge-down-filled" or "arrow-badge-right-filled", + size = 16, + color = "on_surface", + }), + ui.button({ + text = noctalia.tr("panel.files"), + glyph = filesOpen and "folder-open" or "folder", + variant = "default", + flexGrow = 1, + align = "left", onClick = function() filesOpen = not filesOpen - if filesOpen and #packageFiles == 0 then - loadPackageFiles(pkgDir, selectedPackage) + if filesOpen then + filesPackage = selectedPackage + if #packageFiles == 0 then + loadPackageFiles(pkgDir, selectedPackage) + end end render() + saveNav() end, }), }) @@ -740,7 +993,7 @@ function render() body, ui.row({ key = "file-row-" .. f, align = "center", gap = 8 }, { ui.glyph({ name = "file-text", color = "on_surface_variant", size = 15 }), - ui.label({ text = f, color = "on_surface", flexGrow = 1 }), + ui.label({ text = f, color = "on_surface", flexGrow = 1, maxLines = 1 }), ui.button({ glyph = "trash", tooltip = noctalia.tr("panel.remove_file"), @@ -753,30 +1006,78 @@ function render() ) end end + end + + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.button({ + text = noctalia.tr("panel.add_remove"), + glyph = "plus-minus", + variant = "default", + flexGrow = 1, + onClick = function() + oscAddRemove(pkgDir) + end, + }), + ui.button({ + text = noctalia.tr("panel.update_dir"), + glyph = "cloud-download", + variant = "default", + flexGrow = 1, + onClick = function() + oscUpdate(pkgDir) + end, + }), + }) + ) + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.button({ + text = noctalia.tr("panel.service_remote_run"), + glyph = "run", + variant = "default", + flexGrow = 1, + onClick = function() + oscServiceRemoteRun(selectedProject, selectedPackage) + end, + }), + ui.button({ + text = noctalia.tr("panel.service_run"), + glyph = "run", + variant = "default", + flexGrow = 1, + onClick = function() + oscServiceRun(pkgDir) + end, + }), + }) + ) + table.insert( + body, + ui.button({ + text = noctalia.tr("panel.commit"), + glyph = "package-export", + variant = "default", + onClick = function() + oscCommit(pkgDir) + end, + }) + ) + if isActionLoading then table.insert( body, ui.row({ align = "center", gap = 8 }, { - ui.button({ - text = noctalia.tr("panel.add_remove"), - glyph = "plus-minus", - variant = "default", - flexGrow = 1, - onClick = function() - oscAddRemove(pkgDir) - end, - }), - ui.button({ - text = noctalia.tr("panel.commit"), - glyph = "upload", - variant = "default", - flexGrow = 1, - onClick = function() - oscCommit(pkgDir) - end, - }), + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = actionStatus, color = "on_surface_variant" }), }) ) + elseif errorText ~= "" then + table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) + elseif commandLog ~= "" then + table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) end end @@ -955,6 +1256,18 @@ function render() flexGrow = 1, align = "left", onClick = function() + if filesPackage ~= name then + filesOpen = false + packageFiles = {} + filesPackage = name + end + if logPackage ~= name then + errorText = "" + commandLog = "" + logPackage = name + end + isActionLoading = false + actionStatus = "" selectedPackage = name savedRebuildRepo = nil savedRebuildArch = nil @@ -1049,7 +1362,7 @@ function render() end panel.render(ui.column({ flexGrow = 1, gap = 12 }, { - ui.scroll({ flexGrow = 1 }, { + ui.scroll({ key = "scroll-" .. tostring(selectedProject) .. "-" .. tostring(selectedPackage), flexGrow = 1 }, { ui.column({ gap = 10, paddingV = 6, paddingH = 12, align = "stretch" }, body), }), })) @@ -1057,9 +1370,10 @@ end function onOpen() if noctalia.commandExists("osc") and noctalia.fileExists(OSC_CONFIG) then - restoreProject, restorePackage = readNav() + restoreProject, restorePackage, restoreFilesOpen, restoreFilesPackage, restoreCommandLog, restoreErrorText = + readNav() loadProjects() else render() end -end +end \ No newline at end of file diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index 56e3b598..ffc14019 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -18,7 +18,10 @@ "error": "OBS command failed", "retry": "Retry", "checkout": "Checkout package", + "checking_out": "Checking out...", "edit_files": "Edit files", + "edit_changes": "Edit {name}.changes", + "update_changes": "Update {name}.changes", "edit_meta": "Edit package meta", "rebuild": "Rebuild package", "confirm_rebuild": "Confirm rebuild", @@ -32,7 +35,16 @@ "no_files": "No files found.", "remove_file": "Remove file", "add_remove": "Add/Remove", - "commit": "Commit", + "adding_removing": "Adding/removing files...", + "no_changes": "no changes for package {name}", + "update_dir": "Update directory", + "updating_dir": "Updating directory...", + "running_manual_service": "Running manual service...", + "running_remote_service": "Running remote service...", + "committing": "Committing...", + "service_run": "Service Manual Run", + "service_remote_run": "Service Remote Run", + "commit": "Commit package", "osc_missing": "Open Build Service CLI not found", "osc_missing_hint": "Install the 'osc' package to start using this plugin.", "osc_not_configured": "OBS account not configured", From e7bc1c3048263a7e5470ac8589148bb41f1d841d Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:16:08 +0700 Subject: [PATCH 13/26] chore(obs-integration): new thumbnail --- obs-integration/thumbnail.webp | Bin 46580 -> 47524 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obs-integration/thumbnail.webp b/obs-integration/thumbnail.webp index c7e91ebf6944133dc8b8ad3824239ac2009c2d51..bd565078a7b2914b44874da3d213b075aa95a78e 100644 GIT binary patch literal 47524 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

FZnP{i`r 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 Date: Mon, 3 Aug 2026 01:16:26 +0700 Subject: [PATCH 14/26] feat(obs-integration): label Service Run All button, move build logs --- obs-integration/panel.luau | 89 ++++++++++++++++++++++------ obs-integration/translations/en.json | 11 +++- 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index f27397b9..1b0149c6 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -19,6 +19,7 @@ local rebuildArchIndex = 0 local rebuildRepos = {} local rebuildRepoIndex = 0 local rebuildConfirm = false +local runAllConfirm = false local repoMap = {} local savedRebuildRepo = nil local savedRebuildArch = nil @@ -147,12 +148,11 @@ end local function filterList(list, filter, ascending) local lower = filter:lower() - local filtered = {} + local filtered if filter == "" then - for _, name in ipairs(list) do - table.insert(filtered, name) - end + filtered = list else + filtered = {} for _, name in ipairs(list) do if name:lower():find(lower, 1, true) then table.insert(filtered, name) @@ -225,7 +225,7 @@ local function rebuildPackage(project, pkg, repo, arch) if arch ~= nil and arch ~= "All" and arch ~= "" then cmd = cmd .. " -a " .. shellQuote(arch) end - noctalia.runInTerminal(cmd) + runActionAsync(cmd, noctalia.tr("panel.rebuilding_pkg"), false) end loadPackageFiles = function(pkgDir, pkg) @@ -412,6 +412,24 @@ local function oscServiceRemoteRun(project, pkg) ) end +local function oscServiceLocalRun(pkgDir) + runActionAsync( + "cd " .. shellQuote(pkgDir) .. " && osc service r", + noctalia.tr("panel.running_local_service"), + true, + pkgDir + ) +end + +local function oscServiceRunAll(pkgDir) + runActionAsync( + "cd " .. shellQuote(pkgDir) .. " && osc service ra", + noctalia.tr("panel.running_all_services"), + true, + pkgDir + ) +end + local function removePackageLocal(project, pkg) if not validName(project) or not validName(pkg) then return @@ -441,6 +459,7 @@ local function loadPackages(project) packageFiles = {} removeConfirm = false rebuildConfirm = false + runAllConfirm = false isCheckingOut = false checkoutLog = "" isActionLoading = false @@ -796,6 +815,7 @@ function render() rebuildLoaded = false rebuildConfirm = false removeConfirm = false + runAllConfirm = false isCheckingOut = false checkoutLog = "" isActionLoading = false @@ -1031,6 +1051,36 @@ function render() }), }) ) + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.button({ + text = noctalia.tr("panel.service_local_run"), + glyph = "run", + variant = "default", + flexGrow = 1, + onClick = function() + oscServiceLocalRun(pkgDir) + end, + }), + ui.button({ + text = runAllConfirm and noctalia.tr("panel.confirm") or noctalia.tr("panel.service_run_all"), + glyph = runAllConfirm and "check" or "run", + tooltip = runAllConfirm and noctalia.tr("panel.confirm_run_all") or noctalia.tr("panel.service_run_all"), + variant = runAllConfirm and "secondary" or "default", + flexGrow = 1, + onClick = function() + if runAllConfirm then + oscServiceRunAll(pkgDir) + runAllConfirm = false + else + runAllConfirm = true + end + render() + end, + }), + }) + ) table.insert( body, ui.row({ align = "center", gap = 8 }, { @@ -1065,20 +1115,6 @@ function render() end, }) ) - - if isActionLoading then - table.insert( - body, - ui.row({ align = "center", gap = 8 }, { - ui.glyph({ name = "loader", color = "primary", size = 14 }), - ui.label({ text = actionStatus, color = "on_surface_variant" }), - }) - ) - elseif errorText ~= "" then - table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) - elseif commandLog ~= "" then - table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) - end end local repoOptions = { "All" } @@ -1170,6 +1206,20 @@ function render() ) end + if isActionLoading then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = actionStatus, color = "on_surface_variant" }), + }) + ) + elseif errorText ~= "" then + table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) + elseif commandLog ~= "" then + table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) + end + table.insert( body, ui.button({ @@ -1273,6 +1323,7 @@ function render() savedRebuildArch = nil rebuildLoaded = false rebuildConfirm = false + runAllConfirm = false render() saveNav() loadRebuildArches(selectedProject, name) diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index ffc14019..3eeb1f6e 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -42,17 +42,24 @@ "running_manual_service": "Running manual service...", "running_remote_service": "Running remote service...", "committing": "Committing...", + "rebuilding_pkg": "Rebuilding package...", "service_run": "Service Manual Run", "service_remote_run": "Service Remote Run", + "service_local_run": "Service Local Run", + "service_run_all": "Service Run All", + "confirm_run_all": "Confirm Run All", + "confirm": "Confirm", + "running_local_service": "Running local service...", + "running_all_services": "Running all services...", "commit": "Commit package", - "osc_missing": "Open Build Service CLI not found", + "osc_missing": "'osc' not found", "osc_missing_hint": "Install the 'osc' package to start using this plugin.", "osc_not_configured": "OBS account not configured", "osc_not_configured_hint": "Create ~/.config/osc/oscrc before browsing projects.", "configure_oscrc": "Configure oscrc" }, "widget": { - "osc_missing": "OSC missing", + "osc_missing": "'osc' missing", "configure_obs": "Configure OBS", "obs": "OBS" } From 8dc54353e6aa8da7830b2fcf0f2a0e577ac49e12 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:21:39 +0700 Subject: [PATCH 15/26] fix(obs-integration): split logs based on action source --- obs-integration/panel.luau | 53 ++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 1b0149c6..32816074 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -28,6 +28,7 @@ local isCheckingOut = false local checkoutLog = "" local isActionLoading = false local actionStatus = "" +local logSource = "" local loadPackageFiles local resolveCheckoutDir local maintainerMap = {} @@ -85,9 +86,10 @@ local function showCommandLog(result) setCommandLog(result, false) end -local function runActionAsync(cmd, statusText, refreshFiles, pkgDir, pkg, emptyMsg) +local function runActionAsync(cmd, statusText, refreshFiles, pkgDir, pkg, emptyMsg, source) isActionLoading = true actionStatus = statusText + logSource = source or "" errorText = "" commandLog = "" render() @@ -225,7 +227,7 @@ local function rebuildPackage(project, pkg, repo, arch) if arch ~= nil and arch ~= "All" and arch ~= "" then cmd = cmd .. " -a " .. shellQuote(arch) end - runActionAsync(cmd, noctalia.tr("panel.rebuilding_pkg"), false) + runActionAsync(cmd, noctalia.tr("panel.rebuilding_pkg"), false, nil, nil, nil, "rebuild") end loadPackageFiles = function(pkgDir, pkg) @@ -464,6 +466,7 @@ local function loadPackages(project) checkoutLog = "" isActionLoading = false actionStatus = "" + logSource = "" packages = maintainerMap[project] or {} if #packages == 0 and projectsLoading then @@ -957,8 +960,24 @@ function render() ui.column({ key = "changes-col-" .. file, gap = 8, align = "stretch" }, { editBtn, updateBtn, }) - ) - end + ) + + if logSource ~= "rebuild" then + if isActionLoading then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = actionStatus, color = "on_surface_variant" }), + }) + ) + elseif errorText ~= "" then + table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) + elseif commandLog ~= "" then + table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) + end + end + end else table.insert( body, @@ -1206,18 +1225,20 @@ function render() ) end - if isActionLoading then - table.insert( - body, - ui.row({ align = "center", gap = 8 }, { - ui.glyph({ name = "loader", color = "primary", size = 14 }), - ui.label({ text = actionStatus, color = "on_surface_variant" }), - }) - ) - elseif errorText ~= "" then - table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) - elseif commandLog ~= "" then - table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) + if logSource == "rebuild" then + if isActionLoading then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = actionStatus, color = "on_surface_variant" }), + }) + ) + elseif errorText ~= "" then + table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) + elseif commandLog ~= "" then + table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) + end end table.insert( From 639195294b6f0d6b1d14b4f6c599b9e5910a6f97 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:27:07 +0700 Subject: [PATCH 16/26] fix(obs-integration): correct log display locations and resets --- obs-integration/panel.luau | 39 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 32816074..1522b0a6 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -373,6 +373,7 @@ local function oscCommit(pkgDir) local cmd = "cd " .. shellQuote(pkgDir) .. " && osc ci" isActionLoading = true actionStatus = noctalia.tr("panel.committing") + logSource = "" errorText = "" commandLog = "" render() @@ -960,25 +961,9 @@ function render() ui.column({ key = "changes-col-" .. file, gap = 8, align = "stretch" }, { editBtn, updateBtn, }) - ) - - if logSource ~= "rebuild" then - if isActionLoading then - table.insert( - body, - ui.row({ align = "center", gap = 8 }, { - ui.glyph({ name = "loader", color = "primary", size = 14 }), - ui.label({ text = actionStatus, color = "on_surface_variant" }), - }) - ) - elseif errorText ~= "" then - table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) - elseif commandLog ~= "" then - table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) - end - end - end - else + ) + end + else table.insert( body, ui.button({ @@ -1134,6 +1119,22 @@ function render() end, }) ) + + if logSource ~= "rebuild" then + if isActionLoading then + table.insert( + body, + ui.row({ align = "center", gap = 8 }, { + ui.glyph({ name = "loader", color = "primary", size = 14 }), + ui.label({ text = actionStatus, color = "on_surface_variant" }), + }) + ) + elseif errorText ~= "" then + table.insert(body, ui.label({ text = errorText, color = "error", wrap = true })) + elseif commandLog ~= "" then + table.insert(body, ui.label({ text = commandLog, color = "on_surface_variant", wrap = true })) + end + end end local repoOptions = { "All" } From 53446058078151fa4291d8edebbdd3f39d519dd0 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:29:37 +0700 Subject: [PATCH 17/26] feat(obs-integration): add confirmation to remove file --- obs-integration/panel.luau | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 1522b0a6..57816355 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -40,6 +40,8 @@ local commandLog = "" local logPackage = nil local pendingProject = nil local removeConfirm = false +local removeFileConfirm = false +local removeFileTarget = nil local restoreProject = nil local restorePackage = nil local restoreFilesOpen = false @@ -1019,11 +1021,19 @@ function render() ui.glyph({ name = "file-text", color = "on_surface_variant", size = 15 }), ui.label({ text = f, color = "on_surface", flexGrow = 1, maxLines = 1 }), ui.button({ - glyph = "trash", - tooltip = noctalia.tr("panel.remove_file"), - variant = "ghost", + glyph = (removeFileConfirm and removeFileTarget == f) and "check" or "trash", + tooltip = (removeFileConfirm and removeFileTarget == f) and noctalia.tr("panel.confirm_remove") or noctalia.tr("panel.remove_file"), + variant = (removeFileConfirm and removeFileTarget == f) and "destructive" or "ghost", onClick = function() - removeFileLocal(pkgDir .. "/" .. f, pkgDir, selectedPackage) + if removeFileConfirm and removeFileTarget == f then + removeFileLocal(pkgDir .. "/" .. f, pkgDir, selectedPackage) + removeFileConfirm = false + removeFileTarget = nil + else + removeFileConfirm = true + removeFileTarget = f + end + render() end, }), }) @@ -1058,15 +1068,6 @@ function render() table.insert( body, ui.row({ align = "center", gap = 8 }, { - ui.button({ - text = noctalia.tr("panel.service_local_run"), - glyph = "run", - variant = "default", - flexGrow = 1, - onClick = function() - oscServiceLocalRun(pkgDir) - end, - }), ui.button({ text = runAllConfirm and noctalia.tr("panel.confirm") or noctalia.tr("panel.service_run_all"), glyph = runAllConfirm and "check" or "run", @@ -1083,6 +1084,15 @@ function render() render() end, }), + ui.button({ + text = noctalia.tr("panel.service_local_run"), + glyph = "run", + variant = "default", + flexGrow = 1, + onClick = function() + oscServiceLocalRun(pkgDir) + end, + }), }) ) table.insert( From 486b6e389f2b3c8885a08efced32e5bb6548c964 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:33:41 +0700 Subject: [PATCH 18/26] feat(obs-integration): move edit package meta to header --- obs-integration/panel.luau | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 57816355..3e9030f4 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -834,6 +834,17 @@ function render() ui.label({ text = selectedPackage, fontWeight = "bold", flexGrow = 1 }), } if checkedOut then + table.insert( + headerChildren, + ui.button({ + glyph = "feather-filled", + tooltip = noctalia.tr("panel.edit_meta"), + variant = "ghost", + onClick = function() + editPackageMeta(selectedProject, selectedPackage) + end, + }) + ) table.insert( headerChildren, ui.button({ @@ -1252,17 +1263,6 @@ function render() end end - table.insert( - body, - ui.button({ - text = noctalia.tr("panel.edit_meta"), - glyph = "feather-filled", - variant = "default", - onClick = function() - editPackageMeta(selectedProject, selectedPackage) - end, - }) - ) elseif selectedProject then table.insert( body, From 98bd30c3a68fb2413eb97b67d015183f8a40f394 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:44:52 +0700 Subject: [PATCH 19/26] fix(obs-integration): layout repo/arch label/select alignment --- obs-integration/panel.luau | 28 +++++++++++++++------------- obs-integration/translations/en.json | 2 ++ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 3e9030f4..f2c50c48 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -833,18 +833,18 @@ function render() ui.glyph({ name = "package", color = checkedOut and "primary" or "on_surface", size = 18 }), ui.label({ text = selectedPackage, fontWeight = "bold", flexGrow = 1 }), } + table.insert( + headerChildren, + ui.button({ + glyph = "feather-filled", + tooltip = noctalia.tr("panel.edit_meta"), + variant = "default", + onClick = function() + editPackageMeta(selectedProject, selectedPackage) + end, + }) + ) if checkedOut then - table.insert( - headerChildren, - ui.button({ - glyph = "feather-filled", - tooltip = noctalia.tr("panel.edit_meta"), - variant = "ghost", - onClick = function() - editPackageMeta(selectedProject, selectedPackage) - end, - }) - ) table.insert( headerChildren, ui.button({ @@ -1201,7 +1201,8 @@ function render() else table.insert( body, - ui.row({ align = "center", gap = 8 }, { + ui.row({ align = "center", gap = 2 }, { + ui.label({ text = noctalia.tr("panel.repo"), width = 40, flexGrow = 0 }), ui.select({ key = "rebuild-repo-" .. tostring(rebuildArchIndex), options = repoOptions, @@ -1215,6 +1216,7 @@ function render() render() end, }), + ui.label({ text = noctalia.tr("panel.arch"), width = 32, flexGrow = 0 }), ui.select({ key = "rebuild-arch-" .. tostring(rebuildRepoIndex), options = archOptions, @@ -1431,7 +1433,7 @@ function render() }), ui.button({ glyph = "feather-filled", - variant = "ghost", + variant = "default", tooltip = noctalia.tr("panel.edit_project_meta"), onClick = function() editProjectMeta(name) diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index 3eeb1f6e..c8ad60cb 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -24,6 +24,8 @@ "update_changes": "Update {name}.changes", "edit_meta": "Edit package meta", "rebuild": "Rebuild package", + "repo": "Repo", + "arch": "Arch", "confirm_rebuild": "Confirm rebuild", "remove": "Remove package", "confirm_remove": "Click to confirm removal", From 0a1c595a6bdc3c53f5b1515553a0adba4a0b6ba0 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 01:59:58 +0700 Subject: [PATCH 20/26] fix(obs-integration): clean rebuild log duplication --- obs-integration/panel.luau | 94 ++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index f2c50c48..f388964e 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -1201,50 +1201,56 @@ function render() else table.insert( body, - ui.row({ align = "center", gap = 2 }, { - ui.label({ text = noctalia.tr("panel.repo"), width = 40, flexGrow = 0 }), - ui.select({ - key = "rebuild-repo-" .. tostring(rebuildArchIndex), - options = repoOptions, - selectedIndex = rebuildRepoIndex, - flexGrow = 1, - onChange = function(index) - rebuildRepoIndex = tonumber(index) - savedRebuildRepo = repoOptions[rebuildRepoIndex + 1] - rebuildArchIndex = 0 - savedRebuildArch = nil - render() - end, - }), - ui.label({ text = noctalia.tr("panel.arch"), width = 32, flexGrow = 0 }), - ui.select({ - key = "rebuild-arch-" .. tostring(rebuildRepoIndex), - options = archOptions, - selectedIndex = rebuildArchIndex, - flexGrow = 1, - onChange = function(index) - rebuildArchIndex = tonumber(index) - savedRebuildArch = archOptions[rebuildArchIndex + 1] - render() - end, - }), - ui.button({ - key = "rebuild-btn", - glyph = rebuildConfirm and "check" or "refresh", - tooltip = rebuildConfirm and noctalia.tr("panel.confirm_rebuild") or noctalia.tr("panel.rebuild"), - variant = rebuildConfirm and "secondary" or "default", - onClick = function() - if rebuildConfirm then - local repo = repoOptions[rebuildRepoIndex + 1] - local arch = archOptions[rebuildArchIndex + 1] - rebuildPackage(selectedProject, selectedPackage, repo, arch) - rebuildConfirm = false - else - rebuildConfirm = true - end - render() - end, - }), + ui.row({ key = "rebuild-controls", align = "center", gap = 8 }, { + ui.column({ gap = 8, align = "stretch", flexGrow = 1 }, { + ui.row({ align = "center", gap = 6 }, { + ui.label({ key = "rebuild-repo-label", text = noctalia.tr("panel.repo"), fontSize = 12, color = "on_surface_variant" }), + ui.select({ + key = "rebuild-repo-" .. tostring(rebuildArchIndex), + options = repoOptions, + selectedIndex = rebuildRepoIndex, + flexGrow = 1, + onChange = function(index) + rebuildRepoIndex = tonumber(index) + savedRebuildRepo = repoOptions[rebuildRepoIndex + 1] + rebuildArchIndex = 0 + savedRebuildArch = nil + render() + end, + }), + }), + ui.row({ align = "center", gap = 6 }, { + ui.label({ key = "rebuild-arch-label", text = noctalia.tr("panel.arch"), fontSize = 12, color = "on_surface_variant" }), + ui.select({ + key = "rebuild-arch-" .. tostring(rebuildRepoIndex), + options = archOptions, + selectedIndex = rebuildArchIndex, + flexGrow = 1, + onChange = function(index) + rebuildArchIndex = tonumber(index) + savedRebuildArch = archOptions[rebuildArchIndex + 1] + render() + end, + }), + }), + }), + ui.button({ + key = "rebuild-btn", + glyph = rebuildConfirm and "check" or "refresh", + tooltip = rebuildConfirm and noctalia.tr("panel.confirm_rebuild") or noctalia.tr("panel.rebuild"), + variant = rebuildConfirm and "secondary" or "default", + onClick = function() + if rebuildConfirm then + local repo = repoOptions[rebuildRepoIndex + 1] + local arch = archOptions[rebuildArchIndex + 1] + rebuildPackage(selectedProject, selectedPackage, repo, arch) + rebuildConfirm = false + else + rebuildConfirm = true + end + render() + end, + }), }) ) end From bff2f58a71c3b70ba9224a67656abb5262750116 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 02:02:30 +0700 Subject: [PATCH 21/26] fix(obs-integration): persist logSource in nav state for panel reopen --- obs-integration/panel.luau | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index f388964e..18113ec7 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -48,6 +48,7 @@ local restoreFilesOpen = false local restoreFilesPackage = nil local restoreCommandLog = nil local restoreErrorText = nil +local restoreLogSource = nil local saveCache local saveNav local maybeVerify @@ -532,6 +533,7 @@ saveNav = function() filesPackage = filesPackage, commandLog = commandLog, errorText = errorText, + logSource = logSource, })) end local function readNav() @@ -548,7 +550,7 @@ local function readNav() return nil, nil, false, nil, nil, nil end return parsed.project, parsed.package, parsed.filesOpen == true, parsed.filesPackage, parsed.commandLog, - parsed.errorText + parsed.errorText, parsed.logSource end saveCache = function() @@ -690,6 +692,9 @@ local function loadProjects(clearNav) if restoreErrorText ~= nil then errorText = restoreErrorText end + if restoreLogSource ~= nil then + logSource = restoreLogSource + end render() saveNav() loadRebuildArches(proj, pkg) @@ -1461,7 +1466,8 @@ end function onOpen() if noctalia.commandExists("osc") and noctalia.fileExists(OSC_CONFIG) then - restoreProject, restorePackage, restoreFilesOpen, restoreFilesPackage, restoreCommandLog, restoreErrorText = + restoreProject, restorePackage, restoreFilesOpen, restoreFilesPackage, restoreCommandLog, restoreErrorText, + restoreLogSource = readNav() loadProjects() else From fb8484576ea2d1ceb8af03648d51aa9f66d76494 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 09:34:01 +0700 Subject: [PATCH 22/26] i18n(obs-integration): change 'Repo' to 'Repositories' and 'Arch' to 'Architectures' --- obs-integration/translations/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index c8ad60cb..0f06d930 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -24,8 +24,8 @@ "update_changes": "Update {name}.changes", "edit_meta": "Edit package meta", "rebuild": "Rebuild package", - "repo": "Repo", - "arch": "Arch", + "repo": "Repositories", + "arch": "Architectures", "confirm_rebuild": "Confirm rebuild", "remove": "Remove package", "confirm_remove": "Click to confirm removal", From 8a131cb4c248d4207c6a045b96370d9f631a5dc6 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 09:42:16 +0700 Subject: [PATCH 23/26] feat(obs-integration): add home nav button, fix header label clipping, rebuild controls layout --- obs-integration/panel.luau | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 18113ec7..96959107 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -838,6 +838,17 @@ function render() ui.glyph({ name = "package", color = checkedOut and "primary" or "on_surface", size = 18 }), ui.label({ text = selectedPackage, fontWeight = "bold", flexGrow = 1 }), } + table.insert( + headerChildren, + ui.button({ + glyph = "home-filled", + tooltip = noctalia.tr("panel.my_projects"), + variant = "default", + onClick = function() + loadProjects(true) + end, + }) + ) table.insert( headerChildren, ui.button({ @@ -869,7 +880,7 @@ function render() end table.insert( body, - ui.row({ align = "center", gap = 8 }, headerChildren) + ui.row({ align = "center", gap = 8, paddingV = 4 }, headerChildren) ) @@ -1473,4 +1484,4 @@ function onOpen() else render() end -end \ No newline at end of file +end From 8aceec3abc77bb71e3249496fc47a806eec4d7b0 Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 09:43:35 +0700 Subject: [PATCH 24/26] chore(obs-integration): change plugin's panel height --- obs-integration/plugin.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obs-integration/plugin.toml b/obs-integration/plugin.toml index e460e248..a9b61607 100644 --- a/obs-integration/plugin.toml +++ b/obs-integration/plugin.toml @@ -30,7 +30,7 @@ entry = "widget.luau" [[panel]] id = "panel" entry = "panel.luau" -width = 420 -height = 410 +width = 410 +height = 450 placement = "floating" position = "center" From bc156fe9e39c909dbc036e31d6e3610ad2d182eb Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 09:46:29 +0700 Subject: [PATCH 25/26] docs(obs-integration): document source-service operations in README --- obs-integration/README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/obs-integration/README.md b/obs-integration/README.md index f54331d5..b2d6f130 100644 --- a/obs-integration/README.md +++ b/obs-integration/README.md @@ -51,8 +51,20 @@ its actions: button; below the list, **Add/Remove** runs `osc ar` and **Commit** runs `osc ci`, both in a terminal so you can watch progress or edit the commit message. +- **Service Local Run** — runs `osc service r` in the checkout, executing the + package's source-service scripts locally (local side effects: the `_service` + scripts can modify files in the checkout). +- **Service Manual Run** — runs `osc service mr` in the checkout, running the + source-service scripts locally in "manual" mode (local side effects, like + Service Local Run). +- **Service Run All** — runs `osc service ra` in the checkout, running all + source-service scripts locally. Requires a confirmation click (turns + **secondary** with a **check** glyph) before it executes. +- **Service Remote Run** — runs `osc service rr` on the OBS server for the + package on the remote project. No local code executes; the request triggers + server-side service runs, and a confirmation is not required. - **Rebuild package** — pick an architecture (or **All**) and trigger - `osc rebuild`. + `osc rebuild`. Confirmation is required before it runs. - **Edit package meta** — `osc meta pkg -e` in a terminal. - **Remove package** — deletes the checkout from disk only (never touches the OBS project); confirm before it runs. If it was the last package in the @@ -75,4 +87,6 @@ The plugin runs the `osc` CLI with your existing credentials — it stores nothing itself beyond a small cache of project/package listings and your last navigated view. Removal is local-only and never modifies the OBS project. Rebuilds and commits are real OBS operations and open a terminal so you can -confirm what `osc` reports. +confirm what `osc` reports. Confirmation prompts precede the destructive and +side-effecting operations: Rebuild package, Remove package, and Service Run +All. From 2a7d0a8c96ef466f785311ff44ac37e23e417d1f Mon Sep 17 00:00:00 2001 From: neyfua Date: Mon, 3 Aug 2026 09:58:34 +0700 Subject: [PATCH 26/26] fix(obs-integration): correct rebuild log display and persistence, sync UI layout --- obs-integration/README.md | 17 ++++++++++------- obs-integration/panel.luau | 25 ++++++++++++++++++------- obs-integration/translations/en.json | 1 + 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/obs-integration/README.md b/obs-integration/README.md index b2d6f130..d2abe5c8 100644 --- a/obs-integration/README.md +++ b/obs-integration/README.md @@ -48,9 +48,10 @@ its actions: package's `.spec` open in your `$EDITOR`; the `.changes` file runs `osc vc`. - **Files** — lists every non-dotfile in the checkout. Each file has a remove - button; below the list, **Add/Remove** runs `osc ar` and **Commit** runs - `osc ci`, both in a terminal so you can watch progress or edit the commit - message. + button; below the list, **Add/Remove** runs `osc ar` asynchronously in the + panel. **Commit** runs `osc status` first; if pending changes exist it + opens a terminal with `osc ci` so you can edit the commit message, otherwise + the commit runs asynchronously in the panel. - **Service Local Run** — runs `osc service r` in the checkout, executing the package's source-service scripts locally (local side effects: the `_service` scripts can modify files in the checkout). @@ -86,7 +87,9 @@ The panel reopens where you left off — inside the same project or package. The plugin runs the `osc` CLI with your existing credentials — it stores nothing itself beyond a small cache of project/package listings and your last navigated view. Removal is local-only and never modifies the OBS project. -Rebuilds and commits are real OBS operations and open a terminal so you can -confirm what `osc` reports. Confirmation prompts precede the destructive and -side-effecting operations: Rebuild package, Remove package, and Service Run -All. +Most operations (rebuilds, service runs, updates, add/remove) run +asynchronously and display their output directly in the panel. The Commit +operation opens a terminal only when `osc status` reports pending changes; +otherwise, it runs asynchronously in the panel. Confirmation prompts precede +destructive and side-effecting operations: Rebuild package, Remove package, +and Service Run All. diff --git a/obs-integration/panel.luau b/obs-integration/panel.luau index 96959107..42fd196b 100644 --- a/obs-integration/panel.luau +++ b/obs-integration/panel.luau @@ -55,6 +55,7 @@ local maybeVerify local ownedDone = false local oscUser = nil +local oscWhoPending = false local function shellQuote(value) return "'" .. tostring(value):gsub("'", "'\\''") .. "'" @@ -669,6 +670,8 @@ local function loadProjects(clearNav) projectsLoading = true errorText = "" ownedDone = false + oscUser = nil + oscWhoPending = false if restoreProject then local proj = restoreProject @@ -724,10 +727,18 @@ local function loadProjects(clearNav) end) if oscUser == nil then + oscWhoPending = true noctalia.runAsync("osc who | cut -d: -f1", function(userResult) if userResult.exitCode == 0 then oscUser = noctalia.string.trim(userResult.stdout) + else + oscUser = "" + local err = commandError(userResult) + if err ~= "" then + errorText = err + end end + oscWhoPending = false maybeVerify() end, 15000) end @@ -738,13 +749,12 @@ maybeVerify = function() return end + if oscWhoPending then + return + end + if oscUser == nil then - noctalia.runAsync("osc who | cut -d: -f1", function(userResult) - if userResult.exitCode == 0 then - oscUser = noctalia.string.trim(userResult.stdout) - end - maybeVerify() - end, 15000) + finalize() return end @@ -1398,7 +1408,8 @@ function render() ui.label({ text = noctalia.tr("panel.my_projects"), fontWeight = "bold", fontSize = 18, flexGrow = 1 }), ui.button({ glyph = "refresh", - variant = "ghost", + tooltip = noctalia.tr("panel.reload_projects"), + variant = "default", onClick = function() loadProjects(true) end, diff --git a/obs-integration/translations/en.json b/obs-integration/translations/en.json index 0f06d930..bf5adde5 100644 --- a/obs-integration/translations/en.json +++ b/obs-integration/translations/en.json @@ -11,6 +11,7 @@ }, "panel": { "my_projects": "My Projects", + "reload_projects": "Reload projects", "search_projects": "Search projects...", "no_projects": "No projects found.", "no_packages": "No packages found.",