Skip to content

feat(marketplace): Windows-safe install/update/uninstall staging#22

Merged
pabloinigoblasco merged 1 commit into
developmentfrom
fix/windows-marketplace-staging
Mar 31, 2026
Merged

feat(marketplace): Windows-safe install/update/uninstall staging#22
pabloinigoblasco merged 1 commit into
developmentfrom
fix/windows-marketplace-staging

Conversation

@pabloinigoblasco
Copy link
Copy Markdown
Collaborator

@pabloinigoblasco pabloinigoblasco commented Mar 31, 2026

Summary

On Windows, DLLs loaded into a process cannot be overwritten or deleted. This PR adds platform-aware staging logic to the marketplace ExtensionManager:

  • Fresh install: installs directly (no DLL loaded yet)
  • Update: stages to .pending/ directory, applies on next startup
  • Uninstall: if directory removal fails (DLL locked), schedules deletion for next startup
  • Startup: applyPendingInstalls() and applyPendingUninstalls() process deferred work

The UI shows a "Needs Restart" badge for extensions pending activation or removal.

Changes

  • extension_manager.hpp: declare doInstall(), add installPendingRestart and uninstallPendingRestart signals
  • ExtensionManager.cpp: implement staging logic and pending uninstall scheduling
  • marketplace_window.cpp: add ExtensionManager* constructor overload, connect pending restart signals
  • extension_manager_test.cpp: add staging and pending uninstall tests
  • main_window.cpp: call applyPendingInstalls() and applyPendingUninstalls() at startup

Test plan

  • Install a new extension on Windows — should install directly
  • Update an installed extension on Windows — should show "Needs Restart" badge
  • Restart application — staged extension should become active
  • Uninstall an in-use extension on Windows — should show "Needs Restart" badge
  • Restart application — extension directory should be removed
  • All operations on Linux should work immediately (no staging needed)

Replaces #13

On Windows, DLLs loaded into a process cannot be overwritten or deleted.
This commit adds platform-aware staging logic:

- Fresh install: installs directly (no DLL loaded yet)
- Update: stages to .pending/ directory, applies on next startup
- Uninstall: if directory removal fails, schedules deletion for next startup
- Startup: applyPendingInstalls() and applyPendingUninstalls() process deferred work

The ExtensionManager now exposes:
- doInstall() private method for unified install logic with staging flag
- installPendingRestart and uninstallPendingRestart signals for UI feedback
- applyPendingUninstalls() for deferred directory cleanup

Also adds constructor overload accepting an ExtensionManager* for test injection.

