[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -1,12 +1,11 @@
<services>
<service name="tar_git">
<param name="url">https://codeberg.org/nephros/systemd-watcher</param>
- <param name="branch"></param>
+ <param name="revision">chum-testing</param>
<!--
+ <param name="branch"></param>
<param name="revision">0.9.16</param>
- <param name="revision">chum-testing</param>
-->
- <param name="revision">0.9.16</param>
<param name="token"/>
<param name="debian">N</param>
<param name="dumb">N</param>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/README.md
^
|
@@ -1,9 +1,10 @@
-# SailorD
+# SailorD - a SystemD Manager for Sailfish OS
-Simple application which lists interesting systemd units, and monitors them.
-Notifications are triggered if one of them goes into 'failed' state.
+SailorD shows and conreols interesting systemd units, and can act as a simple
+monitor for them.
-The app must be running for monitoring or notifications to happen.
+Notifications are triggered if one of them goes into 'failed' state. The app
+must be running for monitoring or notifications to happen.
Features:
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/harbour-sailord.desktop
^
|
@@ -1,7 +1,9 @@
[Desktop Entry]
Type=Application
Icon=harbour-sailord
-Exec=invoker --type=silica-qt5 --single-instance sailfish-qml harbour-sailord
+X-Nemo-Application-Type=silica-qt5
+X-Nemo-Single-Instance=yes
+Exec=sailfish-qml harbour-sailord
Name=SailorD
Name[de]=SailorD
Name[en]=SailorD
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/harbour-sailord.pro
^
|
@@ -1,6 +1,6 @@
-
+TEMPLATE=aux
TARGET = harbour-sailord
-CONFIG += lrelease embed_translations sailfishapp_i18n
+CONFIG += lrelease embed_translations #sailfishapp_i18n
lupdate_only {
SOURCES += \
@@ -16,11 +16,11 @@
translations/$${TARGET}-sv.ts \
desktop.files = $${TARGET}.desktop
-desktop.path = /usr/share/applications
+desktop.path = $$PREFIX/share/applications
INSTALLS += desktop
qml.files = qml
-qml.path = /usr/share/$${TARGET}
+qml.path = $$PREFIX/share/$${TARGET}
INSTALLS += qml
@@ -28,4 +28,5 @@
include(translations/translations.pri)
include(sailjail/sailjail.pri)
+# must be last
include(icons/icons.pri)
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/icons/icons.pri
^
|
@@ -1,5 +1,5 @@
-TEMPLATE = aux
-QMAKE_EXTRA_TARGETS += svg appicon
+# Configures svg to png
+THEMENAME = sailfish-default
INSTALLS += svg appicon
appicon.sizes = \
@@ -13,18 +13,21 @@
for(iconsize, appicon.sizes) {
profile = $${iconsize}x$${iconsize}
+
system(mkdir -p $${_PRO_FILE_PWD_}/icons/$${profile})
appicon.commands += /usr/bin/sailfish_svg2png \
-z 1.0 -s 1 1 1 1 1 1 $${iconsize} \
$${_PRO_FILE_PWD_}/icons/svgs \
- $${_PRO_FILE_PWD_}/icons/$${profile}/apps ;
+ $${_PRO_FILE_PWD_}/icons/$${profile}/apps &&
appicon.files += $${_PRO_FILE_PWD_}/icons/$${profile}
}
appicon.commands += true
-appicon.path = /usr/share/icons/hicolor/
+appicon.path = $$PREFIX/share/icons/hicolor/
+appicon.CONFIG += no_check_exist
+
# also install SVG:
-svg.path = /usr/share/icons/hicolor/scalable/apps
-svg.files = icons/svgs/*.svg
+svg.path = $$PREFIX/share/icons/hicolor/scalable/apps
+svg.files = $${_PRO_FILE_PWD_}/icons/svgs/$${TARGET}.svg
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/qml/components/DetailsPanel.qml
^
|
@@ -105,6 +105,7 @@
}
Button {
text: "Daemon reload"
+ icon.source: "image://theme/icon-m-refresh"
anchors.horizontalCenter: parent.horizontalCenter
onClicked: { dbus.daemon_reload(); panel.hide() }
}
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/qml/components/UnitItem.qml
^
|
@@ -15,6 +15,7 @@
onVisibleChanged: visible
&& (unitFileState === "unset")
&& (state != "mount")
+ && (model.unit)
? dbus.getUnitState(model.unit, setUnitFileState) : 0
// cf. app.supportedUnits and page.states
@@ -71,11 +72,17 @@
}
// define the functions here so they are not in ContextMenu scope
- function enableUnit() { var u = unit; remorseAction(qsTr("Enabling %1").arg(u), function() { dbus.enable(u) }) }
- function disableUnit() { var u = unit; remorseAction(qsTr("Disabling %1").arg(u), function() { dbus.disable(u) }) }
- function startUnit() { var u = unit; remorseAction(qsTr("Starting %1").arg(u), function() { dbus.start(u) }) }
- function stopUnit() { var u = unit; remorseAction(qsTr("Stopping %1").arg(u), function() { dbus.stop(u) }) }
- function restartUnit() { var u = unit; remorseAction(qsTr("Restarting %1").arg(u), function() { dbus.restart(u) }) }
+ //function enableUnit() { var u = unit; remorseAction(qsTr("Enabling %1" ).arg(u), function() { dbus.enable(u) }) }
+ //function disableUnit() { var u = unit; remorseAction(qsTr("Disabling %1" ).arg(u), function() { dbus.disable(u) }) }
+ //function startUnit() { var u = unit; remorseAction(qsTr("Starting %1" ).arg(u), function() { dbus.start(u) }) }
+ //function stopUnit() { var u = unit; remorseAction(qsTr("Stopping %1" ).arg(u), function() { dbus.stop(u) }) }
+ //function restartUnit() { var u = unit; remorseAction(qsTr("Restarting %1").arg(u), function() { dbus.restart(u) }) }
+ // use Remorse instead of remorseAction, so we can have multiple ones simultanuously:
+ function enableUnit() { var u = unit; Remorse.itemAction(item, qsTr("Enabling %1" ).arg(u), function() { dbus.enable(u) }) }
+ function disableUnit() { var u = unit; Remorse.itemAction(item, qsTr("Disabling %1" ).arg(u), function() { dbus.disable(u) }) }
+ function startUnit() { var u = unit; Remorse.itemAction(item, qsTr("Starting %1" ).arg(u), function() { dbus.start(u) }) }
+ function stopUnit() { var u = unit; Remorse.itemAction(item, qsTr("Stopping %1" ).arg(u), function() { dbus.stop(u) }) }
+ function restartUnit() { var u = unit; Remorse.itemAction(item, qsTr("Restarting %1").arg(u), function() { dbus.restart(u) }) }
// Decide which menu to show depending on user settings
// WARNING! Logic ahead!
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/qml/harbour-sailord.qml
^
|
@@ -2,7 +2,7 @@
Apache License 2.0
-Copyright (c) 2022 Peter G. (nephros)
+Copyright (c) 2022,2023 Peter G. (nephros)
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License.
@@ -31,6 +31,8 @@
ApplicationWindow {
id: app
+ allowedOrientations: Orientation.All
+
property ListModel ignore: ListModel{} // global ignore list: all that are ignored
property ListModel pignore: ListModel{} // persistent ignore list: things to be saved are added to this
@@ -69,6 +71,7 @@
// user settings
property alias notify: config.notify
property alias notifySticky: config.notifySticky
+ property alias showSuccess: config.showSuccess
property alias checkInterval: config.checkInterval
property alias ignoreAll: config.ignoreAll
property alias hybris: config.hybris
@@ -154,6 +157,7 @@
path: "app"
property bool notify: true
property bool notifySticky: false
+ property bool showSuccess: true
property bool ignoreAll: false
property int checkInterval: 120
property bool hybris: false
@@ -163,6 +167,49 @@
property string ignoreList: '[]'
}
+ // pointless assignment for debugging with qmlscene, which calls itself "QtQmlViewer":
+ readonly property string busname: (Qt.application.name === "QtQmlViewer") ? "SailorD" : Qt.application.name
+ DBusAdaptor { id: listener
+ bus: DBus.SessionBus
+ service: "org.nephros.sailfish." + busname
+ iface: "org.nephros.sailfish." + busname
+ path: "/org/nephros/sailfish/" + busname
+ xml: '<interface name="' + iface + '">\n'
+ + '<method name="open" />\n'
+ + '<method name="openPage">\n'
+ + ' <arg name="page" type="s" direction="in">'
+ + ' <doc:doc>'
+ + ' <doc:summary>'
+ + ' Name of the page to open'
+ + ' </doc:summary>'
+ + ' </doc:doc>'
+ + ' </arg>'
+ + '</method>\n'
+ + '<method name="refresh" />\n'
+ + '</interface>\n'
+
+ function open() {
+ console.info("App opened via DBus call.")
+ __silica_applicationwindow_instance.activate()
+ }
+ function openPage(which) {
+ open()
+ console.warn("Page opening not implemented, just triggering app.")
+ return
+ switch (which) {
+ default:
+ pageStack.push(Qt.resolvedUrl("pages/%1.qml".arg(which)))
+ }
+ return
+ }
+ function refresh() {
+ console.info("DBus triggered refresh.")
+ app.refresh()
+ }
+ Component.onCompleted: console.debug(qsTr("DBus service %1 ready").arg(service))
+ }
+
+
DBusInterface {
id: dbus
bus: DBus.SessionBus
@@ -293,7 +340,7 @@
// parameters: unit, callback cb
function getUnitState(u, cb) {
call('GetUnitFileState',
- [u, ],
+ [u],
function(result) { cb(result) },
function(result) { console.debug("failure: ", u, result) }
);
@@ -372,8 +419,19 @@
* Popups and Notifications
***************************
*/
- Notification { id: message; isTransient: true; appName: Qt.application.name; appIcon: "harbour-sailord"; }
Notification { id: smessage; isTransient: true; }
+ Notification { id: message; isTransient: true; appName: Qt.application.name; appIcon: "harbour-sailord";
+ property string pageName: "MainPage" // FIXME
+ remoteActions: [ {
+ "name": "default",
+ "displayName": "Open",
+ "service": listener.service,
+ "path": listener.path,
+ "iface": listener.iface,
+ "method": "openPage",
+ "arguments": [ pageName ]
+ } ]
+ }
// notification(message)
function popup(s) {
@@ -384,6 +442,7 @@
}
// notification (action, message)
function successMsg(a, m) {
+ if (!config.showSuccess) return
console.debug("success:", m)
message.previewSummary = qsTr("%1 successful.", "arg is an operation, such as 'restarting service X'").arg(a);
message.summary = qsTr("Success:");
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/qml/pages/SettingsPage.qml
^
|
@@ -205,7 +205,7 @@
text: qsTr("Bus Switching")
description: qsTr("If enabled, you will be able to toggle access to the System Bus.")
}
- TextSwitch{
+ TextSwitch{ id: controlsw
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
checked: app.systemctl
@@ -217,6 +217,16 @@
Even if enabled, standard systemd/dbus/polkit permissions apply. This means some of the operations may not succeed, or ask for authorization.<br />
")
}
+ TextSwitch{ id: succcsw
+ enabled: controlsw.checked
+ width: parent.width
+ anchors.horizontalCenter: parent.horizontalCenter
+ checked: app.showSuccess
+ automaticCheck: true
+ text: qsTr("Show Success Popups")
+ description: qsTr("If disabled, the app will only show popups about operation failures. Otherwise, succeess is reported as popup message.")
+ onClicked: app.showSuccess = checked
+ }
}
/*
PullDownMenu {
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/qml/pages/ViewUnitFile.qml
^
|
@@ -54,7 +54,7 @@
PullDownMenu {
flickable: view
- MenuItem { text: qsTr("Share %1…").arg("Unit File", "argument for 'Share'")
+ MenuItem { text: qsTr("Share %1…").arg(qsTr("Unit File", "argument for 'Share'"))
enabled: ( (page.fileName.length > 0) && (page.fileData.length > 0) )
onClicked: {
var r = [
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/sailjail/harbour-sailord.profile
^
|
@@ -11,6 +11,7 @@
## PERMISSIONS
# x-sailjail-permission = Notifications
+include /etc/sailjail/permissions/Notifications.permission
### D-Bus
dbus-user filter
@@ -18,13 +19,39 @@
dbus-user.call org.freedesktop.DBus=org.freedesktop.DBus@/*
dbus-user.broadcast org.freedesktop.DBus=org.freedesktop.DBus@/*
+# BEG systemd manager and related:.system
+dbus-system.talk org.freedesktop.systemd1
+dbus-system.broadcast org.freedesktop.systemd1=org.freedesktop.systemd1.*@/*
+dbus-system.call org.freedesktop.systemd1=org.freedesktop.systemd1@/*
+dbus-system.call *=org.freedesktop.systemd1.Manager@/*
+dbus-system.call *=org.freedesktop.systemd1.Unit@/*
+dbus-system.call *=org.freedesktop.systemd1.Service@/*
+dbus-system.call *=org.freedesktop.systemd1.Socket@/*
+dbus-system.call *=org.freedesktop.systemd1.Target@/*
+dbus-system.call *=org.freedesktop.systemd1.Mount@/*
+dbus-system.call *=org.freedesktop.systemd1.Timer@/*
+#dbus-system.call *=org.freedesktop.systemd1.Swap@/*
+dbus-system.call *=org.freedesktop.systemd1.Path@/*
+#dbus-system.call *=org.freedesktop.systemd1.Slice@/*
+dbus-system.call *=org.freedesktop.systemd1.Job@/*
+
+
+
# BEG systemd manager and related
dbus-user.talk org.freedesktop.systemd1
+dbus-user.broadcast org.freedesktop.systemd1=org.freedesktop.systemd1.*@/*
dbus-user.call org.freedesktop.systemd1=org.freedesktop.systemd1@/*
-dbus-user.talk *=org.freedesktop.systemd1
dbus-user.call *=org.freedesktop.systemd1.Manager@/*
dbus-user.call *=org.freedesktop.systemd1.Unit@/*
dbus-user.call *=org.freedesktop.systemd1.Service@/*
-dbus-user.call *=org.freedesktop.systemd1.Path@/*
+dbus-user.call *=org.freedesktop.systemd1.Socket@/*
+dbus-user.call *=org.freedesktop.systemd1.Target@/*
dbus-user.call *=org.freedesktop.systemd1.Mount@/*
+dbus-user.call *=org.freedesktop.systemd1.Timer@/*
+#dbus-user.call *=org.freedesktop.systemd1.Swap@/*
+dbus-user.call *=org.freedesktop.systemd1.Path@/*
+#dbus-user.call *=org.freedesktop.systemd1.Slice@/*
+dbus-user.call *=org.freedesktop.systemd1.Job@/*
+
+
# END systemd manager and related
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/translations/harbour-sailord-de.ts
^
|
@@ -343,6 +343,14 @@
<source>No ignored units</source>
<translation>Keine verborgenen Einheiten in der Liste</translation>
</message>
+ <message>
+ <source>Show Success Popups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If disabled, the app will only show popups about operation failures. Otherwise, succeess is reported as popup message.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Unit</name>
@@ -630,6 +638,11 @@
<source>Share %1…</source>
<translation>%1 teilen…</translation>
</message>
+ <message>
+ <source>Unit File</source>
+ <comment>argument for 'Share'</comment>
+ <translation>Elementdatei</translation>
+ </message>
</context>
<context>
<name>harbour-sailord</name>
@@ -729,5 +742,9 @@
<comment>failure message, e.g. 'starting failed for unit foo'</comment>
<translation>%1 %2 für Element %3</translation>
</message>
+ <message>
+ <source>DBus service %1 ready</source>
+ <translation>DBus-Dienst</translation>
+ </message>
</context>
</TS>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/translations/harbour-sailord-en.ts
^
|
@@ -130,79 +130,83 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ignored Units:</source>
+ <source>If enabled, the app will send notifications about failed units.<br /> Use the slider below to specify how often to check.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Clear permanent ignore list</source>
+ <source>Check every</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>List Cleared.</source>
+ <source>min</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Clear session ignore list</source>
+ <source>Sticky Notifications</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Sticky Notifications</source>
+ <source>If enabled, the app will update a single notification (as opposed to sending a new one each time).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, the app will update a single notification (as opposed to sending a new one each time).</source>
+ <source>Offer Ignore for all units</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>These units are permanently ignored:</source>
+ <source>If enabled, the app will offer the ignore opton for any unit (not just failed ones).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>These units are ignored in this session:</source>
+ <source>Ignored Units:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Advanced:</source>
+ <source>No ignored units</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Hide Firmware mounts</source>
+ <source>Clear permanent ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, the app will not list firmware (Android Base, Hybris) mounts.</source>
+ <source>List Cleared.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Hide uninteresting units</source>
+ <source>These units are permanently ignored:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, the app will not list units that are plugged, tentative, or similar.</source>
+ <source>Clear session ignore list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Control Units</source>
+ <source>These units are ignored in this session:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Bus Switching</source>
+ <source>Advanced:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, you will be able to toggle access to the System Bus.</source>
+ <source>Hide Firmware mounts</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, the app will send notifications about failed units.<br /> Use the slider below to specify how often to check.</source>
+ <source>If enabled, the app will not list firmware (Android Base, Hybris) mounts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Offer Ignore for all units</source>
+ <source>Hide uninteresting units</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, the app will offer the ignore opton for any unit (not just failed ones).</source>
+ <source>If enabled, the app will not list units that are plugged, tentative, or similar.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>⚠ Danger Zone 🛦🛦🛦</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -214,25 +218,29 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>If enabled, you will be able to start, stop, enable, disable units.<br />
- Even if enabled, standard systemd/dbus/polkit permissions apply. This means some of the operations may not succeed, or ask for authorization.<br />
-</source>
+ <source>Bus Switching</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Check every</source>
+ <source>If enabled, you will be able to toggle access to the System Bus.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>min</source>
+ <source>Control Units</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>⚠ Danger Zone 🛦🛦🛦</source>
+ <source>If enabled, you will be able to start, stop, enable, disable units.<br />
+ Even if enabled, standard systemd/dbus/polkit permissions apply. This means some of the operations may not succeed, or ask for authorization.<br />
+</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No ignored units</source>
+ <source>Show Success Popups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If disabled, the app will only show popups about operation failures. Otherwise, succeess is reported as popup message.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -447,6 +455,11 @@
<source>Share %1…</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unit File</source>
+ <comment>argument for 'Share'</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>harbour-sailord</name>
@@ -514,5 +527,9 @@
<comment>failure message, e.g. 'starting failed for unit foo'</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>DBus service %1 ready</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord-0.9.18.tar.gz/translations/harbour-sailord-sv.ts
^
|
@@ -253,6 +253,14 @@
<source>No ignored units</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Show Success Popups</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If disabled, the app will only show popups about operation failures. Otherwise, succeess is reported as popup message.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UnitItem</name>
@@ -477,6 +485,11 @@
<source>Share %1…</source>
<translation>Dela %1…</translation>
</message>
+ <message>
+ <source>Unit File</source>
+ <comment>argument for 'Share'</comment>
+ <translation type="unfinished">Enhetsfil</translation>
+ </message>
</context>
<context>
<name>harbour-sailord</name>
@@ -568,5 +581,9 @@
<comment>failure message, e.g. 'starting failed for unit foo'</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>DBus service %1 ready</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
</TS>
|
[-]
[+]
|
Changed |
_service:tar_git:harbour-sailord.yaml
^
|
@@ -1,6 +1,6 @@
Name: harbour-sailord
Summary: Displays systemd units and alerts about failures
-Version: 0.9.16
+Version: 0.9.18
Release: 1
Group: Applications/System
License: ASL 2.0
@@ -12,11 +12,9 @@
%{summary}
%if "%{?vendor}" == "chum"
- PackageName: SailorD
+ Title: SailorD
Type: desktop-application
- DeveloperName: Peter G.
DeveloperLogin: nephros
- PackagerName: nephros
Categories:
- System
- Utility
@@ -32,11 +30,7 @@
- %{url}/raw/branch/master/Screenshot_004.jpg
- %{url}/raw/branch/master/Screenshot_005.jpg
Url:
- Donations:
- - https://noyb.eu/en/donations-other-support-options
- - https://my.fsfe.org/donate
- - https://supporters.eff.org/donate/join-4
- - https://openrepos.net/donate
+ Donations: - https://noyb.eu/en/donations-other-support-options
%endif
SetupOptions: -q -n %{name}-%{version}
|