Visualizing and Exploring Ubuntu Excuses

As many new Ubuntu Developers you may wonder what happens when you upload a new package to the Ubuntu Archive?

You may have encountered a flurry of acronyms and jargon that didn’t make things much clearer:

  • “Upload”
  • “FTBFS”
  • “proposed migration”
  • “release pocket”
  • “Autopkgtest”
  • “Britney”
  • “excuses”

Ubuntu package upload journey

While this is a simplified view, the diagram below represents the basic flow of how package updates make it to the Ubuntu development release.

  1. Packages attempt to be merged from Debian unstable and if they fail to do so, they end up on our merges tracker but if no conflict happens, they will move to the “proposed” pocket.

  2. In the next step, packages go in the proposed pocket, which is also where other standard uploads go. There they attempt to be compiled against all supported architectures. In case of failure, they become FTBFS: Failed To Build From Sources

  3. If packages successfully build from source, they start running autopkgtest. This is a mechanism to test Debian packages using per-package defined DEP-8 tests. The beauty of autopkgtest is the fact that all the dependencies of a changed package are tested against that changed package as installed rather than part of the build process. For example: a glibc upload would likely trigger thousands of tests.

Why Packages Don’t Migrate

The main point of this post is to discuss packages that are going through the migration process from the proposed pocket to the release pocket (proposed migration). These packages could be “stuck in proposed” for many reasons called Excuses, such as :

  • FTBFS: doesn’t build on one or all architectures
  • autopkgtest failure: package fails its own DEP-8 tests
  • dependency autopkgtest failure: one of the package dependencies is failing against the new package
  • depends: the package needs another package to migrate
  • and others that I’m still discovering…

Identifying which packages to fix quickly is important to unblock other contributors and make the new packages available to all Ubuntu users as soon as possible.

Today, that list of excuses can be reviewed in different ways:

  • All Excuses: All the packages stuck in proposed sorted newer to older (web page)
  • Excuses by team: Shows all outstanding packages in proposed by team (web page)
  • Excuses Yaml: That large yaml file contains all the details about why packages are not migrating. that file is several Mb and easily includes hundreds thousands of lines
  • Update Output.txt: that is truly more advanced but useful to some

While these resources contain all the information you probably need to choose a package to fix, it can sometimes require time to either decipher the reason or follow a long dependency chain leading to the package blocking a cluster of packages.

There has to be a better way… :wink:

Visual excuses

I always had a personal interest in data visualization and how it can help display complex problems and in some cases highlight unexpected patterns. So, with this in mind I started to implement a tool to visualize Ubuntu excuses as nodes on a graph and identify dependencies as arrows. The result is called visual-excuses and can be installed as a snap:

🐧 ▶ snap install visual-excuses

Then running visual-excuses opens your web browser and shows all the packages currently stuck in proposed:

🐧 ▶ visual-excuses

Beautiful!

Ok… to the naked eye it may not be easier than a wall of text, but you can zoom in and discover interesting phenomena.

Now, this is getting good. You can see a cluster of dependencies with rust packages with a few packages blocking most rust packages: rust-rustls-pemfile blocking about eight packages, for example.

Another nice touch are the details available with tooltips and colors.

Here are a few examples:

The cogl package is not building on amd64 and pp64el architectures and is subscribed by the Desktop Team (desktop-packages):

graph-tool is failing its own autopkgtest on arm64 and s390x. Note that you can access the package, buildlog, and details straight from the links in the tooltips:

unicorn is blocked with an autopkgtest regression from rainbows. Fixing them would likely unblock two packages:

But wait, there’s more …

Many of us are quite fond of the command line, so since I had all that data structure available, I thought I would make a CLI for it…

Ubuntu Excuses

In the same manner, you can install ubuntu-excuses with:

🐧 ▶ snap install `ubuntu-excuses`

For starters, let’s see all the command arguments (which are also available with visual-excuses by the way):

🐧 ▶ ubuntu-excuses --help
usage: ubuntu-excuses [-h] [--inspect INSPECT] [--name NAME] [--component COMPONENT] [--team TEAM] [--ftbfs] [--min-age DAYS] [--max-age DAYS] [--limit LIMIT] [--reverse] [--json]
                      [--cache-dir DIR]

Ubuntu Excuses (Proposed Migration) Viewer

options:
  -h, --help            show this help message and exit
  --inspect INSPECT     Get details about a specific package
  --name NAME           Regex to filter package names (case-insensitive)
  --component COMPONENT
                        Archive component (main, restricted, universe, multivere)
  --team TEAM           Show only packages subscribed by this Ubuntu team
  --ftbfs               Show only FTBFS packages
  --min-age DAYS        Only include packages at least this many days old
  --max-age DAYS        Only include packages no older than this many days
  --limit LIMIT         Limit the number of results shown
  --reverse             Show excuses from older to more recent
  --json                Output in JSON format
  --cache-dir DIR       The directory under which to cache the excuses data (default: /home/mclemenceau/snap/ubuntu-excuses/50/.cache/visual-excuses)

