Skip to content

Instantly share code, notes, and snippets.

@flops
Last active December 23, 2017 08:20
Show Gist options
  • Save flops/26e02c63dd1193332c3a5e060a05d565 to your computer and use it in GitHub Desktop.
Save flops/26e02c63dd1193332c3a5e060a05d565 to your computer and use it in GitHub Desktop.
Hardcode-Tray Hook for pacman
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = *
[Action]
Description = Updating tray icons...
Depends = hardcode-tray-git
When = PostTransaction
Exec = /usr/bin/python /opt/Hardcode-Tray-Hook/hook.py
NeedsTargets
  1. Add 90-hardcode-tray.hook to /etc/pacman.d/hooks/
  2. Change Depends = hardcode-tray-git on hardcode-tray if using this package.
  3. Add hook.py to /opt/Hardcode-Tray-Hook/
  4. ..
  5. Profit!
#!/usr/bin/env python3
import json
import re
import sys
from subprocess import run, PIPE
from glob import glob
from os import path
from HardcodeTray.const import DB_FOLDER, USERHOME
HARDCORE_TRAY_PACKAGES = ['hardcode-tray-git', 'hardcode-tray']
BLACKLIST = ['mullvad'] # Added cause got /usr/bin in it paths
CONVERSION_TOOL = 'RSVGConvert' # None if not needed
THEME = 'Papirus-Dark' # None if not needed
class Hook:
userhome_re = r"{userhome}"
def __init__(self, packages):
self.__packages = packages
self.__db = self.read_db_files()
def read_db_files(self):
""" Reading all package paths """
files = glob("{0}*.json".format(path.join(DB_FOLDER, "")))
db = {}
for db_file in files:
script_name = path.splitext(path.basename(db_file))[0]
if script_name in BLACKLIST:
continue
with open(db_file, 'r') as db_file:
app_path = json.load(db_file)['app_path']
db[script_name] = [re.sub(Hook.userhome_re, USERHOME, sctipt_path) for sctipt_path in app_path]
return db
def get_package_paths(self, package):
""" Reading all package paths from pacman """
regex = r"^%s\s+" % re.escape(package)
proc = run(
[
"pacman", "-Ql",
package
],
stdout=PIPE,
stderr=PIPE,
)
if proc.returncode == 0:
output = str(proc.stdout, "utf-8").split('\n')
return [re.sub(regex, '',line) for line in output if re.match(regex, line)]
else:
return []
def get_supported_scripts(self):
""" Finding supported scripts """
supported_scripts = [];
for package in self.__packages:
package_paths = self.get_package_paths(package)
for path in package_paths:
for script_name, script_paths in self.__db.items():
if path in script_paths:
supported_scripts.append(script_name)
return set(supported_scripts)
def run_hadcode_tray(self, packages = None):
""" Hardcode tray bit execution """
args = ["hardcode-tray"]
if CONVERSION_TOOL != None:
args += ["--conversion-tool", CONVERSION_TOOL]
if THEME != None:
args += ["--theme", THEME]
if packages != None:
args += ["--only", ','.join(packages)]
args.append("--apply")
proc = run(
args,
stdout=PIPE,
stderr=PIPE,
)
return (proc.returncode == 0)
def execute(self):
""" Execution method running hardcode-tray for supported apps"""
for package in self.__packages:
if package in HARDCORE_TRAY_PACKAGES:
if self.run_hadcode_tray():
print("All packages are updated.")
return True
else:
print("Packages update failed.")
return False
packages_for_update = self.get_supported_scripts()
if len(packages_for_update) == 0:
print("No packages for update has been found.")
return True
else:
if self.run_hadcode_tray(packages_for_update):
print("Packages: %s - updated." % ', '.join(packages_for_update))
return True
else:
print("Packages: %s - failed." % ', '.join(packages_for_update))
return False
return True
input_str = sys.stdin.read()
packages = [x for x in input_str.split('\n') if x]
hook = Hook(packages)
if not hook.execute():
sys.exitsys.exit('Hook failed')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment