1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
[]
= "rustploy-gui"
= "0.1.53"
= "2024"
= "rustploy-gui"
= "Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon"
= "MIT"
= ["Antonio Fernando <antoniofernando2723@gmail.com>"]
= "https://github.com/antoniofernandodj/rustploy-gui"
= ["paas", "deploy", "gui", "iced"]
= ["gui"]
[[]]
= "rustploy-gui"
= "src/main.rs"
# Helper root do "Atualizar app" (via pkexec): instala o .deb assinado do próprio app.
# Ver src/bin/rustploy-gui-update.rs e docs/plano-updaters-daemon-e-gui.md.
[[]]
= "rustploy-gui-update"
= "src/bin/rustploy-gui-update/main.rs"
[]
# Declarative UI engine (published; XML templates + async bridge + widgets).
# 0.36 traz o runner multi-janela (iced::daemon): a casca em `src/app/` é um
# runtime `iced::daemon` próprio, um `GlacierUI` por janela — ver `app/mod.rs`.
# feature `tray` (0.47+): ícone de bandeja + app que sobrevive à última janela.
# 0.48+: fechar a principal recolhe o motor headless (SSE + login vivos → as
# notificações de deploy chegam com a janela fechada). Ver app/mod.rs e
# docs/plano-tray-bandeja-e-ciclo-de-vida.md.
# 0.57.5+ é REQUISITO, não preferência: até a 0.57.4 a thread da bandeja deixava
# o processo no locale do usuário depois do `gtk::init()`, e num locale de
# vírgula decimal (pt_BR…) o lexer do Luau rejeitava todo literal decimal com
# "Malformed number" — `require("format")` falhava e a janela de logs não abria.
# 0.92+ traz `<drawer>`, `<tableview>`/`<tableheader>` e `<autocomplete>`; 0.94,
# `<wizard>`; 0.102, a validação declarada no `<form>` (`rules=`/`msg=`/
# `on_validation_error`/`:invalid`). 0.103: `render_current` embrulha a tela
# num `Stack` fixo — abrir menu/diálogo/toast deixa de zerar a rolagem/foco de
# um `<scrollable>` (era o pulo pro topo no clique-direito num input).
# Ver docs/plano-reforma-gui-glacier-0.102.md.
= { = "0.152.0", = ["tray"] }
# GUI — features must stay compatible with glacier-ui's iced.
= { = "0.14", = ["image", "svg", "tokio"] }
# Async / networking (runs on iced's tokio executor)
= { = "1", = ["net", "sync", "macros", "io-util", "rt", "time"] }
= { = "0.23", = ["ring"] }
= "0.26"
# Serialization
= { = "1", = ["derive"] }
= "1"
# Atualização do app: comparar versões, escolher o pacote da release e (no helper root)
# conferir a assinatura e instalar. A lógica de segurança mora toda neste crate.
= { = "rustploy-update-core", = "0.3.3" }
= "0.2"
# Errors / Time
= "1"
= { = "0.4", = ["serde"] }
# O helper do Windows (`rustploy-gui-update.exe`) extrai o zip da release.
= { = "8.6", = false, = ["deflate-flate2-zlib-rs"] }
[]
= "3"
[]
# Helpers de build.rs (logos reduzidos, .desktop no cargo install, recursos do .exe).
= "0.1"
# ── Debian package (cargo deb -p rustploy-gui) ───────────────────────────────────
# Installs the binary to /usr/bin, all runtime assets under /usr/share/rustploy
# preserving the `views/`/`assets/` prefixes the templates reference (the app chdir's here
# at startup — see glacier_ui::locate_assets_and_chdir), plus the .desktop entry and hicolor icons so
# the app shows up in the applications menu and the dock/taskbar.
[]
= "rustploy-gui"
= "Antonio Fernando <antoniofernando2723@gmail.com>"
= "2026, Antonio Fernando"
= "Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon"
= "admin"
= "optional"
# `$auto` = libs detectadas do binário (libc, etc.). O ícone de bandeja usa
# libappindicator+GTK em runtime (ver src/tray.rs na glacier), então garantimos
# as libs de sistema para o tray subir no desktop do usuário.
= "$auto, libgtk-3-0, libayatana-appindicator3-1"
# `pkexec` abre o diálogo de senha do "Atualizar app". Sem ele o botão some e fica o comando manual.
= "pkexec | policykit-1"
= "packaging"
= [
["target/release/rustploy-gui", "usr/bin/rustploy-gui", "755"],
# Os assets de runtime (views/estilos/scripts/ícones/logos) são EMBUTIDOS no
# binário de release (ver src/embedded.rs), então não são mais copiados para
# /usr/share — o executável é standalone. Só a integração com o desktop fica.
# Desktop integration.
["packaging/rustploy-gui.desktop", "usr/share/applications/", "644"],
["packaging/icons/hicolor/**/*", "usr/share/icons/hicolor/", "644"],
# "Atualizar app": o helper que ganha root (só via pkexec) e a política do polkit que o autoriza.
["target/release/rustploy-gui-update", "usr/libexec/rustploy-gui-update", "755"],
["packaging/br.com.rustploy.gui-update.policy", "usr/share/polkit-1/actions/", "644"],
]
# Perfil de release. NÃO use `panic = "abort"`: o `mlua` EXIGE `panic = "unwind"`
# (o Luau é C++ e propaga erro de Lua desenrolando a pilha por frames Rust do
# mlua; com `abort` qualquer erro de Lua num callback vira SIGABRT).
[]
= 3
= true
= 1
[]
= 2
# Recorte do text_editor no renderer de software (ver vendor/README.md).
[]
= { = "vendor/iced_tiny_skia" }