As you can see, there’s quite a few options. For example, let’s say you are a Ubuntu contributor who wants to focus on rust packages in universe that have been stuck for more than two weeks and are not building from source (FTBFS):

🐧 ▶ ubuntu-excuses --component universe --name rust --min-age 14 --ftbfs
Downloading https://people.canonical.com/~ubuntu-archive/proposed-migration//update_excuses.yaml.xz
Excuses Cache up to date!
╒════════╤════════════════════════════╤═════════════╤════════════════╤═════════╤══════════════╕
│   Days │ Package                    │ Component   │ New Version    │ FTBFS   │ Excuse Bug   │
╞════════╪════════════════════════════╪═════════════╪════════════════╪═════════╪══════════════╡
│     20 │ rust-hurl                  │ universe    │ 6.0.0-1        │ ✅      │              │
│     20 │ rust-hurl-core             │ universe    │ 6.0.0-1        │ ✅      │              │
│     30 │ arm-trusted-firmware       │ universe    │ 2.12.1+dfsg-1  │ ✅      │              │
│     31 │ rust-spytrap-adb           │ universe    │ 0.3.4-1        │ ✅      │              │
│     38 │ rust-forensic-adb          │ universe    │ 0.8.0-1        │ ✅      │              │
│     40 │ rust-debian-repro-status   │ universe    │ 0.2.1-1ubuntu1 │ ✅      │              │
│     92 │ rust-symphonia-format-riff │ universe    │ 0.5.4-1        │ ✅      │              │
│    123 │ rust-symphonia-format-caf  │ universe    │ 0.5.4-1        │ ✅      │              │
│    128 │ rust-termwiz               │ universe    │ 0.22.0-2       │ ✅      │              │
│    138 │ rust-cargo-test-support    │ universe    │ 0.3.0-1        │ ✅      │              │
╘════════╧════════════════════════════╧═════════════╧════════════════╧═════════╧══════════════╛

In this other example, you list all the packaged blocked in main:

🐧 ▶ ubuntu-excuses --component main
Downloading https://people.canonical.com/~ubuntu-archive/proposed-migration//update_excuses.yaml.xz
Excuses Cache up to date!
╒════════╤════════════════════════╤═════════════╤══════════════════════╤═════════╤══════════════╕
│   Days │ Package                │ Component   │ New Version          │ FTBFS   │ Excuse Bug   │
╞════════╪════════════════════════╪═════════════╪══════════════════════╪═════════╪══════════════╡
│     11 │ ubuntu-advantage-tools │ main        │ 35.1ubuntu0          │         │              │
│     14 │ snapd                  │ main        │ 2.68.3+ubuntu25.04.3 │         │ LP: #2106009 │
│     18 │ ruby-sinatra           │ main        │ 4.1.1-5              │ ✅      │ LP: #2097028 │
│     36 │ python-psutil          │ main        │ 7.0.0-1              │ ✅      │ LP: #2106466 │
│     60 │ bpftrace               │ main        │ 0.21.2-2ubuntu4      │ ✅      │ LP: #2099792 │
│     89 │ libunwind              │ main        │ 1.8.1-0.1            │ ✅      │ LP: #2095325 │
╘════════╧════════════════════════╧═════════════╧══════════════════════╧═════════╧══════════════╛

Enjoy the quiet while it lasts, with Questing Quokka opening soon, we’ll likely see a spike in activity and many more packages in the queue

Notice the easy to catch Excuse bug in LaunchPad that probably explains a lot about why this package is blocked and who is working on it.

What’s next?

I hope this will help lower the bar of entry to new Ubuntu developers to identify what packages to work on. I also hope this could help tackle the biggest cluster of dependencies faster.

I will continue to make some adjustments and expand the filtering options (list only issues with block-bugs, for example), but I would love to get more suggestions. And if you find bugs, please, feel free to report them!

http://github.com/mclemenceau/visual-excuses

http://github.com/mclemenceau/visual-excuses/issues

Thanks

20 Likes

WOW !!! This is really awesome and well written, thank you so much.

4 Likes

So it appears that the server infrastructure producing the excuses report started transitioning to Questing Quokka right after this post :sweat_smile:
So you are likely to get an Error until Questing Quokka is open for business which is expected by Monday if all goes well.
Sorry for the inconvenience

3 Likes