Skip to content

Commit

Permalink
arch_updates module: make it more responsive to system updates (#2215)
Browse files Browse the repository at this point in the history
  • Loading branch information
geoffliu committed Oct 13, 2023
1 parent 1092630 commit 24888b3
Showing 1 changed file with 52 additions and 7 deletions.
59 changes: 52 additions & 7 deletions py3status/modules/arch_updates.py
Expand Up @@ -2,9 +2,13 @@
Display number of pending updates for Arch Linux.
Configuration parameters:
cache_timeout: refresh interval for this module (default 600)
format: display format for this module, otherwise auto (default None)
hide_if_zero: don't show on bar if True (default False)
pacman_log_location: location of the pacman log (default '/var/log/pacman.log')
refresh_interval: interval (in seconds) between refreshing data from package
database or AUR. Note that this module may refresh sooner than the
specified interval, if pacman log is modified since the last refresh
time. (default 3600)
Format placeholders:
{aur} Number of pending aur updates
Expand All @@ -28,20 +32,34 @@
aur
{'full_text': 'UPD: 15/4'}
"""
import os
import time

STRING_NOT_INSTALLED = "{} not installed"
CACHE_KEY_TEXT = "arch_updates_text"
CACHE_KEY_TIMESTAMP = "arch_updates_timestamp"


class Py3status:
""" """

# available configuration parameters
cache_timeout = 600
format = None
hide_if_zero = False
pacman_log_location = "/var/log/pacman.log"
refresh_interval = 3600

class Meta:
deprecated = {"remove": [{"param": "include_aur", "msg": "obsolete"}]}
deprecated = {
"remove": [{"param": "include_aur", "msg": "obsolete"}],
"rename": [
{
"param": "cache_timeout",
"new": "refresh_interval",
"msg": "cache_timeout has been renamed to refresh_interval",
}
],
}

def post_config_hook(self):
helper = {
Expand Down Expand Up @@ -117,6 +135,36 @@ def _get_pikaur_updates(self):
return None if ce.error else 0

def arch_updates(self):
cached = self._get_cached_value()
if cached is not None:
return {"full_text": cached}

full_text = self._get_display_text()

self.py3.storage_set(CACHE_KEY_TEXT, full_text)
self.py3.storage_set(CACHE_KEY_TIMESTAMP, time.time())

return {"full_text": full_text}

def _get_cached_value(self):
text = self.py3.storage_get(CACHE_KEY_TEXT)
generated_at = self.py3.storage_get(CACHE_KEY_TIMESTAMP)

if text is None or generated_at is None:
return None

# If the log file has been updated since last refresh, the update number
# is likely no longer valid. We skip the cache here.
log_mtime = os.path.getmtime(self.pacman_log_location)
if generated_at < log_mtime:
return None

if generated_at + self.refresh_interval > time.time():
return text

return None

def _get_display_text(self):
pacman, aur, total, full_text = None, None, None, ""

if self._get_pacman_updates:
Expand All @@ -130,10 +178,7 @@ def arch_updates(self):
arch_data = {"aur": aur, "pacman": pacman, "total": total}
full_text = self.py3.safe_format(self.format, arch_data)

return {
"cached_until": self.py3.time_in(self.cache_timeout),
"full_text": full_text,
}
return full_text


if __name__ == "__main__":
Expand Down

0 comments on commit 24888b3

Please sign in to comment.