summarylogtreecommitdiffstats
path: root/fbrokendesktop.py
diff options
context:
space:
mode:
authorsmac892023-05-19 14:19:22 -0600
committersmac892023-05-19 14:19:22 -0600
commit42a6c8cc52d1cb0819c99abcf9c3f208d0af1b5d (patch)
treedfeb51e34725691fa3a704e12e6cea33f5ab778d /fbrokendesktop.py
parent732f16cdb8ea828c265297fbb7225777c83e20d9 (diff)
downloadaur-42a6c8cc52d1cb0819c99abcf9c3f208d0af1b5d.tar.gz
detect missing gnome dbus applications
Diffstat (limited to 'fbrokendesktop.py')
-rwxr-xr-xfbrokendesktop.py75
1 files changed, 51 insertions, 24 deletions
diff --git a/fbrokendesktop.py b/fbrokendesktop.py
index 7854adf05726..4a92f6a3acba 100755
--- a/fbrokendesktop.py
+++ b/fbrokendesktop.py
@@ -4,6 +4,7 @@ import glob
import re
import shlex
import shutil
+import subprocess
from os import path
@@ -13,33 +14,59 @@ from xdg.DesktopEntry import DesktopEntry
# allow matching empty envs with .*
env_re = re.compile(r'\w+=.*')
+# installed gapps
+gapps = []
+
+def is_valid_cmd(cmd_args: list[str]):
+ if cmd_args[0] == 'exec':
+ return is_valid_cmd(cmd_args[1:])
+ if cmd_args[0] == 'env':
+ return is_valid_cmd(cmd_args[1:])
+
+ for tok in cmd_args:
+ # ignore all attempts to set environment variables
+ if not env_re.match(tok):
+ if shutil.which(tok):
+ return True
+ break
+ return False
+
+def is_valid_gapp_cmd(cmd_args: list[str]):
+ if is_gapp_cmd(cmd_args):
+ app_id = cmd_args[2]
+ if not gapps:
+ try:
+ output = subprocess.check_output(['gapplication', 'list-apps'], text=True)
+ gapps.extend((output or '').split('\n'))
+ except subprocess.CalledProcessError:
+ gapps.append('')
+ return app_id in gapps
+ return False
+
+def is_gapp_cmd(cmd_args: list[str]):
+ return len(cmd_args) > 2 and cmd_args[0] == 'gapplication' and cmd_args[1] == 'launch'
+
def find_missing_desktop_files(desktop_dir: str):
- for df in glob.iglob('*.desktop', root_dir=desktop_dir):
- de = DesktopEntry(path.join(desktop_dir, df))
- if exc := (de.getTryExec() or de.getExec()):
- cmd = shlex.split(exc)
- if cmd[0] == 'exec':
- cmd = cmd[1:]
- if cmd[0] == 'env':
- cmd = cmd[1:]
-
- for tok in cmd:
- # ignore all attempts to set environment variables
- if not env_re.match(tok):
- if not shutil.which(tok):
- yield shlex.quote(de.getFileName())
- break
+ for df in glob.iglob('*.desktop', root_dir=desktop_dir):
+ de = DesktopEntry(path.join(desktop_dir, df))
+ if exc := (de.getTryExec() or de.getExec()):
+ cmd = shlex.split(exc)
+ if is_gapp_cmd(cmd):
+ if not is_valid_gapp_cmd(cmd):
+ yield shlex.quote(de.getFileName())
+ elif not is_valid_cmd(cmd):
+ yield shlex.quote(de.getFileName())
def find_desktop_directories():
- """
- https://wiki.archlinux.org/title/desktop_entries#Modify_desktop_files
- https://wiki.archlinux.org/title/XDG_Autostart#Directories
- """
- yield from BaseDirectory.load_data_paths('applications')
- yield from BaseDirectory.load_config_paths('autostart')
+ """
+ https://wiki.archlinux.org/title/desktop_entries#Modify_desktop_files
+ https://wiki.archlinux.org/title/XDG_Autostart#Directories
+ """
+ yield from BaseDirectory.load_data_paths('applications')
+ yield from BaseDirectory.load_config_paths('autostart')
# TODO add option to respect NotShowIn and NoDisplay options
if __name__ == '__main__':
- for d in find_desktop_directories():
- for df in find_missing_desktop_files(d):
- print (df)
+ for d in find_desktop_directories():
+ for df in find_missing_desktop_files(d):
+ print (df)