diff options
author | smac89 | 2023-05-19 14:19:22 -0600 |
---|---|---|
committer | smac89 | 2023-05-19 14:19:22 -0600 |
commit | 42a6c8cc52d1cb0819c99abcf9c3f208d0af1b5d (patch) | |
tree | dfeb51e34725691fa3a704e12e6cea33f5ab778d /fbrokendesktop.py | |
parent | 732f16cdb8ea828c265297fbb7225777c83e20d9 (diff) | |
download | aur-42a6c8cc52d1cb0819c99abcf9c3f208d0af1b5d.tar.gz |
detect missing gnome dbus applications
Diffstat (limited to 'fbrokendesktop.py')
-rwxr-xr-x | fbrokendesktop.py | 75 |
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) |