Version 0.3.0, Selbstinstallation nach ~/Applications, Gatekeeper im README

Erster Start aus DMG oder Downloads bietet einmalig an, sich nach
~/Applications zu kopieren und von dort neu zu starten — der Weg dorthin
braucht kein Administrator-Passwort, anders als /Applications. Ein DMG
kann das nicht selbst leisten: der Applications-Alias darin ist ein
absoluter Symlink auf /Applications.

Die Kopie erbt per ditto die Quarantäne des Downloads, deshalb wird sie
am Ziel gelöst — sonst käme beim Neustart erneut die Gatekeeper-Warnung
für dieselbe, gerade laufende App. Ablehnen merkt sich die App
(moveOfferDismissed), im Debug-Build fragt sie nie.

README: ~/Applications als gleichwertiger Installationsort, dazu der
Weg über System-Einstellungen -> Datenschutz & Sicherheit fuer alle, die
kein Terminal aufmachen wollen.

0.8 ist fuer den Windows-Stand reserviert.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
marcusH
2026-07-22 10:47:36 +02:00
parent 0faa1e48fd
commit ea08563411
10 changed files with 162 additions and 6 deletions
+14
View File
@@ -61,6 +61,20 @@ pub(crate) fn spellcheck_lang(paths: &Paths) -> String {
.unwrap_or_else(|| "de".to_string())
}
/// Hat der Nutzer das Angebot, die App nach ~/Applications zu holen, schon
/// abgelehnt? (settings.json: moveOfferDismissed, nur macOS)
#[cfg_attr(not(target_os = "macos"), allow(dead_code))]
pub(crate) fn move_offer_dismissed(paths: &Paths) -> bool {
read_app_settings(paths)
.and_then(|v| v["moveOfferDismissed"].as_bool())
.unwrap_or(false)
}
#[cfg_attr(not(target_os = "macos"), allow(dead_code))]
pub(crate) fn set_move_offer_dismissed_in(paths: &Paths, dismissed: bool) -> Result<(), String> {
write_app_setting(paths, "moveOfferDismissed", serde_json::json!(dismissed))
}
/// Einen Schlüssel setzen; übrige App-settings bleiben erhalten.
///
/// Nur eine *fehlende* Datei rechtfertigt ein frisches Objekt. Unlesbar oder