mirror of
https://github.com/theupriser/steamify-cachyos-dev.git
synced 2026-10-05 12:45:56 +02:00
Compare commits
105
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
737882c213 | ||
|
|
0e63b931ea | ||
|
|
3bcbdf3d98 | ||
|
|
9dbf05ab9c | ||
|
|
86a44d7e68 | ||
|
|
d540dd2310 | ||
|
|
f7625f5882 | ||
|
|
b4d6c23129 | ||
|
|
7a313a96ee | ||
|
|
9e8e05e99b | ||
|
|
b95ccb686d | ||
|
|
dabc43ded6 | ||
|
|
a253ff15cd | ||
|
|
c8a6a2cef5 | ||
|
|
1aff67612d | ||
|
|
b2fc992745 | ||
|
|
90fe42da5f | ||
|
|
5146dd1109 | ||
|
|
b840eb3697 | ||
|
|
5ea436efc5 | ||
|
|
f33d3bf491 | ||
|
|
32db035e9b | ||
|
|
cfba222439 | ||
|
|
76b162d7e1 | ||
|
|
da263529e9 | ||
|
|
f604e10b3e | ||
|
|
19ea677cf7 | ||
|
|
ca0cf43919 | ||
|
|
7b7715ab07 | ||
|
|
8ef247e596 | ||
|
|
1db4693e3c | ||
|
|
6190abadfc | ||
|
|
4cb253b41c | ||
|
|
7b0147f065 | ||
|
|
f35df9c4d3 | ||
|
|
85657a3183 | ||
|
|
92bf3f0b19 | ||
|
|
b07ff5f99b | ||
|
|
2daf83b013 | ||
|
|
d8c7670c53 | ||
|
|
58b233c20b | ||
|
|
b6e801664a | ||
|
|
fa01c19ba1 | ||
|
|
f356cc3f74 | ||
|
|
0824e78249 | ||
|
|
48edfc53c5 | ||
|
|
36bd85cce6 | ||
|
|
4670b296dc | ||
|
|
b6082c0322 | ||
|
|
ebf9e3c267 | ||
|
|
ade5566174 | ||
|
|
6729d61ea8 | ||
|
|
5f97f1334c | ||
|
|
c6578103a3 | ||
|
|
97f68a8065 | ||
|
|
3a0d9f98d8 | ||
|
|
fd1b916023 | ||
|
|
b6a7b30092 | ||
|
|
314bac87e7 | ||
|
|
dea5f9d715 | ||
|
|
a576b734c7 | ||
|
|
105ac638ee | ||
|
|
d231aec125 | ||
|
|
5b3e246629 | ||
|
|
f24ff3927e | ||
|
|
b895e28181 | ||
|
|
0a12c0e4c6 | ||
|
|
fcffceb941 | ||
|
|
ea1207580f | ||
|
|
38a50ab57d | ||
|
|
ed12ecb57d | ||
|
|
8ea75424b0 | ||
|
|
e435577b5c | ||
|
|
104d1dac44 | ||
|
|
8b0c168711 | ||
|
|
d0c551d23a | ||
|
|
728f329ebc | ||
|
|
332fdca4c2 | ||
|
|
92c1e58f55 | ||
|
|
36d1e6d326 | ||
|
|
c5ac00faf6 | ||
|
|
107f8f4076 | ||
|
|
1c1bc55a62 | ||
|
|
6df107d578 | ||
|
|
6840044038 | ||
|
|
32499b1c01 | ||
|
|
b1e9a273a3 | ||
|
|
9706066269 | ||
|
|
7a0a216327 | ||
|
|
4adc018654 | ||
|
|
ac8f77cf4a | ||
|
|
0f57d86bae | ||
|
|
46e039809e | ||
|
|
379f1c7f7f | ||
|
|
471332e20f | ||
|
|
8ce2917c0f | ||
|
|
9a4653b6d3 | ||
|
|
3b7b685667 | ||
|
|
7a0443e131 | ||
|
|
8d5a659c89 | ||
|
|
6d992c83c7 | ||
|
|
974cea7cf4 | ||
|
|
19b6ba4d97 | ||
|
|
788d345a9d | ||
|
|
10357b2d52 |
No files matched your search
@@ -5,7 +5,7 @@
|
|||||||
pass() { echo "PASS $*"; }; fail() { echo "FAIL $*"; }
|
pass() { echo "PASS $*"; }; fail() { echo "FAIL $*"; }
|
||||||
sudo mountpoint -q /mnt || sudo mount -t 9p -o trans=virtio,version=9p2000.L repo /mnt
|
sudo mountpoint -q /mnt || sudo mount -t 9p -o trans=virtio,version=9p2000.L repo /mnt
|
||||||
cd /mnt || exit 1
|
cd /mnt || exit 1
|
||||||
for lib in common state packages login-manager single-user steam-desktop steam-machine fremont-poweroff vram-booster hdmi-refresh cec boot-session vapor-theme steamos-extras bios desktop-shortcut wizard-shortcut steam-game update-notifier; do
|
for lib in $(grep -oP '^for lib in \K.*(?=; do$)' steamify.sh); do
|
||||||
# shellcheck source=/dev/null
|
# shellcheck source=/dev/null
|
||||||
. "lib/$lib.sh" 2>/dev/null
|
. "lib/$lib.sh" 2>/dev/null
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ pass() { echo "PASS $*"; }; fail() { echo "FAIL $*"; }; skip() { echo "SKIP $*";
|
|||||||
sudo mountpoint -q /mnt || sudo mount -t 9p -o trans=virtio,version=9p2000.L repo /mnt
|
sudo mountpoint -q /mnt || sudo mount -t 9p -o trans=virtio,version=9p2000.L repo /mnt
|
||||||
cd /mnt || exit 1
|
cd /mnt || exit 1
|
||||||
export SCRIPT_DIR=/mnt # steamify.sh sets it; the libs alone read patches/ and services/ from it
|
export SCRIPT_DIR=/mnt # steamify.sh sets it; the libs alone read patches/ and services/ from it
|
||||||
for lib in common state packages login-manager single-user steam-desktop steam-machine fremont-poweroff vram-booster hdmi-refresh nvidia controllers cec boot-session vapor-theme steamos-extras bios desktop-shortcut wizard-shortcut steam-game update-notifier; do
|
for lib in $(grep -oP '^for lib in \K.*(?=; do$)' steamify.sh); do
|
||||||
# shellcheck source=/dev/null
|
# shellcheck source=/dev/null
|
||||||
. "lib/$lib.sh" 2>/dev/null
|
. "lib/$lib.sh" 2>/dev/null
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -0,0 +1,170 @@
|
|||||||
|
== pc first run
|
||||||
|
wanted: gaming glyphs theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming glyphs theme single launcher notify
|
||||||
|
== pc first run, untick gaming
|
||||||
|
wanted: theme launcher notify
|
||||||
|
disable:
|
||||||
|
enable: theme launcher notify
|
||||||
|
== pc single on
|
||||||
|
wanted: gaming theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming theme single launcher notify
|
||||||
|
== pc single then gaming off
|
||||||
|
wanted: theme launcher notify
|
||||||
|
disable:
|
||||||
|
enable: theme launcher notify
|
||||||
|
== pc boot desktop
|
||||||
|
wanted: gaming boot glyphs theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming boot glyphs theme single launcher notify
|
||||||
|
== pc boot desktop then gaming off
|
||||||
|
wanted: theme launcher notify
|
||||||
|
disable:
|
||||||
|
enable: theme launcher notify
|
||||||
|
== pc silent only
|
||||||
|
wanted: gaming silent glyphs theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming silent glyphs theme single launcher notify
|
||||||
|
== pc all on, theme off
|
||||||
|
wanted: gaming boot silent glyphs single launcher notify
|
||||||
|
disable: theme
|
||||||
|
enable: gaming silent notify
|
||||||
|
== pc launcher off
|
||||||
|
wanted:
|
||||||
|
disable: launcher
|
||||||
|
enable:
|
||||||
|
== pc steamgame on without launcher
|
||||||
|
wanted: theme launcher steamgame notify
|
||||||
|
disable:
|
||||||
|
enable: theme launcher steamgame notify
|
||||||
|
== machine first run
|
||||||
|
wanted: gaming glyphs theme single launcher steamgame notify vram cec machine poweroff
|
||||||
|
disable:
|
||||||
|
enable: gaming glyphs theme single launcher steamgame notify vram cec machine poweroff
|
||||||
|
== machine silent hidden until boot desktop
|
||||||
|
wanted: gaming silent glyphs theme single launcher notify vram machine
|
||||||
|
disable:
|
||||||
|
enable: gaming silent glyphs theme single launcher notify vram machine
|
||||||
|
== machine boot desktop keeps silent
|
||||||
|
wanted: gaming boot silent glyphs theme single launcher notify vram machine
|
||||||
|
disable:
|
||||||
|
enable: gaming boot silent glyphs theme single launcher notify vram machine
|
||||||
|
== machine off
|
||||||
|
wanted: gaming glyphs theme single launcher notify vram
|
||||||
|
disable: poweroff machine
|
||||||
|
enable: gaming glyphs theme single launcher notify vram
|
||||||
|
== machine poweroff off
|
||||||
|
wanted: gaming glyphs theme single launcher notify vram machine
|
||||||
|
disable: poweroff
|
||||||
|
enable: gaming glyphs theme single launcher notify vram machine
|
||||||
|
== machine poweroff on brings machine
|
||||||
|
wanted: gaming glyphs theme single launcher notify vram machine poweroff
|
||||||
|
disable:
|
||||||
|
enable: gaming glyphs theme single launcher notify vram machine poweroff
|
||||||
|
== machine kpin removal
|
||||||
|
wanted: gaming glyphs theme single launcher notify vram machine poweroff
|
||||||
|
disable: kpin
|
||||||
|
enable: gaming glyphs theme single launcher notify vram machine poweroff
|
||||||
|
== nvidia first run
|
||||||
|
wanted: nvidia bigpicture theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: nvidia bigpicture theme single launcher notify
|
||||||
|
== nvidia bigpicture off
|
||||||
|
wanted: nvidia theme single launcher notify
|
||||||
|
disable: bigpicture
|
||||||
|
enable: nvidia theme single launcher notify
|
||||||
|
== nvidia nvsilent on
|
||||||
|
wanted: nvidia nvsilent theme single launcher notify
|
||||||
|
disable: bigpicture
|
||||||
|
enable: nvidia nvsilent theme single launcher notify
|
||||||
|
== nvidia nvsilent then bigpicture
|
||||||
|
wanted: nvidia bigpicture theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: nvidia bigpicture theme single launcher notify
|
||||||
|
== nvidia off
|
||||||
|
wanted: theme single launcher notify
|
||||||
|
disable: nvsilent bigpicture nvidia
|
||||||
|
enable: theme single launcher notify
|
||||||
|
== nvidia single
|
||||||
|
wanted: nvidia bigpicture theme launcher notify
|
||||||
|
disable:
|
||||||
|
enable: nvidia bigpicture theme launcher notify
|
||||||
|
== nvidia gaming already on
|
||||||
|
wanted: nvidia theme launcher notify
|
||||||
|
disable: gaming
|
||||||
|
enable: nvidia theme launcher notify
|
||||||
|
== outdated features
|
||||||
|
wanted: gaming glyphs theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming glyphs single launcher notify
|
||||||
|
== reapply (a)
|
||||||
|
wanted: gaming glyphs theme single launcher notify
|
||||||
|
disable:
|
||||||
|
enable: gaming glyphs theme single launcher notify
|
||||||
|
== backend_apply single
|
||||||
|
{"event":"plan","disable":[],"enable":["gaming","single"]}
|
||||||
|
== backend_apply boot
|
||||||
|
{"event":"plan","disable":[],"enable":[]}
|
||||||
|
== backend_apply poweroff
|
||||||
|
{"event":"plan","disable":[],"enable":["machine","poweroff"]}
|
||||||
|
== backend_apply silent
|
||||||
|
{"event":"plan","disable":[],"enable":["gaming","silent"]}
|
||||||
|
== backend_apply kpin
|
||||||
|
{"event":"plan","disable":[],"enable":[]}
|
||||||
|
== backend_apply gaming boot
|
||||||
|
{"event":"plan","disable":[],"enable":["gaming","boot"]}
|
||||||
|
== backend_apply launcher steamgame
|
||||||
|
{"event":"plan","disable":[],"enable":["launcher","steamgame"]}
|
||||||
|
== backend_apply nvidia bigpicture
|
||||||
|
{"event":"plan","disable":[],"enable":["nvidia","bigpicture"]}
|
||||||
|
== backend_apply nvidia nvsilent
|
||||||
|
{"event":"plan","disable":[],"enable":["nvidia","nvsilent"]}
|
||||||
|
== backend_apply nvidia bigpicture nvsilent
|
||||||
|
{"event":"plan","disable":[],"enable":["nvidia","bigpicture"]}
|
||||||
|
== backend_apply nvidia single
|
||||||
|
{"event":"plan","disable":[],"enable":["single"]}
|
||||||
|
== backend_apply nvidia boot
|
||||||
|
{"event":"plan","disable":[],"enable":[]}
|
||||||
|
== defaults_list []
|
||||||
|
{"hideWhen":"","hint":"boot into gaming mode, Steam on the desktop","id":"gaming","kind":"toggle","label":"SteamOS conversion","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"","id":"boot","kind":"choice","label":"Boot into the desktop instead of gaming mode","needs":"","on":false,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"in the tray at login on the desktop, no window","id":"silent","kind":"toggle","label":"Start Steam silently in desktop mode","needs":"","on":false,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Deck button icons in gaming mode","id":"glyphs","kind":"toggle","label":"Install Steam Deck/Machine icons","needs":"","on":true,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","on":false,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","on":false,"parent":"","selectable":true}
|
||||||
|
== backend_status []
|
||||||
|
{"bios":null,"firstRun":true,"items":[{"hint":"boot into gaming mode, Steam on the desktop","id":"gaming","kind":"toggle","label":"SteamOS conversion","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"","id":"boot","kind":"choice","label":"Boot into the desktop instead of gaming mode","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":false},{"hint":"in the tray at login on the desktop, no window","id":"silent","kind":"toggle","label":"Start Steam silently in desktop mode","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":false},{"hint":"Deck button icons in gaming mode","id":"glyphs","kind":"toggle","label":"Install Steam Deck/Machine icons","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":true},{"hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":false},{"hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":false}],"pinnedKernel":"7.1.6-1","steamMachine":false,"version":"0.0.0"}
|
||||||
|
== defaults_list [fremont steam vram]
|
||||||
|
{"hideWhen":"","hint":"boot into gaming mode, Steam on the desktop","id":"gaming","kind":"toggle","label":"SteamOS conversion","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"","id":"boot","kind":"choice","label":"Boot into the desktop instead of gaming mode","needs":"","on":false,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"in the tray at login on the desktop, no window","id":"silent","kind":"toggle","label":"Start Steam silently in desktop mode","needs":"","on":false,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Deck button icons in gaming mode","id":"glyphs","kind":"toggle","label":"Install Steam Deck/Machine icons","needs":"","on":true,"parent":"gaming","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Steamify in your Steam library, for the controller and gaming mode","id":"steamgame","kind":"toggle","label":"Add as non-Steam game","needs":"","on":true,"parent":"launcher","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","on":false,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the game in front keeps its VRAM, background apps make room","id":"vram","kind":"toggle","label":"VRAM booster","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"LED bar driver, hardware settings in Steam","id":"machine","kind":"toggle","label":"Steam Machine support","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the Steam Machine stays off after shutting down","id":"poweroff","kind":"toggle","label":"Power-off fix","needs":"","on":true,"parent":"machine","selectable":true}
|
||||||
|
== backend_status [fremont steam vram]
|
||||||
|
{"bios":null,"firstRun":true,"items":[{"hint":"boot into gaming mode, Steam on the desktop","id":"gaming","kind":"toggle","label":"SteamOS conversion","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"","id":"boot","kind":"choice","label":"Boot into the desktop instead of gaming mode","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":false},{"hint":"in the tray at login on the desktop, no window","id":"silent","kind":"toggle","label":"Start Steam silently in desktop mode","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":false},{"hint":"Deck button icons in gaming mode","id":"glyphs","kind":"toggle","label":"Install Steam Deck/Machine icons","needs":"","new":false,"on":false,"parent":"gaming","selectable":true,"update":false,"wanted":true},{"hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"Steamify in your Steam library, for the controller and gaming mode","id":"steamgame","kind":"toggle","label":"Add as non-Steam game","needs":"","new":false,"on":false,"parent":"launcher","selectable":true,"update":false,"wanted":true},{"hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":false},{"hint":"the game in front keeps its VRAM, background apps make room","id":"vram","kind":"toggle","label":"VRAM booster","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"LED bar driver, hardware settings in Steam","id":"machine","kind":"toggle","label":"Steam Machine support","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"the Steam Machine stays off after shutting down","id":"poweroff","kind":"toggle","label":"Power-off fix","needs":"","new":false,"on":false,"parent":"machine","selectable":true,"update":false,"wanted":true}],"pinnedKernel":"7.1.6-1","steamMachine":true,"version":"0.0.0"}
|
||||||
|
== defaults_list [nvidia steam]
|
||||||
|
{"hideWhen":"","hint":"Steam on the desktop, started at login","id":"nvidia","kind":"toggle","label":"Gaming on NVIDIA","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the controller-friendly Steam (untick: Steam's normal window)","id":"bigpicture","kind":"toggle","label":"Steam starts in Big Picture","needs":"","on":true,"parent":"nvidia","selectable":true}
|
||||||
|
{"hideWhen":"bigpicture","hint":"in the tray at login, no window (untick: Steam's normal window)","id":"nvsilent","kind":"toggle","label":"Start Steam silently","needs":"","on":false,"parent":"nvidia","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","on":true,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","on":false,"parent":"","selectable":true}
|
||||||
|
{"hideWhen":"","hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","on":false,"parent":"","selectable":true}
|
||||||
|
== backend_status [nvidia steam]
|
||||||
|
{"bios":null,"firstRun":true,"items":[{"hint":"Steam on the desktop, started at login","id":"nvidia","kind":"toggle","label":"Gaming on NVIDIA","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"the controller-friendly Steam (untick: Steam's normal window)","id":"bigpicture","kind":"toggle","label":"Steam starts in Big Picture","needs":"","new":false,"on":false,"parent":"nvidia","selectable":true,"update":false,"wanted":true},{"hint":"in the tray at login, no window (untick: Steam's normal window)","id":"nvsilent","kind":"toggle","label":"Start Steam silently","needs":"","new":false,"on":false,"parent":"nvidia","selectable":true,"update":false,"wanted":false},{"hint":"Vapor look (cachyos-vapor)","id":"theme","kind":"toggle","label":"Install SteamOS theme","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"no password, lock screen or log out (SDDM)","id":"single","kind":"toggle","label":"Single user mode","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"the app on the desktop, Steamify Terminal in the launcher","id":"launcher","kind":"toggle","label":"Steamify shortcut","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"a notification when there's a new Steamify, never updates by itself","id":"notify","kind":"toggle","label":"Update notifications","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":true},{"hint":"Xbox wireless dongle (xone), Xbox controllers over Bluetooth (xpadneo)","id":"extended_controller_support","kind":"toggle","label":"Extended controller support","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":false},{"hint":"use Steam with the TV remote, TV on/off with the PC (experimental)","id":"cec","kind":"toggle","label":"HDMI-CEC","needs":"","new":false,"on":false,"parent":"","selectable":true,"update":false,"wanted":false}],"pinnedKernel":"7.1.6-1","steamMachine":false,"version":"0.0.0"}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Golden-output test for the menu rules (lib/menu.sh, lib/backend.sh): what
|
||||||
|
# toggling does to WANTED, what plan_changes picks, and the JSON the app and
|
||||||
|
# the installer read. Hardware and package state are stubbed, so no root, VM
|
||||||
|
# or hardware is needed.
|
||||||
|
# bash tests/menu-test.sh compare with menu-test.golden
|
||||||
|
# bash tests/menu-test.sh --update rewrite the golden file (review the diff!)
|
||||||
|
# The Steamify checkout (REPO, default: the steamify-cachyos next to this repo)
|
||||||
|
REPO="${REPO:-$(cd "$(dirname "$0")/../../steamify-cachyos" && pwd)}"; HERE="$(cd "$(dirname "$0")" && pwd)"; cd "$REPO" || exit 1
|
||||||
|
T="$(mktemp -d)"; trap 'rm -rf "$T"' EXIT
|
||||||
|
|
||||||
|
SCRIPT_DIR="$PWD"; HOME="$T/home"; mkdir -p "$HOME"
|
||||||
|
VERSION=0.0.0
|
||||||
|
for lib in $(grep -oP '^for lib in \K.*(?=; do$)' steamify.sh); do
|
||||||
|
source "lib/$lib.sh"
|
||||||
|
done
|
||||||
|
info() { :; }; ok() { :; }; warn() { :; }; err() { :; }
|
||||||
|
# From the entry point.
|
||||||
|
RESTART_FOR_LOGIN=false; restart_needed() { return 1; }
|
||||||
|
|
||||||
|
# Hardware profile and what is "on", set per scenario.
|
||||||
|
HW=""; ON=""
|
||||||
|
has() { [[ " $HW " == *" $1 "* ]]; }
|
||||||
|
nvidia_present() { has nvidia; }
|
||||||
|
nvidia_available() { has nvidia; }
|
||||||
|
bigpicture_available() { has nvidia; }
|
||||||
|
machine_available() { has fremont; }
|
||||||
|
detect_valve_fremont() { has fremont; }
|
||||||
|
vram_available() { has vram; }
|
||||||
|
vram_selectable() { return 0; }
|
||||||
|
steamgame_available() { has steam; }
|
||||||
|
kpin_available() { has fremont && [[ " $ON " == *" kpin "* ]]; }
|
||||||
|
hdmi_available() { return 1; }
|
||||||
|
bios_available() { return 1; }
|
||||||
|
bios_selectable() { return 1; }
|
||||||
|
cec_repair() { return 1; }
|
||||||
|
launcher_repair() { return 1; }
|
||||||
|
bios_lookup_newest() { :; }
|
||||||
|
kernel_overview() { :; }
|
||||||
|
os_version_refresh() { :; }
|
||||||
|
for c in "${COMPONENTS[@]}"; do
|
||||||
|
eval "${c}_status() { [[ \" \$ON \" == *\" $c \"* ]]; }"
|
||||||
|
done
|
||||||
|
|
||||||
|
show() {
|
||||||
|
# show <label>: WANTED as the ticked ids, then the plan.
|
||||||
|
local c w=""
|
||||||
|
for c in "${COMPONENTS[@]}"; do [[ "${WANTED[$c]:-0}" == 1 ]] && w+=" $c"; done
|
||||||
|
echo "$1"
|
||||||
|
echo " wanted:$w"
|
||||||
|
plan_changes
|
||||||
|
echo " disable: ${TO_DISABLE[*]:-}"
|
||||||
|
echo " enable: ${TO_ENABLE[*]:-}"
|
||||||
|
}
|
||||||
|
|
||||||
|
scenario() {
|
||||||
|
# scenario <name> <hardware> <on> [toggle...]
|
||||||
|
local name="$1"; HW="$2"; ON="$3"; shift 3
|
||||||
|
rm -rf "$STATE_DIR"; REAPPLY=false
|
||||||
|
detect_components
|
||||||
|
local t
|
||||||
|
for t in "$@"; do toggle_component "$t"; done
|
||||||
|
show "== $name"
|
||||||
|
}
|
||||||
|
|
||||||
|
run() {
|
||||||
|
scenario "pc first run" "" ""
|
||||||
|
scenario "pc first run, untick gaming" "" "" gaming
|
||||||
|
scenario "pc single on" "" "" gaming single
|
||||||
|
scenario "pc single then gaming off" "" "" single gaming
|
||||||
|
scenario "pc boot desktop" "" "" boot
|
||||||
|
scenario "pc boot desktop then gaming off" "" "" boot gaming
|
||||||
|
scenario "pc silent only" "" "gaming" silent
|
||||||
|
scenario "pc all on, theme off" "" "gaming boot silent theme glyphs single launcher steamgame notify" theme
|
||||||
|
scenario "pc launcher off" "" "launcher steamgame" launcher
|
||||||
|
scenario "pc steamgame on without launcher" "steam" "" gaming launcher steamgame
|
||||||
|
scenario "machine first run" "fremont steam vram" ""
|
||||||
|
scenario "machine silent hidden until boot desktop" "fremont steam vram" "gaming silent"
|
||||||
|
scenario "machine boot desktop keeps silent" "fremont steam vram" "gaming silent" boot
|
||||||
|
scenario "machine off" "fremont steam vram" "gaming machine poweroff" machine
|
||||||
|
scenario "machine poweroff off" "fremont steam vram" "gaming machine poweroff" poweroff
|
||||||
|
scenario "machine poweroff on brings machine" "fremont steam vram" "gaming" poweroff
|
||||||
|
scenario "machine kpin removal" "fremont steam vram" "gaming machine poweroff kpin"
|
||||||
|
scenario "nvidia first run" "nvidia steam" ""
|
||||||
|
scenario "nvidia bigpicture off" "nvidia steam" "nvidia bigpicture" bigpicture
|
||||||
|
scenario "nvidia nvsilent on" "nvidia steam" "nvidia bigpicture" nvsilent
|
||||||
|
scenario "nvidia nvsilent then bigpicture" "nvidia steam" "nvidia" nvsilent bigpicture
|
||||||
|
scenario "nvidia off" "nvidia steam" "nvidia bigpicture nvsilent" nvidia
|
||||||
|
scenario "nvidia single" "nvidia steam" "" single
|
||||||
|
scenario "nvidia gaming already on" "nvidia steam" "gaming" gaming
|
||||||
|
|
||||||
|
# Feature versions: an old record is ticked and re-applied.
|
||||||
|
HW=""; ON="gaming theme"; rm -rf "$STATE_DIR"; REAPPLY=false
|
||||||
|
state_set features gaming 2.1.0; state_set features theme 2.1.0
|
||||||
|
detect_components; show "== outdated features"
|
||||||
|
REAPPLY=true; ON="gaming theme launcher"; detect_components; show "== reapply (a)"
|
||||||
|
REAPPLY=false
|
||||||
|
|
||||||
|
# The app's own rules (backend_apply's normalisation) go through the same plan.
|
||||||
|
HW="fremont steam vram"; ON=""; rm -rf "$STATE_DIR"
|
||||||
|
detect_components
|
||||||
|
local sel
|
||||||
|
for sel in "single" "boot" "poweroff" "silent" "kpin" "gaming boot" "launcher steamgame"; do
|
||||||
|
echo "== backend_apply $sel"
|
||||||
|
backend_sudo() { return 0; }
|
||||||
|
backend_run_component() { return 0; }
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
backend_apply $sel | jq -c 'select(.event == "plan")'
|
||||||
|
done
|
||||||
|
HW="nvidia steam"; ON=""; detect_components
|
||||||
|
for sel in "bigpicture" "nvsilent" "bigpicture nvsilent" "single" "boot"; do
|
||||||
|
echo "== backend_apply nvidia $sel"
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
backend_apply $sel | jq -c 'select(.event == "plan")'
|
||||||
|
done
|
||||||
|
|
||||||
|
# JSON for the app and the installer page.
|
||||||
|
local hw
|
||||||
|
for hw in "" "fremont steam vram" "nvidia steam"; do
|
||||||
|
HW="$hw"; ON=""; rm -rf "$STATE_DIR"; detect_components
|
||||||
|
echo "== defaults_list [$hw]"
|
||||||
|
defaults_list | jq -S -c '.[]'
|
||||||
|
echo "== backend_status [$hw]"
|
||||||
|
backend_status | jq -S -c 'del(.kernel, .cecDevices, .leds)'
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "${1:-}" == --update ]]; then
|
||||||
|
run > "$HERE/menu-test.golden" 2>&1
|
||||||
|
echo "wrote $HERE/menu-test.golden ($(wc -l < "$HERE/menu-test.golden") lines)"
|
||||||
|
elif diff -u "$HERE/menu-test.golden" <(run 2>&1); then
|
||||||
|
echo "ok menu rules, plan and JSON match the golden file"
|
||||||
|
else
|
||||||
|
echo "FAIL menu rules changed (diff above; --update if intended)"; exit 1
|
||||||
|
fi
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
"""Unit tests of the Python helpers in steamify-cachyos/patches (stdlib only).
|
||||||
|
|
||||||
|
Run through tests/python-test.sh (REPO = the Steamify checkout), or:
|
||||||
|
REPO=../steamify-cachyos python3 -m unittest tests/patches_test.py -v
|
||||||
|
"""
|
||||||
|
import contextlib
|
||||||
|
import importlib.util
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
|
REPO = os.environ.get("REPO") or os.path.join(os.path.dirname(__file__), "..", "..", "steamify-cachyos")
|
||||||
|
|
||||||
|
|
||||||
|
def load(name, filename):
|
||||||
|
spec = importlib.util.spec_from_file_location(name, os.path.join(REPO, "patches", filename))
|
||||||
|
mod = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(mod)
|
||||||
|
return mod
|
||||||
|
|
||||||
|
|
||||||
|
shortcuts = load("steam_shortcuts", "steam-shortcuts.py")
|
||||||
|
notifier = load("steamify_notifier", "steamify-notifier.py")
|
||||||
|
|
||||||
|
|
||||||
|
class VdfTests(unittest.TestCase):
|
||||||
|
def test_roundtrip(self):
|
||||||
|
root = [("shortcuts", [("0", [("appid", 123), ("AppName", "A"), ("tags", [])])])]
|
||||||
|
self.assertEqual(shortcuts.parse(shortcuts.dump(root)), root)
|
||||||
|
|
||||||
|
def test_empty_data_is_an_empty_list(self):
|
||||||
|
self.assertEqual(shortcuts.parse(b""), [("shortcuts", [])])
|
||||||
|
|
||||||
|
def test_unknown_type_is_an_error(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
shortcuts.parse(b"\x07key\0")
|
||||||
|
|
||||||
|
def test_ints_are_unsigned_32_bit(self):
|
||||||
|
data = shortcuts.dump([("n", -1)])
|
||||||
|
self.assertEqual(struct.unpack_from("<I", data, 3)[0], 0xFFFFFFFF)
|
||||||
|
|
||||||
|
def test_keys_match_regardless_of_case(self):
|
||||||
|
entry = [("AppName", "x")]
|
||||||
|
self.assertEqual(shortcuts.get(entry, "appname"), "x")
|
||||||
|
shortcuts.put(entry, "APPNAME", "y")
|
||||||
|
self.assertEqual(entry, [("AppName", "y")])
|
||||||
|
|
||||||
|
def test_ours(self):
|
||||||
|
exe = "/home/u/.local/share/steamify/bin/run-app"
|
||||||
|
self.assertTrue(shortcuts.ours([("Exe", f'"{exe}"')], exe))
|
||||||
|
# An older install's start script counts as ours: updated, not doubled.
|
||||||
|
self.assertTrue(shortcuts.ours([("Exe", '"/home/u/.local/share/cachyos-gamescope-boot/bin/run-app"')], exe))
|
||||||
|
self.assertFalse(shortcuts.ours([("Exe", '"/usr/bin/other"')], exe))
|
||||||
|
self.assertFalse(shortcuts.ours([("Exe", '"/home/u/games/run-app"')], exe))
|
||||||
|
|
||||||
|
|
||||||
|
class ShortcutsCommandTests(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.dir = tempfile.TemporaryDirectory()
|
||||||
|
self.addCleanup(self.dir.cleanup)
|
||||||
|
self.vdf = os.path.join(self.dir.name, "userdata", "1", "config", "shortcuts.vdf")
|
||||||
|
self.exe = "/home/u/.local/share/steamify/bin/run-app"
|
||||||
|
|
||||||
|
def run_cmd(self, *args):
|
||||||
|
out = io.StringIO()
|
||||||
|
with contextlib.redirect_stdout(out), contextlib.redirect_stderr(io.StringIO()):
|
||||||
|
rc = shortcuts.main(["steam-shortcuts.py", *args])
|
||||||
|
return rc, out.getvalue().strip()
|
||||||
|
|
||||||
|
def entries(self):
|
||||||
|
return shortcuts.shortcuts(shortcuts.load(self.vdf))
|
||||||
|
|
||||||
|
def test_add_creates_the_file_and_an_entry(self):
|
||||||
|
rc, out = self.run_cmd("add", self.vdf, "Steamify", self.exe, "/icon.png", "steamify.desktop")
|
||||||
|
self.assertEqual(rc, 0)
|
||||||
|
self.assertTrue(out.startswith("added "))
|
||||||
|
(_, entry), = self.entries()
|
||||||
|
self.assertEqual(shortcuts.get(entry, "AppName"), "Steamify")
|
||||||
|
self.assertEqual(shortcuts.get(entry, "Exe"), f'"{self.exe}"')
|
||||||
|
# Steam's id for a shortcut has the top bit set.
|
||||||
|
self.assertGreaterEqual(shortcuts.get(entry, "appid"), 0x80000000)
|
||||||
|
self.assertEqual(out, f"added {shortcuts.get(entry, 'appid')}")
|
||||||
|
|
||||||
|
def test_add_twice_updates_instead_of_doubling(self):
|
||||||
|
self.run_cmd("add", self.vdf, "Steamify", self.exe, "/a.png", "a.desktop")
|
||||||
|
rc, out = self.run_cmd("add", self.vdf, "Steamify 2", self.exe, "/b.png", "b.desktop")
|
||||||
|
self.assertTrue(out.startswith("updated "))
|
||||||
|
entries = self.entries()
|
||||||
|
self.assertEqual(len(entries), 1)
|
||||||
|
self.assertEqual(shortcuts.get(entries[0][1], "AppName"), "Steamify 2")
|
||||||
|
self.assertEqual(shortcuts.get(entries[0][1], "icon"), "/b.png")
|
||||||
|
|
||||||
|
def test_other_entries_are_kept(self):
|
||||||
|
self.run_cmd("add", self.vdf, "Other", "/usr/bin/other", "", "")
|
||||||
|
self.run_cmd("add", self.vdf, "Steamify", self.exe, "", "")
|
||||||
|
self.assertEqual(len(self.entries()), 2)
|
||||||
|
self.assertEqual([k for k, _ in self.entries()], ["0", "1"])
|
||||||
|
|
||||||
|
def test_find(self):
|
||||||
|
self.assertEqual(self.run_cmd("find", self.vdf, self.exe)[0], 1)
|
||||||
|
_, out = self.run_cmd("add", self.vdf, "Steamify", self.exe, "", "")
|
||||||
|
rc, found = self.run_cmd("find", self.vdf, self.exe)
|
||||||
|
self.assertEqual((rc, found), (0, out.split()[1]))
|
||||||
|
|
||||||
|
def test_remove_by_appid_renumbers(self):
|
||||||
|
self.run_cmd("add", self.vdf, "Other", "/usr/bin/other", "", "")
|
||||||
|
_, out = self.run_cmd("add", self.vdf, "Steamify", self.exe, "", "")
|
||||||
|
self.assertEqual(self.run_cmd("remove", self.vdf, out.split()[1])[0], 0)
|
||||||
|
entries = self.entries()
|
||||||
|
self.assertEqual([k for k, _ in entries], ["0"])
|
||||||
|
self.assertEqual(shortcuts.get(entries[0][1], "AppName"), "Other")
|
||||||
|
|
||||||
|
def test_remove_of_nothing_leaves_the_file_alone(self):
|
||||||
|
self.run_cmd("add", self.vdf, "Steamify", self.exe, "", "")
|
||||||
|
with open(self.vdf, "rb") as f:
|
||||||
|
before = f.read()
|
||||||
|
self.assertEqual(self.run_cmd("remove", self.vdf, "999")[0], 0)
|
||||||
|
with open(self.vdf, "rb") as f:
|
||||||
|
self.assertEqual(f.read(), before)
|
||||||
|
|
||||||
|
def test_unknown_command(self):
|
||||||
|
self.assertEqual(self.run_cmd("bogus", self.vdf)[0], 2)
|
||||||
|
|
||||||
|
|
||||||
|
class NotifierTests(unittest.TestCase):
|
||||||
|
def test_version(self):
|
||||||
|
self.assertEqual(notifier.version("v2.11.1"), (2, 11, 1))
|
||||||
|
self.assertEqual(notifier.version("2.9.0"), (2, 9, 0))
|
||||||
|
self.assertIsNone(notifier.version("nightly"))
|
||||||
|
|
||||||
|
def test_versions_compare_as_numbers(self):
|
||||||
|
self.assertGreater(notifier.version("2.10.0"), notifier.version("2.9.0"))
|
||||||
|
|
||||||
|
def pending(self, new, seen="", skipped=""):
|
||||||
|
values = {"seen": seen, "skipped": skipped}
|
||||||
|
with mock.patch.object(notifier, "state", lambda key: values[key]):
|
||||||
|
return notifier.pending(new)
|
||||||
|
|
||||||
|
def test_newer_than_seen(self):
|
||||||
|
self.assertTrue(self.pending("2.12.0", seen="2.11.1"))
|
||||||
|
|
||||||
|
def test_same_or_older_is_not_pending(self):
|
||||||
|
self.assertFalse(self.pending("2.11.1", seen="2.11.1"))
|
||||||
|
self.assertFalse(self.pending("2.9.0", seen="2.11.1"))
|
||||||
|
|
||||||
|
def test_skipped_version_is_not_pending(self):
|
||||||
|
self.assertFalse(self.pending("2.12.0", seen="2.11.1", skipped="2.12.0"))
|
||||||
|
|
||||||
|
def test_nothing_seen_yet(self):
|
||||||
|
self.assertTrue(self.pending("2.12.0", seen=""))
|
||||||
|
|
||||||
|
def test_unparsable_tag_is_not_pending(self):
|
||||||
|
# A release tag like "nightly" must not crash the daily check.
|
||||||
|
self.assertFalse(self.pending("nightly", seen="2.11.1"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Unit tests of the Python helpers in steamify-cachyos/patches (steam-shortcuts.py,
|
||||||
|
# steamify-notifier.py). No root, VM or hardware needed: bash tests/python-test.sh
|
||||||
|
# The Steamify checkout (REPO, default: the steamify-cachyos next to this repo)
|
||||||
|
REPO="${REPO:-$(cd "$(dirname "$0")/../../steamify-cachyos" && pwd)}"
|
||||||
|
export REPO
|
||||||
|
cd "$(dirname "$0")/.." || exit 1
|
||||||
|
if python3 -B -m unittest tests/patches_test.py 2>&1 | tail -n 25 | tee /dev/stderr | grep -q '^OK'; then
|
||||||
|
echo "ok Python helpers"
|
||||||
|
else
|
||||||
|
echo "FAIL Python helpers"; exit 1
|
||||||
|
fi
|
||||||
Reference in new issue
Block a user