02/02/2020: This week in KISS (#9)
Alternatives!
Index
Alternatives system
The package manager now includes an "alternatives system". This feature allows you to change the provider of a specific file or set of files.
For example, a user can now swap from busybox to the GNU coreutils by running a simple command.
This works in an entirely dynamic way and required zero changes to the package format or the repository files themselves! [1]
When a conflict is detected between another package during installation, the conflicting files become "choices" in the alternatives system.
Running kiss a
or kiss alternatives
will list all available choices that can be made.
-> kiss a
-> Alternatives:
ncurses /usr/bin/clear
ncurses /usr/bin/reset
The above command tells me that I have two available choices from the ncurses
package. To find out which package owns the current "choice", the kiss-owns
utility from kiss-utils
can be used (a simple grep
in your installed db also works).
-> kiss a ncurses /usr/bin/clear
-> Swapping '/usr/bin/clear' from 'busybox' to 'ncurses'
My system now uses /usr/bin/clear
from the ncurses
package. Running kiss a
again will now show the following output.
-> kiss a
-> Alternatives:
busybox /usr/bin/clear
ncurses /usr/bin/reset
Here's a more complex example showing the swap between a large bulk of choices.
-> kiss a
-> Alternatives:
busybox /usr/bin/clear
coreutils /usr/bin/[
coreutils /usr/bin/base64
coreutils /usr/bin/basename
coreutils /usr/bin/cat
coreutils /usr/bin/chgrp
coreutils /usr/bin/chmod
# Lots of 'coreutils *' lines here.
coreutils /usr/bin/whoami
coreutils /usr/bin/yes
ncurses /usr/bin/reset
The output of kiss a
can be directly used as input to kiss a
. Each line is a valid set of arguments! Here's how you'd swap to GNU coreutils in a single command.
# The package manager will read each line from stdin.
kiss a | grep ^coreutils | kiss a -
# Running 'kiss a' will show the inverse of the above listing,
# a long output of 'busybox *'.
My system is now using the GNU coreutils!
This system works for any files across the entire filesystem and as it is entirely dynamic (requiring no changes to the repositories or the package format [1]) it is backwards compatible.
The feature allows the user to swap their /bin/sh
, coreutils
and really anything they desire. Very complex setups are now easily possible when this is paired with the repository system.
The package manager, init scripts and package files are written in POSIX shell allowing any POSIX compatible shell or coreutils to be used in place of the defaults (one exception is made for sed -i
which is too useful to let go of [2]).
With this change, the user now has the choice between, init, device manager, coreutils, shell and anything they desire!
[1]: Some minor changes were made to where some packages install their files. coreutils was installed to /usr/local/bin due to the absence of this alternatives feature. This was still not a change to the format of the package system itself though!
[2]: Utilities like tar
which have no standard command-line interface may be incompatible when swapped out. There's nothing that can really be done about this.
Official Repositories
- Dylan Araps:
72be609
falkon: Added optional open-in-mpv extension15f1d9b
sowm: bump to 1.28a25531
mpv: bump to 0.32.0f8658f1
pkgconf: Swap to http source for now. Closes #139154f4a3
qt5-*: bump to 5.14.16549391
falkon: Remove unneeded sed calls6043ae3
falkon: fix version0e47e11
sqlite: bump to 3.31.1f961652
dhcpcd: bump to 8.1.637177ef
openresolv: bump to 3.10.085b261c
libva-utils: Fix depends209bea7
mesa: bump to 19.3.3f1aa593
kiss: bump to 1.0.0cf5a975
kiss-utils: bump to 1.0.0796550e
kiss: bump to 1.0.16149f07
kiss-utils: bump to 1.0.1a42e25d
ncurses: Allow conflictse949836
baseinit: bump to 0.38004986
kiss: bump to 1.0.2db53c47
kiss-utils: bump to 1.0.22b52c35
kiss: bump to 1.0.3eee548b
kiss-utils: bump to 1.0.3587f8ca
kiss: bump to 1.0.4e30562c
kiss-utils: bump to 1.0.4c28cb6f
kiss: bump to 1.0.5876afd4
kiss-utils: bump to 1.0.5fa42f5e
kiss: bump to 1.0.6ff42d39
kiss-utils: bump to 1.0.6bcf681b
kiss-utils: Fix build with suckless install8a6f5ce
xinit: remove sed -id3ae5d1
st: Remove sed -ib314878
mesa: remove sed -idf36110
libxcb: Remove sed -i2217317
intel-media-driver: Remove sed -id8efedb
repo: Revert sed changes3dcf2e3
mtdev: bump to 1.1.633d6106
kiss: bump to 1.1.1877a99e
kiss-utils: bump to 1.1.1a8262d4
kiss: bump to 1.1.2a07695a
kiss-utils: bump to 1.1.26c693fd
kiss: bump to 1.1.3b177fc8
kiss-utils: bump to 1.1.3e2f5025
kiss: bump to 1.1.4db27e9e
kiss-utils: bump to 1.1.404571c5
kiss: bump to 1.1.6f8b28be
kiss-utils: bump to 1.1.6806c863
opendoas: Move to extraaeaa1b3
docs: update2dd7b91
kiss: bump to 1.1.70e275d5
kiss-utils: bump to 1.1.75593f35
rust [testing]: Added rust 1.41.00f3103f
sudo: bump to 1.8.31f6e43e1
cbindgen [testing]: bump to 0.13.024a5463
rust: Use xz6549c1e
cbindgen: Bump to 0.13.0ebbb23b
rust: bump to 1.41.01d4b4a8
util-linux: bump to 2.35.1b3db27b
xkeyboard-config: bump to 2.29b93e8ac
binutils: bump to 2.34
Community
- Adam Schaefers:
f735f0e
New Package: sinit 1.1 (#200)96a061e
sinit: revert to 1.0 (#270)c6029b2
sbase: use official git sources (#271)88278aa
ubase: use official sources (#272)358a6b1
nawk: update build for alternatives (#288)57f66e4
patch: update build for alternatives (#286)6df5604
gnugrep: update build for alternatives (#285)cf9d490
findutils: update build for alternatives (#283)66487d0
diffutils: update build for alternatives (#282)9b4cc92
dash: update build for alternatives (#281)5cb9a66
gawk: update build for alternatives (#280)cb3b96f
coreutils: remove 'g' prefix from build (#279)a02560b
gtar: update build for alternatives (#287)766c1cc
new package: psproc-ng (#289)71ab4de
fix name: proccps-ng (#291)7ab9583
procps-ng: bump to latest (#293)
- Anirudh:
f107694
aerc: Track latest git instead (#266)
- Cem Keylan:
- Dylan Araps:
f008149
imagemagick: bump to 7.0.9-182f9a3a8
imagemagick: bump to 7.0.9-1985b1197
go: bump to 1.13.7185b79e
imagemagick: bump to 7.0.9-205b41b93
spotifyd: drop package96f8dba
ubase: Drop su8af78ef
sbase: Drop tarc32880f
sbase: Use unlinkabc34fb
ubase: Use unlink383d6d9
sbase: Remove sed42bfd0b
opendoas: Move to extraf1d59d0
mc: bump to 4.8.24f710b64
psproc-ng: Drop packagef14992e
imagemagick: bump to 7.0.9-21fec9e16
pciutils: new package at 3.6.2. Closes #2963c335d8
nettle: bump to latest commit to fix gnutls build issues.5919df8
gnutls: bump to 3.6.1294b8c8c
pciutils: bump to 3.6.4
- Jonathan Dahan:
6ae6436
osh: bump to 0.7.0 (#269)
- Will Eccles:
- dzove855:
a55704b
* Add xtrlock build (#268)