I’m proud to announce 1.1 alpha releases of both the QApt package management framework as well as the Muon Package Manager suite, based on the former. Muon is a powerful package manager built with usability in mind, and LibQApt is the C++ wrapper around the APT library, as well as an APT worker implementation.
On the LibQApt front, much work has gone in to optimization work. As a result, client applications such as Muon 1.1 now start up around 33% faster than before. Optimizations in other areas of LibQApt mean that applications using 1.1 will be able to sort packages faster. In addition to optimizations, several new features are present in LibQApt 1.1.
The highlight of theQApt 1.1 release is the new QApt::Config class, which provides a KConfig-like API for APT system settings, including write support via PolicyKit. Aside from providing a convenient Qt-style API for reading, QApt::Config provides a simple writing API where there really is nothing suitable inside the APT library itself.
The focus for Muon 1.1 was adding further functionality to further round out the package management experience. The highlights of this release are the new Muon Updater and Muon Notifier, which fill a previously-unfilled gap in the Muon package management experience. The Muon Notifier is a simple, lightweight notifier daemon built around the KDE Daemon framework. Muon Notifier gives the user a chance to deal with updates as they become available by launching the Muon Updater, an update-centric GUI with an interfaced focused on update management.
It should be noted that the user interface is not final, and will undergo further changes to increase the focus on update management, removing unnecessary cruft in that context.
Additionally, Muon now has a configuration interface to give you control over APT system settings.
Here are detailed change logs for QApt and Muon 1.0.60:
- Added a new QApt::Config class. It features a KConfig-like API to the APT system configuration, as well as provides config writing support without dumping the entire APT configuration settings to a file like APT does. It currently supports reading and writing int, bool and string settings. QApt::Backend has a QApt::Config instance that can be accessed by its config() method after initialization.
- Added pretty includes in the form of <LibQApt/Include> (e.g. <LibQApt/Backend>)
- Added a packageDownloadProgress() signal for per-package download progress reporting. This enables client applications to give more detailed information about currently-downloading packages, including parallel package downloads.
- Added a markPackagesForAutoRemove() method that acts like apt-get autoremove, marking packages for removal that APT deems obsolete.
- Added a new setUndoRedoCacheSize() function to QApt::Backend. This allows applications to customize the undo/redo stack size, allowing them to increase it if RAM usage is less of an issue, or decrease/eliminate the cache if RAM is tight.
- Added Add a saveInstalledPackagesList() function to QApt::Backend that exports a list of all installed packages to the given path. This list can be ready by Backend::readSelections() or by the Synaptic Package Manager.
- LibQApt now compiles with QT_NO_CAST_TO_ASCII and QT_NO_CAST_FROM_ASCII.
- APT system initialization in Backend::init() is no longer blocking, so that you can paint your UI sooner to give a perception of speed.
- General optimizations have been made throughout to significantly speed up Backend::init() (Around 33%)
- Speed up Package::isSupported() by making a cache of package index files to prevent doing a binary search for the index file from the sources list each time isSupported() is called.
- Speed Package::isInstalled() up by checking for installation without calling state().
- Added an installedCount() function that is faster than using the packageCount() overload function that takes a package state flag.
- Add much more efficient toInstallCount() and toRemoveCount() functions to QApt::Backend. These both just grab int’s already cached in memory by APT, meaning that we don’t have to iterate through every Package and get a full state reading to determine whether it is being installed/removed.
- Add a more efficient latin1Section() function to QApt::Package. Since QLatin1String returns an empty string when it encounters null char pointers, we can use latin1Section() in section() to have equivalent, simpler code that still retains safety.
- Add a more efficient latin1Name() function to QApt::Package. This won’t provide much speedup for strings going to a user interface, as they will be converted to QString anyways, but this function can be used to implement a much faster alphabetical package sort.
- Improve the speed of Backend::loadSelections() by parsing selection files with QByteArray, as well as some other miscellaneous optimizations.
- Change the Backend’s origin/human readable name mapping to use a QHash, giving some minor optimizations to the originLabel() and origin() functions.
- Added a NotFound error for the QApt Batch Installer to use when it encounters a non-existant package. Before it was not catching this error at all and went straight to completion as if nothing was wrong.
- QAptBatch: Don’t say we were successful if there were errors. That looks a bit silly, especially when we have error dialogs to contradict ourselves.
- Fixed a bug where installing a package locally with dpkg did not make the xapianIndexNeedsUpdate() return true
- Fixed a bug where the worker would never respond to DBus requests when heavy load was present on the system. (BKO: #249929)
- Fixed a bug where calling originLabel() with an origin that did not have a human-readable label would insert the origin into the origin map, wasting memory.
- Fixed a blank line being snuck in to the end of lists returned by the Package::installedFilesList() function
- Compile with -fvisibility=hidden by default so that libqapt doesn’t expose symbols from libraries it links against, making life easier for packagers everywhere.
- Added documentation for the detail QVariantMaps of ErrorCodes, WarningCodes and WorkerQuestions is now provided, whereas they were completely undocumented in previous releases.
- Introducing the “muon-updater” program, an update-centric GUI
- The download view has been revamped, now supporting per-item progress, as well as displaying the size for each item
- Add a new “Residual Config” filter to the filters pane. This filter shows packages that still have purgeable config files laying around.
- Add a new “Installed (auto-removable)” filter to the filters pane. This filter shows packages that were automatically installed that no longer have any installed dependents. (Basically, what apt-get autoremove would show)
- The Technical Details tab now displays the package’s origin
- Added a progress bar to Muon’s statusbar to show Xapian indexing update progress.
- Added an update notifier
- Improved startup time
- The contents of the “Installed Files” package tab are now sorted alphabetically (BKO: #253751)
- Implemented sorting the package list by status and by requested changes
- Canonical-supported packages now have a K/Ubuntu emblem on the icon in the package view
- A “Save Installed Packages List” feature has been added, allowing you to make a list of all installed packages that can be read by Muon or Synaptic on another computer.
- Added an option to configure whether or not a package’s recommended packages are considered as dependencies.
- Added an option to configure how often APT auto-cleans cached package files.
- Enable/disable the “update” and “apply” buttons based on network availability
- Spacing improvements in the details tabs.
- Disable the reinstall button for non-reinstallable items, such as non-downloadable and/or locally-installed packages. (BKO: #254449)
Exciting stuff is happening! The pre-release cycle will continue over the next three months, with a beta, second beta and release candidate spaced one month apart from each other. (String, feature and UI freeze will commence after the second beta in January)
Until then, prerelease packages are available for both the development version of Kubuntu 11.04 via standard means, and for Kubuntu 10.10 via the QApt PPA. Please test so that the 1.1 release can be great!
Unfortunately, QApt 1.1 cannot be provided to users of Kubuntu 10.04 as its version of APT is too old. QApt 1.0.x will continue to be supported throughout the 1.1 prerelease cycle, however.