I'd like to have the following abilities in the ports infrastructure:
- To group package installs in "transactions" so that when a single "make install" (or portinstall) pulls other ports as dependencies, these are tracked as being pulled by this particular "make install".
- To be able to undo such package transactions, i.e. remove all packages installed by a single "make install" (or portinstall) in a straightforward way.
- To track removals of packages in a way similar to the one just described and (optionally) to undo these removals (read on).
The idea is to support operations like these:
- Install some large group of packages, like KDE or GNOME. Don't like it, want to delete all packages installed during the operation.
- Install a newer version of postgresql, have an OMG moment and remember you need to dump the database with the old version and reaload it with the new version. Revert the install by deleting the new packages and reinstalling the old ones (i.e. undo a removal).
To be able to do this, I propose a new utility, a program, called pkg_trans, that will be used like this:
pkg_trans -b
Begins a transaction. Writes transaction id to stdout.
pkg_trans -a package_name -z trans_id
Records that a package is being installed, as a part of a transaction.
pkg_trans -d package_name -z trans_id
Records that a package is being removed, as a part of a transaction. Optionally, at this point, if pkg_trans_save_deleted_packages="YES" is present in /etc/rc.conf, a binary package backup is created by pkg_create -b to enable undoing the delete. When the transaction is logically over, the following is used:
pkg_trans -e -z trans_id
This ends the transaction, cleans up, whatever is needed. The command
pkg_trans -u -z trans_id
Undos a transaction, while
pkg_trans -l
Shows a list of all recorded transactions, chronologically ordered.
pkg_trans -i -z trans_id
Shows details of a transaction.
I've chosen -z for transaction ID because -t and -x are both used by various pkg_* utilities for other purposes and -z is free in all utilities.
For this to be effective, I think these utilities will have to be modified:
pkg_add - to start a transaction, record added packages, end the transaction
pkg_delete - to start a transaction, record the deleted packages, end the transaction
the make install infrastructure, I believe this involves pkg_create to register the package, to the same effects as pkg_add. There are several problems here I don't know how to solve currently: 1) the transaction ID has to be kept somehow and passed around and b) make install can be exited by Ctrl-C and I still want the packages registered upto the point of interruption to remain recorded in the transaction and that the transaction ends cleanly.
- portupgrade - all of the above.
Progress
I have implemented pkg_trans and modified pkg_* utilities. The whole thing currently works in the general case. See http://people.freebsd.org/~ivoras/big/pkg_install.tgz for a working build tree.
See this post for usage examples: http://lists.freebsd.org/pipermail/freebsd-ports/2008-October/051033.html
Let's call this "alpha" release
Notes
- For this to become really usable, portinstall and the "make install" infrastructure need to be modified. I cannot do those - help is most welcome!