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.

The Muon Updater

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.

General settings, pending HIG-compliance layout tweaks

Muon Notifier settings

Here are detailed change logs for QApt and Muon 1.0.60:

QApt 1.0.60

Features:

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 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.

Optimizations

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.

Bugfixes:

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.

Other

Added documentation for the detail QVariantMaps of ErrorCodes, WarningCodes and WorkerQuestions is now provided, whereas they were completely undocumented in previous releases.

Muon 1.0.60

Features:

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

Bugfixes:

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.

Time to do another bugfix release of the Muon package manager and the library it is built upon, LibQApt. Muon is a powerful package manager for Debian-based systems, with a focus on having a sane UI. After these bugfix releases, there will likely be no further releases until QApt and Muon 1.1 are released. If something major arises, a bugfix release would of course be made, though at this point I think we would have discovered such a bug already. 😉

Sources for QApt and Muon are available here and here, respectively. Packages are already available for Kubuntu 10.10 in the regular PPA. I’ll make packages for 10.04 if there is demand. 🙂

Anyways, aside from more translations, here’s what’s new in the package management world:

QApt 1.0.4

Bugfixes:

Respect preference files in the /etc/apt/preferences.d/ dir, and not just the /etc/apt/preferences file itself

Catch and report initialization errors in places we were missing them

Report that package state has changed when loading selection files

Muon 1.0.3

1.1 News

I thought I might do a first alpha of QApt and Muon 1.1 tonight. But in 4 minutes it will technically be morning, and I need to go to bed. I will try to make the releases within the week, though. I should note that I will be unable to make 1.1 packages for Ubuntu 10.04, as LibQApt 1.1 will require APT 0.8.0 or higher, and 10.04 has 0.7.25. Just a heads-up.

In the meanwhile, you can check out what’s new, (I have a few more neat things implemented since then to blog about when I release. :)) and stay tuned for further blog posts.