[4.0.0] - unreleased
This release aims to further improve Pueue and to rectify some old design decisions.
Removing internal channel communication
TLDR: Commands that start/stop/kill/pause tasks now only return when the task is actually started/stopped/killed/paused.
Until recently, Pueue managed subprocess (task) states in a dedicated thread.
Client commands affecting subprocesses, such as pueue start --immediate
, were relayed to this special thread via an mpsc
channel for processing.
This setup caused short delays before the instructions were executed.
For instance, tasks would begin a few hundred milliseconds after the client received an Ok
from the daemon, despite using the --immediate
flag.
This behavior was unintuitive and often led to commands like pueue add --immediate install_something && pueue send 0 'y\n'
failing, as the task had not started by the time pueue send
was called.
The new state design resolves this issue by allowing Pueue to manipulate subprocess states directly within the client message handlers, eliminating any delays.
New editing
Task editing was a bit tedious until recently.
One could only edit a single task at a time and you had to specify which properties you wanted to add.
Each property was then opened in a new $EDITOR
session, which meant that users had to open and close editors up to four times to edit a single task.
After a lot of consideration, a new way of editing tasks has been designed that allows simple and convenient editing of multiple tasks at once.
For this, a temporary directory is created for every task to edit and a new file for every property, resulting in the following structure:
📁 0/
│ * command
│ * label
│ * path
└ * priority
You can then just navigate the resulting file structure and edit the properties you want in the editor of your choice.
I'm aware that this might not be for everyone, so feedback is very much encouraged over here.
Runtime invariants
TLDR: A new task state representation has been introduced, that's significantly cleaner and fixes some bugs.
However, it breaks compatibility with old states, so ensure there are no important tasks in your queue before updating. You'll also need to recreate groups.
Previously, various task-state related invariants were manually enforced during runtime. For example, a Queued
task should not have a start
or enqueued_at
time set.
Turns out, doing this manually is highly error-prone, as it is difficult to account for every state transition and ensure everything is set or cleaned up correctly.
Fortunately, this issue can be addressed in a more elegant way in Rust using struct enums. This method enforces invariants via the type system at compile time.
Although the affected code became slightly more verbose (about 25% larger), it eliminated an entire class of bugs.
During this refactoring, I discovered at least two instances where I had forgotten to clear a variable, leading to inconsistent state.
Since the new structure differs significantly from the old one, it completely breaks backward compatibility.
Upon updating Pueue and restarting the daemon, the previous state will be wiped, resulting in a clean slate.
Change
- Breaking: Refactor internal task state. Some task variables have been moved into the
TaskStatus
enum, which now enforces various invariants during compile time via the type system.
Due to this, several subtle time related inconsistencies (task start/stop/enqueue times) have been fixed. #556
Important: This completely breaks backwards compatibility, including previous state.
Important: The Pueue daemon needs to be restarted and the state will be wiped clean. - Breaking: Streamlined
pueue log
parameters to behave the same way asstart
,pause
orkill
. #509 - Breaking: Remove the
--children
commandline flags, that have been deprecated and no longer serve any function sincev3.0.0
. - Send log output to
stderr
instead ofstdout
#562. - Change default log level from error to warning #562.
- Bumped MSRV to 1.70.
- Breaking: Redesigned task editing process #553.
Add
- Add support for NetBSD.
- Add
--all
and--group
topueue log
. #509 - Add
--all
and--group
topueue enqueue
. #558 - Add
--all
and--group
topueue stash
. #558 - Add
pueue reset --groups [group_names]
to allow resetting individual groups. #482
This also refactors the way resets are done internally, resulting in a cleaner code architecture. - Ability to set the Unix socket permissions through the new
unix_socket_permissions
configuration option. #544 - Add
command
filter topueue status
. #524 #560 - Allow
pueue status
to order tasks byenqueue_at
. #554 - Added Windows service on Windows to allow a true daemon experience. #344 #567
- Add
queued_count
andstashed_count
to callback template variables. This allows users to fire callbacks when whole groups are finished. #578 - Add new subcommand to set or unset environment variables for tasks. #503