Why does `do-release-upgrade` skip a version?

Your original guess was right. 15.04 is supported through 2016-02-04, so do-release-upgrade is trying to upgrade you to the next supported release compared to the one you have.

Here's the description of normal upgrade prompting mode from /etc/update-manager/release-upgrades:

Check to see if a new release is available. If more than one new release is found, the release upgrader will attempt to upgrade to the release that immediately succeeds the currently-running release.

So if I'm on 14.04 it should be trying to take me to 14.10, but right now do-release-upgrade is trying to take the OP (and me) to 15.04 instead.

So reading through /usr/lib/python3/dist-packages/DistUpgrade/MetaRelease.py it looks like we skip unsupported releases when figuring out what release to upgrade to (unless you're using the developer flag):

    # then see what we can upgrade to
    upgradable_to = ""
    for dist in dists:
        if dist.date > current_dist.date:
            # Only offer to upgrade to an unsupported release if running
            # with useDevelopmentRelease, this way one can upgrade from an
            # LTS release to the next supported non-LTS release e.g. from
            # 14.04 to 15.04.
            if not dist.supported and not self.useDevelopmentRelease:
                continue
            upgradable_to = dist
            self._debug("new dist: %s" % upgradable_to)
            break

I should add that I do not recommend trying to get around this with do-release-upgrade -d. When I tried it with prompt=normal, I got 404s, since 14.10 is EoL. I also think in my delirium I must have tried do-release-upgrade -p, which tried to take me straight to 16.04. By the time I realized it was taking me to xenial everything was broken and I had to restore from factory. In the end I decided I'll wait until 16.04 is released and do a fresh install.


do-release-upgrade doesn't know anything about "jumping versions". It simply downloads the upgrade plan from the Ubuntu repository maintainers. This is specified in do-release-upgrade README:

2) The upgrade tool must be able to download updated information how to perform the upgrade (e.g. additional steps like upgrading certain libs first)

Also, in the specification about Automatic Upgrades:

A meta-release file with information about the available distributions is stored on a central server and it is If-Modified-Since tested on each run of update-manager. If a new version is found, update-manager shows that visually.

This is what allows do-upgrade-release and any other tool to upgrade seamlessly.