The XBPS alternatives framework
-------------------------------
-------------------------------------------------
Package metadata stored in packages (props.plist)
-------------------------------------------------
The 'nvi' pkg declares an alternative group named 'vi':
...
alternatives
	vi
	
		/usr/bin/ex:/usr/bin/nvi
		/usr/bin/vi:/usr/bin/nvi
		/usr/share/man/man1/ex.1:/usr/share/man/man1/nvi.1
		/usr/share/man/man1/vi.1:/usr/share/man/man1/nvi.1
	
	...
...
The strings need to follow the : convention, delimited by
the ':' character.
--------------------------------------------------------------------
Package metadata stored in metadir (metadir/alternatives-0.48.plist)
--------------------------------------------------------------------
/var/db/xbps/alternatives-0.48.plist (dict):
3 packages can provide the 'vi' alternative group: ex-vi, nvi or vim.
The entry order determines the priority (first entry always wins).
After running `xbps-install -Sy nvi ex-vi vim' the order is the following:
...
	vi
	
		nvi
		ex-vi
		vim
	
	...
...
If the 'nvi' pkg is removed, and there's no alternative set for `vi',
the 'ex-vi' pkg now becomes the default alternative:
...
	vi
	
		ex-vi
		vim
	
	...
...
The user now decides that 'vi' should be provided by the 'vim' pkg,
so that the matching entry is put into the head:
...
	vi
	
		vim
		ex-vi
	
	...
...
When no packages provide an alternative group, the alternative group and its associated symlinks
will be completely removed.
--------------------
xbps-alternatives(1)
--------------------
- Listing all available alternatives and current state:
	$ xbps-alternatives -l
	libGL
	  - libGL (current)
	    - /usr/lib/libGL.so -> /usr/lib/libGL-mesa.so
	    - /usr/lib/libGL.so.1 -> /usr/lib/libGL-mesa.so.1
	    - /usr/lib/xorg/modules/extensions/libglx.so -> /usr/lib/xorg/modules/extensions/libglx-xorg.so
	  - nvidia-libs
	    - /usr/lib/libGL.so -> /usr/lib/libGL-nvidia.so.1
	    - /usr/lib/libGL.so.1 -> /usr/lib/libGL-nvidia.so.1
	    - /usr/lib/xorg/modules/extensions/libglx.so -> /usr/lib/xorg/modules/extensions/libglx-nvidia.so
	  - catalyst-libs
	    - /usr/lib/libGL.so -> /usr/lib/libGL-fglrx.so.1
	    - /usr/lib/libGL.so.1 -> /usr/lib/libGL-fglrx.so.1
	    - /usr/lib/xorg/modules/extensions/libglx.so -> /usr/lib/xorg/modules/extensions/libglx-fglrx.so
	ntpd
	  - openntpd (current)
	    - /etc/sv/ntpd -> /etc/sv/openntpd
	    - /usr/bin/ntpd -> /usr/bin/openntpd
	    - /usr/share/man/man1/ntpd.1 -> /usr/share/man/man1/openntpd.1
	  - ntp
	    - /etc/sv/ntpd -> /etc/sv/isc-ntpd
	    - /usr/bin/ntpd -> /usr/bin/isc-ntpd
	    - /usr/share/man/man1/ntpd.1 -> /usr/share/man/man1/isc-ntpd.1
	  - busybox
	    - /etc/sv/ntpd -> /etc/sv/busybox-ntpd
	    - /usr/bin/ntpd -> /usr/bin/busybox
	sort
	  - coreutils (current)
	    - /usr/bin/sort -> /usr/bin/coreutils-sort
	    - /usr/share/man/man1/sort.1 -> /usr/share/man/man1/coreutils-sort.1
	  - busybox
	    - /usr/bin/sort -> /usr/bin/busybox
	vi
	  - nvi (current)
            - /usr/bin/ex -> /usr/bin/nvi
            - /usr/bin/vi -> /usr/bin/nvi
            - /usr/share/man/man1/ex.1 -> /usr/share/man/man1/nvi.1
            - /usr/share/man/man1/vi.1 -> /usr/share/man/man1/nvi.1
	  - vim
            - /usr/bin/ex -> /usr/bin/vim-ex
            - /usr/bin/vi -> /usr/bin/vim
            - /usr/share/man/man1/ex.1 -> /usr/share/man/man1/vim-ex.1
            - /usr/share/man/man1/vi.1 -> /usr/share/man/man1/vim.1
	...
- Listing available alternative groups of a package:
	$ xbps-alternatives -l busybox
	ntpd
	  - /etc/sv/ntpd -> /etc/sv/busybox-ntpd
	  - /usr/bin/ntpd -> /usr/bin/busybox
	sort
	  - /usr/bin/sort -> /usr/bin/busybox
	...