Contents:
- extension_manager.hpp: declare doInstall(), add pending restart signals
- ExtensionManager.cpp: implement staging logic and pending uninstall scheduling
- marketplace_window.cpp: add ExtensionManager* constructor, connect pending restart signals
- extension_manager_test.cpp: add staging and pending uninstall tests
- main_window.cpp: call applyPendingInstalls() and applyPendingUninstalls() at startup
@pabloinigoblasco pabloinigoblasco force-pushed the fix/windows-marketplace-staging branch from 745007f to 0d540c9 Compare March 31, 2026 12:17
@pabloinigoblasco pabloinigoblasco merged commit 832fcf4 into development Mar 31, 2026
2 checks passed
pabloinigoblasco added a commit that referenced this pull request Apr 4, 2026
…om plotjuggler)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pabloinigoblasco pushed a commit that referenced this pull request Apr 4, 2026
commit 26dec01
Merge: 212de71 b4a78af
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 20:59:20 2026 +0200

    Merge development into internal_main (post-PR #23 sync)

commit 212de71
Merge: 84c5119 02af6df
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Tue Mar 31 18:51:56 2026 +0000

Merge branch 'fix/build-install-subdirectory-conan-deps' into
'internal_main'

    fix(build): install Conan deps from subdirectory conanfiles

See merge request
client-projets/p.2026-plotjuggler/plotjuggler_core!92

commit 02af6df
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Tue Mar 31 18:51:56 2026 +0000

    fix(build): install Conan deps from subdirectory conanfiles

commit b4a78af
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 20:51:51 2026 +0200

fix(build): install Conan dependencies from subdirectory conanfiles
(#23)

    build.sh only ran conan install on the root conanfile.txt, missing
    dependencies declared in pj_ported_plugins/conanfile.txt (e.g.
    ixwebsocket). This caused CMake configure failures when building
    plugins like foxglove_bridge or pj_bridge.

    The fix scans for subdirectory conanfiles and installs their
    dependencies into the same build output folder before running CMake.

commit 84c5119
Merge: b5f6194 fe6aa2f
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Tue Mar 31 17:16:03 2026 +0000

    Merge branch 'feature/protoapp-wheel-zoom' into 'internal_main'

    feat(proto_app): add mouse wheel zoom to ChartPane

See merge request
client-projets/p.2026-plotjuggler/plotjuggler_core!53

commit fe6aa2f
Author: Pmarin <pmarin@ibrobotics.com>
Date:   Tue Mar 31 17:16:03 2026 +0000

    feat(proto_app): add mouse wheel zoom to ChartPane

commit af5da16
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 19:13:19 2026 +0200

    feat(protoapp): add mouse wheel zoom to chart panel (#21)

    Zoom in/out with mouse wheel on chart panels. Ctrl+wheel for
    horizontal-only zoom, Shift+wheel for vertical-only zoom.

commit b5f6194
Merge: 482231d 832fcf4
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 18:35:16 2026 +0200

Merge ibrobotics/development into internal_main (sync PRs #19, #22
from plotjuggler)

    Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

commit 482231d
Merge: 1bd2e0b 12006bb
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Tue Mar 31 16:30:14 2026 +0000

    Merge branch 'fix/windows-marketplace-staging' into 'internal_main'

    fix(marketplace): Windows staging for uninstall and update

See merge request
client-projets/p.2026-plotjuggler/plotjuggler_core!90

commit 12006bb
Author: Vlozano <vlozano@ibrobotics.com>
Date:   Tue Mar 31 16:30:14 2026 +0000

    fix(marketplace): Windows staging for uninstall and update

commit 832fcf4
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 18:27:51 2026 +0200

feat(marketplace): Windows-safe install/update/uninstall staging
(#22)

On Windows, DLLs loaded into a process cannot be overwritten or
deleted.
    This commit adds platform-aware staging logic:

    - Fresh install: installs directly (no DLL loaded yet)
    - Update: stages to .pending/ directory, applies on next startup
- Uninstall: if directory removal fails, schedules deletion for next
startup
- Startup: applyPendingInstalls() and applyPendingUninstalls()
process deferred work

    The ExtensionManager now exposes:
- doInstall() private method for unified install logic with staging
flag
- installPendingRestart and uninstallPendingRestart signals for UI
feedback
    - applyPendingUninstalls() for deferred directory cleanup

Also adds constructor overload accepting an ExtensionManager* for
test injection.

    Contents:
- extension_manager.hpp: declare doInstall(), add pending restart
signals
- ExtensionManager.cpp: implement staging logic and pending
uninstall scheduling
- marketplace_window.cpp: add ExtensionManager* constructor, connect
pending restart signals
- extension_manager_test.cpp: add staging and pending uninstall
tests
- main_window.cpp: call applyPendingInstalls() and
applyPendingUninstalls() at startup

commit 1bd2e0b
Merge: 497c4d5 aaebb7b
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Tue Mar 31 10:12:41 2026 +0000

Merge branch
'fix/extension-manager-call-initcomponents-parametrized-ctor' into
'internal_main'

fix(extension_manager): call initComponents() from parametrized
constructor

See merge request
client-projets/p.2026-plotjuggler/plotjuggler_core!87

commit aaebb7b
Author: Vlozano <vlozano@ibrobotics.com>
Date:   Tue Mar 31 10:12:41 2026 +0000

fix(extension_manager): call initComponents() from parametrized
constructor

commit 90b1405
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 12:11:22 2026 +0200

feat(extension_manager): add default constructor and
initComponents() (#19)

    Enables dependency injection pattern for ExtensionManager:
    - Add default constructor for delayed initialization
    - Add initComponents() to set up downloader and load state
- Parametrized constructor now calls initComponents() for
consistency

    This allows creating an ExtensionManager instance first, then
    injecting dependencies later via initComponents().

commit 497c4d5
Merge: ce3a878 49ca22f
Author: Pablo Iñigo Blasco <pablo.inigo@ibrobotics.com>
Date:   Tue Mar 31 00:03:37 2026 +0200

    Merge branch 'feature/protoapp-multi-select-tree' into internal_main

    feat(protoapp): multi-select series tree for batch drag-and-drop

commit ce3a878
Merge: bd1e11e 9b5b773
Author: Pablo Iñigo Blasco <pablo@ibrobotics.com>
Date:   Mon Mar 30 10:04:40 2026 +0000

    Merge branch 'feat/extension-manager-injection' into 'internal_main'

feat(extension_manager): add default constructor and
initComponents()

See merge request
client-projets/p.2026-plotjuggler/plotjuggler_core!86

commit 9b5b773
Author: Vlozano <vlozano@ibrobotics.com>
Date:   Mon Mar 30 10:04:40 2026 +0000

feat(extension_manager): add default constructor and
initComponents()

commit 49ca22f
Author: Pmarin <pmarin@ibrobotics.com>
Date:   Mon Mar 23 12:10:41 2026 +0100

    feat(proto-app): multi-select series tree for batch drag-and-drop

    Allow selecting multiple fields in the left panel (Ctrl+click,
    Shift+click)
    and dropping them all onto the chart at once.

    - main_window: enable ExtendedSelection on the QTreeView
      - series_tree_model: mimeData() encodes all selected fields
    (count + N entries) instead of only the first one
- chart_panel: dropEvent() decodes and adds N series in a single
drop
@pabloinigoblasco pabloinigoblasco deleted the fix/windows-marketplace-staging branch May 4, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant