Skip to content

feat(linux): add full Linux support for Ubuntu 24.04 LTS x86_64 (#46) - #62

Closed
traoreera wants to merge 5 commits into
harry0703:mainfrom
traoreera:linux-support
Closed

traoreera wants to merge 5 commits into
harry0703:mainfrom
traoreera:linux-support

Conversation

@traoreera

@traoreera traoreera commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

Add Linux support — résolution de #46

Bilan

MangoDisk dispose désormais d'un support Linux complet, ciblé et qualifié.

Cible choisie (explicite) : Ubuntu 24.04 LTS — architecture x86_64. Distribution : AppImage (l'issue demandait « AppImage or Flatpak » ; l'AppImage rend aussi opérationnelle la mise à jour automatique via l'updater Tauri, seul format supporté côté Linux). Le support arm64 n'est pas prévu à ce stade ; les autres distributions glibc-compatibles restent « compatibles par accident », sans engagement.

Ce qui est inclus

  • Storage : analyse des volumes, gros fichiers, doublons exacts — large-file et duplicates opérationnels (88 tests verts dédiés).
  • Applications : inventaire des applications installées via apt, snap, flatpak, pacman, avec identités stables par source.
  • Maintenance système : ressources shell-cache / paquets / élévation ; découverte des modèles Ollama.
  • Nettoyage : 27 règles déclaratives filesystem Linux — toutes safe, lifecycle = verified, exécution deleteMatchingContents uniquement (aucune deleteWholeRoot), racines limitées à $HOME et au /tmp de l'utilisateur, aucune racine système. La suppression reste assujettie aux vérifications propriétaire/snapshot du moteur. README des règles mis à jour (cible linux + contraintes).
  • Sécurité des scans : l'analyse (large-files et doublons) élague les arborescences snap (/snap, /var/lib/snapd) et flatpak (/var/lib/flatpak) — fichiers dupliqués en lecture seule non proposés comme récupérables — ainsi que les arborescences non inscriptibles par l'utilisateur courant (principe sans élévation).
  • CI : cross-platform-check étendu à ubuntu-24.04 (WebKitGTK 4.1, libayatana/libappindicator, rsvg, ssl, patchelf) ; packaging AppImage (createUpdaterArtifacts actif).
  • Qualité : toolchain 1.88.0 épinglée ; clippy --workspace --all-targets -- -D warnings et rustfmt verts sur Linux, uniquement via des gates cfg positifs étroits → les chemins macOS/Windows sont compilatoirement et sémantiquement inchangés.

Plan d'implémentation

Phase Contenu Statut
1 — Portage plateforme volumes, gros fichiers, doublons, inventaire apt/snap/flatpak/pacman, maintenance, Ollama fait
2 — Nettoyage et sécurité 27 règles déclaratives safe, filesystem user-owned, gates de plateforme fait
3 — Intégration et distribution CI ubuntu-24.04, AppImage + updater, toolchain épinglée fait
4 — Extensions désinstallation d'applications (helper privilégié pkexec/polkit), icônes natives, validation arm64 proposé, hors périmètre

Limites volontaires (choix assumés, fail-closed)

  • Pas de désinstallation d'applications Linux : l'inventaire liste les paquets, mais la suppression n'est pas exposée (UnsupportedCommandHost). Implémenter cela nécessite une frontière privilégiée (pkexec/polkit) et des commandes par gestionnaire — à traiter dans un PR dédié.
  • Pas d'icônes natives (fichiers ni applications installées) : fallback générique côté UI.
  • Pas de change-tracking accéléré (FSEvents/USN) : les scans utilisent l'analyse récursive complète comme fallback sûr et documenté.
  • Pas de calcul d'espace physique pour les fichiers creux/sparse (allocated content non implémenté sur Linux).
  • Distribution AppImage uniquement (pas de .deb ni Flatpak à ce stade).
  • Cible Ubuntu 24.04 LTS x86_64 uniquement (pas d'arm64).

Limites involontaires (environnement de validation)

  • macOS/Windows non compilés/testés sur cette machine (dépendances natives indisponibles) : la non-régression repose sur des gates cfg positifs stricts et une revue de diff ; à confirmer par la CI.
  • CI cross-platform-check étendue mais non encore exécutée sur GitHub Actions (compilations macOS/Windows + build AppImage à valider par les checks du PR).
  • Benchmarks volumétriques réels (scan de gros volumes, doublons sur données réelles via MANGODISK_ANALYSIS_ROOT / MANGODISK_DUPLICATE_BENCHMARK_ROOT) non exécutés — tests paramétrés, non mesurés.
  • Suite de tests frontend partiellement flaky (timeouts vitest 5 s sous charge, md-status-display-component notamment) : pré-existant et externe à ce changement ; la suite passe en réexécution et en exécution isolée.
  • Résolution de l'environnement local (liens du binaire) : incident de cache cargo, sans incidence sur le code.

Validation exécutée (Linux, rdv local Ubuntu 24.04)

  • clippy --workspace --all-targets -- -D warnings : vert
  • cargo fmt --check : propre
  • Tests : mangodisk-core 617 passed (610+7) · mangodisk-platform 55 passed · mangodisk-cli 15 passed · aucune régression
  • 318 fichiers de règles / 15 tests de schéma validés
  • Binaire desktop lié avec succès

Maintenance

Je propose d'assurer la maintenance du support Linux : nouvelles versions d'Ubuntu LTS, évolution des gestionnaires de paquets, dérive des règles de nettoyage, régressions remontées en issues, suivi de la CI. Périmètre proposé : domaine platform Linux, règles filesystem, inventaire de paquets, contrôles cross-plateforme. Décisions d'architecture globale : mainteneur.


Closes #46

Phase 1 scaffold: Platform trait implementation, filesystem cleanup rules,
project-artifact rules activation, and Tauri Linux configuration.

Platform implementation (mangodisk-platform):
- Linux module with Platform trait: volumes (/proc/mounts + statvfs),
  directories (XDG base dirs), inventory (/proc/[pid]/comm + /etc/os-release),
  process control (libc::kill), application directories
- Dependencies: libc 0.2, walkdir 2
- Removed compile_error! gate in current.rs

Core adaptations (mangodisk-core):
- Added Linux variant to PlatformConstraint, SourcePlatform,
  SystemMaintenancePlatform, SystemSettingsPlatform enums
- Added Linux branches to all match expressions across 12+ files
- Added CONTROLLED_ENV_ALLOWLIST for Linux (HOME, TMPDIR, XDG_*)
- MAX_PARALLEL_DELETE_WORKERS set to 4 for Linux
- project_artifact_schema: SUPPORTED_PLATFORMS now includes "linux"
- Tests adapted for empty DEFINITIONS on Linux with early returns

Filesystem cleanup rules (28 new TOML files):
- 6 system rules: temp, crash-dumps, thumbnails, dns-cache, font-cache,
  gtk-icon-cache
- 22 application rules: Chrome, Firefox, VS Code, Slack, Discord,
  Spotify, Electron, JetBrains, Docker, pip, npm, Yarn, Cargo, Gradle,
  Maven, GTK-doc, Zoom, Blender, Minecraft, GIMP, Wine

Project-artifact rules:
- Added "linux" to platforms for all 30 cross-platform rules
  (cocoapods remains macOS-only)

Configuration:
- tauri.linux.conf.json: custom decorations, deb + appimage bundles

All 31 project-artifact rules validated at build time by build.rs.

Validation: cargo check OK, 619 Rust tests pass, 0 failures
Phase 2 - Platform trait native implementations:
- file_has_allocated_content: lseek(SEEK_DATA) for sparse file detection
- directory_entry_identities: stat() for inode/device identity batch
- fast_direct_physical_directories: d_type from getdents64

Phase 3 - PrivacyPlatform:
- discover_privacy_sources: 6 Chromium browsers + Firefox with profile
  enumeration (history, cookies, cache, sessions, storage databases)
- clear_system_privacy_trace: shell history (.bash_history, .zsh_history,
  fish_history) and recent documents (XDG recently-used.xbel)

Phase 3 - StartupPlatform:
- scan_startup_sources: XDG autostart desktop files + systemd user services
- Parses .desktop Exec/Name/Hidden fields and systemd Description/WantedBy

Phase 5 - Frontend:
- OperatingSystemService.isLinux() method
- SystemSettingsPlatform and SystemMaintenancePlatform types: added 'linux'
- AiContext.platform: added 'linux'
- ApplicationUninstallPlatform: added 'linuxPackage'
- system-settings-mode.ts: added empty linux entries for SMART_EXTRAS and
  FOCUSED_EXTRAS
- Fixed 3 binary ternaries (isWindows ? 'windows' : 'macos') to include
  Linux in cleanup, privacy, and startup pages
- Added Linux test case to operating-system-service.test.ts

Validation: cargo check OK, 619 Rust tests pass, frontend builds clean
…3#46)

- clippy --workspace --all-targets -- -D warnings and rustfmt are green on
  Linux using narrow positive cfg gates; macOS/Windows paths are unchanged
- run cross-platform-check on ubuntu-24.04 and install the WebKitGTK 4.1,
  tray indicator, rsvg, and patchelf system dependencies
- bundle Linux releases as AppImage so the tauri updater self-update works
- prune large-file and duplicate discovery below snap, flatpak, and
  unwritable system trees (user scope, no elevation); unwritable detection
  ignores nonexistent synthetic roots used by storage tests
- report the Linux package platform in uninstall records
- document Linux filesystem-rule constraints in rules/README.md

Closes harry0703#46
@harry0703

Copy link
Copy Markdown
Owner

Thanks a lot for the contribution and for all the work you’ve put into bringing Linux support to MangoDisk. I really appreciate the effort behind this PR.

I’m still doing a detailed review and testing the implementation on Ubuntu. I’ve already found quite a few issues and areas that need further adjustment, and I’m working through them one by one.

At the same time, I’m also evaluating the overall feasibility of Linux support in MangoDisk, including how well it fits with the current architecture, cleanup safety, packaging and distribution, and the long-term maintenance cost.

Since this is a fairly large change, I’d like to spend more time testing and refining it before deciding on the next steps.

Thanks again for the contribution and for helping improve MangoDisk.

@traoreera

Copy link
Copy Markdown
Contributor Author

@harry0703 Ok, j'attends tes analyses. Les correctifs, tu pourras me les lister, je les implémenterai.

@harry0703

harry0703 commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Merci beaucoup pour votre contribution et pour tout le travail réalisé afin d’apporter la prise en charge de Linux à MangoDisk. Votre contribution a été intégrée à la PR #64, qui a été fusionnée dans main, et vos commits d’origine conservent bien votre attribution. Nous fermons cette PR pour éviter de garder une demande en double. Merci encore !

@harry0703

Copy link
Copy Markdown
Owner

Cette PR a été remplacée par la PR #64, qui a été fusionnée dans main.

@harry0703 harry0703 closed this Sep 24, 2026
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.

[Feature]: Add Linux Support

2 participants