- Apply all alternative groups specified by the 'nvi' package (declares one group: vi):
	$ xbps-alternatives -s nvi
	Switched 'vi' alternatives group to 'nvi'.
	Creating 'vi' alternatives group symlink: /usr/bin/ex -> /usr/bin/nvi
	Creating 'vi' alternatives group symlink: /usr/bin/vi -> /usr/bin/nvi
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/ex.1 -> /usr/share/man/man1/nvi.1
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/vi.1 -> /usr/share/man/man1/nvi.1
	$
- Creating a specific alternative group of a package containing multiple groups:
	$ xbps-alternatives -s busybox -g ntpd
	Switched 'ntpd' alternatives group to 'busybox'.
	Creating 'ntpd' alternatives group symlink: /etc/sv/ntpd -> /etc/sv/busybox-ntpd
	Creating 'ntpd' alternatives group symlink: /usr/bin/ntpd -> /usr/bin/busybox
	$
---------------
xbps-install(1)
---------------
Installing a package with an alternatives group for the first time:
	$ xbps-install -Syv vim
	Name Action    Version           New version            Download size
	vim  install   -                 1.0_1                  -
	Free space on disk:             49GB
	[*] Downloading binary packages
	[*] Verifying package integrity
	vim-1.0_1: verifying SHA256 hash...
	[*] Running transaction tasks
	vim-1.0_1: unpacking ...
	vim-1.0_1: unpacked file `./usr/bin/vim' (0 bytes)
	vim-1.0_1: unpacked file `./usr/share/man/man1/vim.1' (0 bytes)
	vim-1.0_1: registered 'vi' alternatives group
	Creating 'vi' alternatives group symlink: /usr/bin/vi -> /usr/bin/vim
	Creating 'vi' alternatives group symlink: /usr/bin/ex -> /usr/bin/vim
	Creating 'vi' alternatives group symlink: /usr/bin/view -> /usr/bin/vim
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/ex.1 -> /usr/share/man/man1/vim.1
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/vi.1 -> /usr/share/man/man1/vim.1
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/view.1 -> /usr/share/man/man1/vim.1
	[*] Configuring unpacked packages
	vim-1.0_1: configuring ...
	vim-1.0_1: installed successfully.
	0 downloaded, 1 installed, 0 updated, 1 configured, 0 removed.
	$
Installing a package that provides a 'vi' alternatives group (nvi):
	$ xbps-install -Syv nvi
	Name Action    Version           New version            Download size
	nvi  install   -                 1.0_1                  -
	Free space on disk:             49GB
	[*] Downloading binary packages
	[*] Verifying package integrity
	nvi-1.0_1: verifying SHA256 hash...
	[*] Running transaction tasks
	nvi-1.0_1: unpacking ...
	nvi-1.0_1: unpacked file `./usr/bin/nvi' (0 bytes)
	nvi-1.0_1: unpacked file `./usr/share/man/man1/nvi.1' (0 bytes)
	nvi-1.0_1: registered 'vi' alternatives group
	[*] Configuring unpacked packages
	nvi-1.0_1: configuring ...
	nvi-1.0_1: installed successfully.
	0 downloaded, 1 installed, 0 updated, 1 configured, 0 removed.
	$
Removing a package that was the default provider of the 'vi' alternatives group (vim):
	$ xbps-remove -yv vim
	Name Action    Version           New version            Download size
	vim  remove    1.0_1             -                      -
	Free space on disk:             49GB
	Removing `vim-1.0_1' ...
	Removing 'vi' alternatives group symlink: /usr/bin/vi
	Removing 'vi' alternatives group symlink: /usr/bin/ex
	Removing 'vi' alternatives group symlink: /usr/bin/view
	Removing 'vi' alternatives group symlink: /usr/share/man/man1/ex.1
	Removing 'vi' alternatives group symlink: /usr/share/man/man1/vi.1
	Removing 'vi' alternatives group symlink: /usr/share/man/man1/view.1
	vim-1.0_1: unregistered 'vi' alternatives group
	Switched 'vi' alternatives group to 'nvi'
	Creating 'vi' alternatives group symlink: /usr/bin/vi -> /usr/bin/nvi
	Creating 'vi' alternatives group symlink: /usr/bin/ex -> /usr/bin/nvi
	Creating 'vi' alternatives group symlink: /usr/bin/view -> /usr/bin/nvi
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/ex.1 -> /usr/share/man/man1/nvi.1
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/vi.1 -> /usr/share/man/man1/nvi.1
	Creating 'vi' alternatives group symlink: /usr/share/man/man1/view.1 -> /usr/share/man/man1/nvi.1
	Removed file `/usr/share/man/man1/vim.1'
	Removed file `/usr/bin/vim'
	Removed `vim-1.0_1' successfully.
	0 downloaded, 0 installed, 0 updated, 0 configured, 1 removed.
	$