Changelog

The purpose of this document is to list all of the notable changes to this project. The format was inspired by Keep a Changelog. This project adheres to semantic versioning.

Release 7.3 (2021-09-15)

Significant changes:

  • Updated the releases bundled in the releases module to include the following:
    • Ubuntu 20.10 (Groovy Gorilla)
    • Ubuntu 21.04 (Hirsute Hippo)
    • Ubuntu 21.10 (Impish Indri)
  • Relaxed the beautifulsoup4 requirement to facilitate Python 2 compatibility (release 4.9.3 was the last to support Python 2 whereas our requirements insisted on >= 4.4.1).

Miscellaenous changes:

Release 7.2 (2020-04-18)

Add support for Elementary OS (suggested in issue #10).

Because Elementary OS is based on Ubuntu the new backend is nothing more than a thin wrapper for the Ubuntu backend. Its most significant content is a data structure with known Elementary OS releases and how they map to Ubuntu.

Release 7.1 (2020-04-17)

After Ubuntu 14.04 went EOL it became clear that when a release goes EOL and when it is archived (moved from the package mirrors to the old-releases environment) can differ by a year…

This release of apt-mirror-updater acknowledges this distinction in the code and properly handles the situation where a release has already gone EOL but has not yet been archived.

This was also reported in issue #9 by a colleague and friend of mine.

Release 7.0 (2020-04-16)

This is a maintenance release that (primarily) updates Python compatibility.

Backwards incompatible changes:

  • Python 3.7 and 3.8 are now officially supported.
  • Python 2.6 and 3.4 are no longer supported.
  • Added python_requires to setup.py to aid pip in version selection given these compatibility changes.

Significant changes:

Miscellaenous changes:

  • Spent some time stabilizing the test suite on Travis CI (tests were passing for me locally but not on Travis CI because the mirror selection differed). As a result the test suite got a bit slower, but it’s not too bad.
  • Move caching decorator to humanfriendly.
  • Fixed deprecation warnings emitted by recent humanfriendly releases and bumped requirements I authored that went through similar changes.
  • Made multiprocessing usage compatible with coverage collection. Note that I don’t expect this to increase coverage, I just wanted to get rid of the warnings 😇 (because warnings about harmless things are just as distracting as more pertinent warnings).
  • Default to Python 3 for local development (required by Sphinx among other things).
  • Fixed existing Sphinx reference warnings in the documentation and changed the sphinx-build invocation to promote warnings to errors (to aid me in the discipline of not introducing broken references from now on).

Release 6.1 (2018-10-19)

  • Bug fix for Ubuntu keyring selection that prevented ubuntu-archive-removed-keys.gpg from being used.
  • Bug fix for coerce_release() when given a release number.
  • Moved pathnames of Debian and Ubuntu keyring files to constants.
  • Added logging to enable debugging of keyring selection process.
  • Added proper tests for keyring selection and release coercion.

Release 6.0 (2018-10-14)

Enable the creation of Ubuntu <= 12.04 chroots on Ubuntu >= 17.04 hosts by working around (what I am convinced is) a bug in debootstrap which picks the wrong keyring when setting up chroots of old releases. For more information refer to issue #8.

I’ve bumped the major version number for this release because the highly specific apt_mirror_updater.eol module changed into the much more generic apt_mirror_updater.releases module. Also the release_label property was removed.

Release 5.2 (2018-10-08)

Use mirrors.ubuntu.com/mirrors.txt without placing our full trust in it like older versions of apt-mirror-updater did 😇.

Feedback in issue #6 suggested that mirrors.ubuntu.com/mirrors.txt is working properly (again) and should be preferred over scraping Launchpad. However I prefer for apt-mirror-updater to be a reliable “do what I mean” program and mirrors.ubuntu.com/mirrors.txt has proven to be unreliable in the past (see the discussion in #6). As a compromise I’ve changed the Ubuntu mirror discovery as follows:

  1. Discover Ubuntu mirrors on Launchpad.
  2. Try to discover mirrors using mirrors.ubuntu.com/mirrors.txt and iff successful, narrow down the list produced in step 1 based on the URLs reported in step 2.
  3. Rank the discovered / narrowed down mirrors and pick the best one.

The reason why I’ve decided to add this additional complexity is because it has bothered me in the past that Ubuntu mirror discovery was slow and this does help a lot. Also, why not use a service provided by Ubuntu to speed things up?

Unrelated to the use of mirrors.ubuntu.com/mirrors.txt I’ve also bumped the executor requirement (twice) in order to pull in upstream improvements discussed in executor issue #10 and executor issue #15.

Release 5.1 (2018-06-22)

Work on release 5.1 started with the intention of publishing a 5.0.2 bug fix release for the EOL detection of Debian LTS releases reported in #5, however unrelated changes were required to stabilize the test suite. This explains how 5.0.2 became 5.1 😇.

When I started working on resolving the issue reported in #5 it had been quite a while since the previous release (233 days) and so some technical debt had accumulated in the project, causing the test suite to break. Most significantly, Travis CI switched their workers from Ubuntu 12.04 to 14.04.

Here’s a detailed overview of changes:

  • Bug fix for EOL detection of Debian LTS releases (reported in #5).
  • Bug fix for trivial string matching issue in test suite (caused by a naively written test).
  • Bug fix for recursive repr() calls potentially causing infinite recursion, depending on logging level (see e.g. build 395421319).
  • Updated bundled EOL dates based on distro-info-data available in Ubuntu 18.04.
  • Added this changelog to the documentation, including a link in the readme.
  • Make sure the test_gather_eol_dates test method runs on Travis CI (by installing the distro-info-data package). This exposed a Python 3 incompatibility (in build 395410569) that has since been resolved.
  • Include documentation in source distributions (MANIFEST.in).
  • Silence flake8 complaining about bogus D402 issues.
  • Add license=’MIT’ key to setup.py script.
  • Bumped copyright to 2018.

Release 5.0.1 (2017-11-01)

Bug fix release for invalid enumeration value (oops).

Release 5.0 (2017-11-01)

Reliable end of life (EOL) detection.

Recently I ran into the issue that the logic to check whether a release is EOL (that works by checking if the security mirror serves a Release.gpg file for the release) failed on me. More specifically the following URL existed at the time of writing (2017-11-01) even though Ubuntu 12.04 went EOL back in April:

http://security.ubuntu.com/ubuntu/dists/precise/Release.gpg

At the same time issue #1 and pull request #2 were also indications that the EOL detection was fragile and error prone. This potential fragility had bugged me ever since publishing apt-mirror-updater and this week I finally finished a more robust and deterministic EOL detection scheme.

This release includes pull requests #2 and #4, fixing issues #1 and #3. Here’s a detailed overview of changes:

  • Addition: Allow optional arguments to apt-get update (#3, #4).
    • I simplified and improved the feature requested in issue #3 and implemented in pull request #4 by switching from an optional list argument to ‘star-args’ and applying the same calling convention to smart_update() as well.
    • This is backwards incompatible with the implementation in pull request #4 (which I merged into the dev branch but never published to PyPI) and it’s also technically backwards incompatible in the sense that keyword arguments could previously be given to smart_update() as positional arguments. This explains why I’m bumping the major version number.
  • Bug fix for incorrect marking of EOL when HTTP connections fail (#2).
  • Refactoring: Apply timeout handling to HTTP response bodies.
  • Refactoring: Distinguish 404 from other HTTP errors:
    • This change enhances validate_mirror() by making a distinction between a confirmed HTTP 404 response versus other error conditions which may be of a more transient nature.
    • The goal of this change is to preserve the semantics requested in issue #1 and implemented in pull request #2 without needing the additional HTTP request performed by can_connect_to_mirror().
    • Because validate_mirror() previously returned a boolean but now returns an enumeration member this change is technically backwards incompatible, then again validate_mirror() isn’t specifically intended for callers because it concerns internal logic of apt-mirror-updater. I’m nevertheless bumping the major version number.
  • Refactoring: Improve HTTP request exception handling:

Release 4.0 (2017-06-14)

Robust validation of available mirrors (backwards incompatible).

Release 3.1 (2017-06-13)

Made mirror comparison more robust.

Release 3.0 (2017-06-13)

Added Debian archive support (with old releases):

  • Addition: Added Debian archive support (old releases).
  • Improvement: Don’t bother validating archive / old-releases mirror.
  • Refactoring: Moved URLs to backend specific modules.

Release 2.1 (2017-06-12)

Restored Python 3 compatibility, improved robustness:

  • Improvement: Make the is_available and is_updating properties of the CandidateMirror class more robust.
  • Bug fix: I suck at Unicode in Python (most people do :-p).
  • Cleanup: Remove unused import from test suite.

Release 2.0 (2017-06-11)

Generation of sources.list files and chroot creation.

Detailed overview of changes:

  • Addition: Added a simple debootstrap wrapper.
  • Addition: Programmatic /etc/apt/sources.list generation
  • Bug fix for check_suite_available().
  • Bug fix: Never apply Ubuntu’s old release handling to Debian.
  • Bug fix: Never remove /var/lib/apt/lists/lock file.
  • Improvement: Enable stable mirror selection
  • Improvement: Make it possible to override distributor ID and codename
  • Improvement: Render interactive spinner during mirror ranking.
  • Refactoring: Generalize AptMirrorUpdater initializer (backwards incompatible!)
  • Refactoring: Generalize backend module loading
  • Refactoring: Modularize /etc/apt/sources.list writing.

Release 1.0 (2017-06-08)

Improved Ubuntu mirror discovery, added an automated test suite, and more.

The bump to version 1.0 isn’t so much intended to communicate that this is now mature software, it’s just that I made several backwards incompatible changes in order to improve the modularity of the code base, make it easier to develop automated tests, maintain platform support, etc :-).

A more detailed overview of (significant) changes:

  • Improved Ubuntu mirror discovery (by scraping Launchpad instead).
  • Extracted mirror discovery to separate (backend specific) modules.
  • Extracted HTTP handling to a separate module.
  • Enable Control-C to interrupt concurrent connection tests.
  • Expose limit in Python API and command line interface and make limit optional by passing 0.
  • Bug fix for Python 3 incompatibility: Stop using sys.maxint :-).

Release 0.3.1 (2016-06-29)

Avoid ‘nested’ smart updates (the old code worked fine but gave confusing output and performed more work than necessary, which bothered me :-).

Release 0.3 (2016-06-29)

Make smart update understand EOL suites.

Release 0.2 (2016-06-29)

Bug fix: Replace security.ubuntu.com as well.

Release 0.1.2 (2016-06-29)

Bug fix: Explicitly terminate multiprocessing pool.

Release 0.1.1 (2016-03-10)

Initial release (added MANIFEST.in).

Release 0.1 (2016-03-10)

Initial commit.