tl;dr
Rip out the high-level YQPackageSelector widget from YaST and make it a standalone Qt program without any YaST dependencies.
See section "Result" at the bottom for the current status after the hack week.
Current Status
See the development status issue at the GitHub repo.
tl;dr: It's usable now with all the key features.
It does real package installation / removal / update with reasonable user feedback.
The Past and the Present
We used to have and still have a powerful software selection with the YaST sw_single module (and the YaST patterns counterpart): You can select software down to the package level, you can easily select one of many available package versions, you can select entire patterns - or just view them and pick individual packages from patterns.
You can search packages based on name, description, "requires" or "provides" level, and many more things.
The Future
YaST is on its way out, to be replaced by the new Agama installer and Cockpit for system administration. Those tools can do many things, but fine-grained package selection is not among them. And there are also no other Open Source tools available for that purpose that even come close to the YaST package selection.
Many aspects of YaST have become obsolete over the years; many subsystems now come with a good default configuration, or they can configure themselves automatically. Just think about sound or X11 configuration; when did you last need to touch them?
For others, the desktops bring their own tools (e.g. printers), or there are FOSS configuration tools (NetworkManager, BlueMan). Most YaST modules are no longer needed, and for many others there is a replacement in tools like Cockpit.
But no longer having a powerful fine-grained package selection like in YaST sw_single will hurt. Big time. At least until there is an adequate replacement, many users will want to keep it.
The Idea
YaST sw_single always revolved around a powerful high-level widget on the abstract UI level. Libyui has low-level widgets like YPushButton, YCheckBox, YInputField, more advanced ones like YTable, YTree; and some few very high-level ones like YPackageSelector and YPatternSelector that do the whole package selection thing alone, working just on the libzypp level and changing the status of packages or patterns there.
For the YaST Qt UI, the YQPackageSelector / YQPatternSelector widgets work purely on the Qt and libzypp level; no other YaST infrastructure involved, in particular no Ruby (or formerly YCP) interpreter, no libyui-level widgets, no bindings between Qt / C++ and Ruby / YaST-core, nothing. So it's not too hard to rip all that part out of YaST and create a standalone program from it.
For the NCurses UI, the NCPackageSelector / NCPatternSelector create a lot of libyui widgets (inheriting YWidget / NCWidget) and use a lot of libyui calls to glue them together; and all that of course still needs a lot of YaST / libyui / libyui-ncurses infrastructure. So NCurses is out of scope here.
Preparatory Work: Initializing the Package Subsystem
To see if this is feasible at all, the existing UI examples needed some fixing to check what is needed on that level. That was the make-or-break decision: Would it be realistically possible to set the needed environment in libzypp up (without being stranded in the middle of that task alone at the end of the hack week)?
Yes, it is: That part is already working:
https://github.com/yast/yast-ycp-ui-bindings/pull/71
Go there for a screenshot
That's already halfway there.
The complete Ruby code of this example is here. The real thing will be pure C++ without any YaST dependencies.
The Plan
DONE: Clone libyui where libyui (high-level), libyui-qt, libyui-qt-pkg live
DONE: Slash and burn: Get rid of the unneeded parts one by one; libyui-ncurses, libyui-ncurses-pkg, libyui-rest-api, libyui-rest-api-qt, libyui-rest-api-ncurses, libyui-qt-graph.
DONE: Reduce the CMake build environment to what is actually needed.
DONE: One by one move the parts that libyui-qt-pkg needs from the outside to that directory
DONE: Slash and burn some more: Get rid of all the stuff that YQPackageSelector / YQPkg* don't need
DONE: Replace the libyui / YEvent-based event handling with standard Qt event handling so the program reacts properly to "Cancel", "Accept", WM_Close "[x]"
DONE: Come up with one or more classes to initialize libzypp; basically those Pkg.xy() calls that are now new in the UI examples (in their C++ counterparts, of course)
DONE: Come up with one or more classes to handle the "commit" phase where packages are actually installed / updated / deleted
DONE: Write the most basic callbacks for the commit phase to show at least some progress
DONE: Add basic session handling for window size and position etc. (QSettings)
DONE: Add a read-only mode so the program can be used without root privileges (without committing the package transactions, of course)
MOSTLY DONE: Write the remaining ton of callbacks for the commit phase to show progress, errors and questions
DONE: Make a more user-friendly UI for the commit phase, not just that single progress bar that we have right now; possibly allowing the user to show more details or just the progress bar
DONE: Use a more modern development method for that commit phase based on Qt Designer and .ui files (see QDirStat for examples)
Future Plans (After this Hack Week)
- Also make the main screen prettier, based on Qt Designer and .ui files; add some margins and some eye candy
Out of Scope
Repos management (adding, removing, modifying repos). This will still be left to zypper commands for the time being.
An NCurses version. The NCurses UI has been the bane of YaST development since two and a half decades - since 1999. It was always the limiting factor, it was alwas the reason why we could never use advanced Qt features, it was the reason why YaST always looked so fugly; so 1980s, so mainframe-like.
NCurses
Those who claim they absolutely need the NCurses UI, and they cannot use a Qt application, are welcome to use the command line: There is always zypper
. We will no longer let a 1970s text terminal mode like NCurses be the limiting factor for a good UI.
It was mostly NCurses that kept YaST so ugly that it was finally time to kill it in favor of a web UI like Agama. In this new web UI world, nobody has argued yet that an NCurses UI is an urgent requirement; all of a sudden, everybody can also live just fine with only a browser-based UI.
Development
Repo
https://github.com/shundhammer/yqpkg
Status
See issue #1
Result
Status at the end of the hack week: (outdated now, the key features are working now)
- It's a standalone binary.
- It doesn't need any YaST infrastructure, and no YaST libs; just Qt 5 and libzypp.
- It can load the RPM DB (the installed packages).
- It can load the active repos.
Caveat: No repo refresh, no GPG key import - use
zypper ref
for that. - You can use all of the usual views:
- Search
- Patterns
- Repos
- Package Classification
- Languages
- Installation Summary
- Patches (hit F2 to get this one)
- You can change the status of packages, patterns etc. as usual
- It uses the dependency resolver as usual including reporting dependency problems
- You can start it as an unprivileged user, then it's in read-only mode: You can look, you can search, you can experiment with "what...if" secenarios, but you cannot apply the changes (the "Accept" button is disabled)
- There is rudimentary instant feedback during the startup phase so it doesn't feel slow
This project is part of:
Hack Week 24
Activity
Comments
-
6 months ago by shundhammer | Reply
Update Tue 2024-11-19 18:00:
Slashing and burning is mostly done; there is now a standalone binary that does not depend on (or link against) any YaST lib anymore. The stripped binary is just 838 k.
It doesn't have any content yet, and it's quite ugly, but it shows the principle.
-
6 months ago by shundhammer | Reply
Update Wed 2024-11-20 20:00:
We have a standalone yqpkg application, and it can show the packages and patterns from the installed system.
We now also have a read-only mode for viewing and checking "what if" scenarios as a non-privileged user. You can see that in the window title, and the "Accept" button is disabled; you can't install / delete anything.
Window size and position are saved, so it looks much better now. It also shows "YQPkg-0.3.0" in the top right corner to tell the difference in a screenshot between "yast2 sw_single" and yqpkg.
-
6 months ago by shundhammer | Reply
Update 2024-11-22 22:00:
It can now load the content of the enabled repos.
-
6 months ago by shundhammer | Reply
Update 2024-11-23 18:30:
Rudimentary progress reporting of the initialization phase with some splash screens while the repos are loaded or the package selector is populated with content.
No repo refresh, no importing of new GPG keys etc.; the repos need to be prepared in advance. A manual
sudo zypper ref
before starting the program is recommended. -
5 months ago by lkocman | Reply
YaST is mentioned as super helpful in most of the reviews done by users user switching specifically from Fedora and Debian. The software installation part is where we differ the most as far as SLES/Leap 16 and typical day-to-day user scenarios go.
This project is all about future-proofing a powerful GUI tool for a software installation, and potentially keeping single-click installation from a browser a thing.
I highly appreciate Stefan's work on this project to ensure we remain user-friendly in key areas, even after the YaST stack reduction. This is happening on SLFO, and therefore Leap 16 https://code.opensuse.org/leap/features/issue/173
Many thanks, Stefan!
-
5 months ago by Pharaoh_Atem | Reply
In case you're not aware, there is a standalone application that uses libyui called dnfdragora that does this too. The only thing missing from dnfdragora is a setting to scan for patterns packages and populate group listings accordingly, which should be possible with a small bit of code to locate all packages labeled as Metapackages and with pattern names and populate them accordingly.
-
5 months ago by shundhammer | Reply
I know that one; it's different. Just do a direct comparison.
And since I wrote libyui, libyui-qt and libyui-qt-pkg, I also know its limitations because of that abstract UI layer that it depends on.
That was the reason why we decided to write that specialized YQPackageSelector widget for YaST back 20+ years ago: So we would finally not be limited by the least common denominator between a late 1960s VT100 text terminal and a modern GUI.
Before YQPackageSelector, there was no end of bitching about the single package selection. With it, that bitching came to an end.
Been there. Done that. Got the T-shirt; actually, a whole stack of them. ;-)
-
Similar Projects
This project is one of its kind!