• Bug#1077764: Ruling request on os-release specification implementation

    From Luca Boccassi@21:1/5 to All on Thu Aug 1 18:00:01 2024
    Package: tech-ctte

    Dear CTTE,

    This is an escalation requesting a ruling on the matter of several
    base-files bugs around its buggy implementation of the os-release specification, the most recent example being #1021663 and other
    instances that I could find with a cursory look being #1008735 and
    #675731.

    The TL;DR is a request to override the base-files maintainer, and
    enable moving os-release into a new, independent and separate source
    package, so that these bugs may finally be fixed, and Debian's os-
    release may finally be made compliant with the specification.

    Numerous attempts were independently made by many different people to
    try and convince the base-files maintainer to fix this issue, the
    oldest one linked above being 12 years ago, and they have all been
    rejected, as recently as today. The only course of action left is
    therefore asking for a CTTE intervention in the matter, as all attempts
    at mediation and negotiation over the years have failed.

    The os-release specification, of which I am an upstream author and
    maintainer, defines a distro-agnostic text-based metadata format to
    allow identifying Linux distributions images, root directories, trees
    and whatnot, without requiring distro-specific quirks, executables,
    binaries, scripts or workarounds. It has been adopted pretty much
    universally on Linux, including in Debian since 2012. It supersedes
    deprecated tools and specifications such as lsb_release and distro-
    specific files such as debian_release.

    Spec:

    https://www.freedesktop.org/software/systemd/man/devel/os-release.html

    With my upstream spec maintainer hat on, I am asserting that the base-
    files implementation of the os-release specification is buggy. This has
    always been the case, since the very beginning, as it can be seen in
    the oldest of the bugs linked above. The crux of the issue is that the
    way base-files implements the specification does not allow to
    distinguish testing vs unstable images, and worse than that, it
    recently started providing wrong and misleading information,
    incorrectly identifying sid as trixie (via VERSION_CODENAME=trixie).

    This has resulted in numerous downstream users, tools, scripts and code
    having to employ fragile Debian-specific hacks, such as trying to grep /etc/apt/sources.list in an attempt to catch "unstable/sid" or
    "testing" keywords, which of course is can break spectacularly, for
    example if apt is not configure in an image (which is normal in a read-
    only image-based system), or if both unstable and testing repositories
    are present, with unstable pinned via apt-preferences to 1. Other
    distributions do not have this issue, it is only a problem that Debian
    forces its users to deal with, causing grief and pain.

    The base-files maintainer provides broadly two categories of
    justifications for refusing to fix these issues. The first one is
    dismissing any proposed solution as "ugly", without really
    substantiating what it means - that is for example the case for
    multiple proposals in #1021663. The second one is pushing forward a philosophical explanation according to which testing and unstable are
    not actually different images, but they are one and the same (two sides
    of the same coin is the expression used). While that might be true in a philosophical sense, this is a practical matter, and it concerns only
    the os-release specification and its implementation. In such context,
    testing and unstable are different and independent images, built from
    different and independent archives of packages. For example, at any
    point in time you can do:

    deboostrap testing /tmp/a
    deboostrap unstable /tmp/b

    and if your shell history is lost, you have no reliable, stable, distro-agnostic way to identify what exactly /tmp/a and /tmp/b are.
    These, created at the same time, contain different packages and refer
    to different archives, so while from a philosophical point of view one
    might make one argument or the other, from the very specific, concrete
    and real issue of implementing the os-release specification, they are
    different releases and it must be possible to identify them as such,
    and wrong information should not be conveyed to users.

    There is also another common misunderstanding regarding what
    constitutes a rolling release, sometimes used to justify avoiding to
    fix these bugs. Again here such a concept from a philosophical point of
    view might be bent into meaning many different things, but from the
    point of view of the os-release specification, a rolling release is a
    release that will never have a +1 or a -1 version. From the os-release
    point of view, the fact that a distribution is updated often and gets a
    lot of new packages, that might break ABI/API, or that is not security supported, does not mean it is a rolling distribution. So unstable/sid
    is a rolling distribution, because there will never be a new version,
    it will always be sid. Trixie however is _not_ a rolling distribution,
    because there is a trixie-1 (bookworm) and there will be a trixie+1
    (forky). The fact that trixie gets a lot of changes in this 2 years
    development period is orthogonal and independent, and does not qualify
    it as a rolling distribution, in the context of the os-release
    specification. In fact, there is a proposal to add an independent os-
    release field that qualifies a version as "stable", "lts" or in
    "development", that would be suited to mark testing as such. So it
    would be entirely appropriate to set VERSION_ID=13 in trixie's os-
    release right now. It is not appropriate to set VERSION_ID=13 in sid's os-release, now or ever.

    These issues are not just theoretical, and do not concern mere personal preferences or cleanliness or code quality or ugliness. They cause very
    real, very actual and very painful grief for Debian users, as evidenced
    by the multiple independent bugs with multiple independent reporters
    chiming in, and the multiple ugly hacks that have to be implemented as Debian-specific workarounds (the latest instance of which can be found at https://sources.debian.org/src/systemd/256.4-2/debian/tests/upstream/#L15 ).

    The base-files maintainer repeatedly, over numerous years, refused to
    fix these incompatibilities with the specification, citing personal
    preferences and interpretations, and the latest suggestion as per
    #1021663 is to override the lsb_releae maintainer and ship again buggy
    and deprecated lsb_release python scripts to try again to solve the
    problem in a Debian-specific way, parsing apt's sources.list. The point
    of a cross-distro specification is to perform its function reliably so
    that users do not have to employ distro-specific workarounds, so we are currently doing our users a disservice by shipping a buggy
    implementation, and require them to use deprecated and buggy scripts as workarounds. It would in fact be much better to simply not ship an implementation of os-release at all, rather than implement it wrongly
    based on reinterpretations.

    A concrete proposal that I can put forward is to move os-release away
    from base-files, into a new source+binary package, that can be managed independently, and can be updated to respect the specification it is
    supposed to follow. base-files ships code in maintainer scripts so
    requires changes and updates, and using a separate package allows to do
    only one upload per cycle to set the new metadata. base-files can then
    depend on this new binary package, which will ship only /usr/lib/os-
    release, its /etc/os-release symlink and no maintainer script. This
    package should be team-maintained on Salsa (as opposed as base-files
    that is individually maintained with no VCS).

    The os-release installed in sid's images would then be something along
    those lines:

    PRETTY_NAME="Debian GNU/Linux sid"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=sid
    ID=debian

    And trixie's would be something along those lines:

    PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
    NAME="Debian GNU/Linux"
    VERSION_ID="13"
    VERSION="13 (trixie)"
    VERSION_CODENAME=trixie
    RELEASE_TYPE=pre-release
    ID=debian

    With RELEASE_TYPE= changing to 'lts' immediately before release day.
    There are several different ways of having different content in sid vs
    testing, and some have been proposed in the latest bug linked above, I
    would be happy to discuss those details too if required.

    I volunteer to do the work to create and team-maintain the new package,
    and provide a patch to do the move from base-files. If requested, I am
    happy to do such work in advance so that you can judge based on
    something concrete.

    Thank you for your consideration.

    --
    Kind regards,
    Luca Boccassi

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEErCSqx93EIPGOymuRKGv37813JB4FAmarr6wACgkQKGv37813 JB7QBRAAtN5O4yre4iKGFSnoSrSwUvboCN95jTlhpg9rxxBVj6a6zWjcF77ure0U BZmN0TEB9QC9X2VBwuKSVvnhN+8PYa0EmpEFOeJtzaIhU/GuKIE8Fq/TIVRrlv9B /bgRbf3/A+0rWZrfGunJu+xEYRHWgR+wPxllwxQ8D8CAa49JvCYdxvSzKMuWGuwP xAML4npaHpRrOFIZ1wh+uQZAVkhRejyJqz3zkjAmVOCpQXUA2oH7awIx/OM0s47Y 10muE4kgtrZo7QGLUHewW8V1/4ntxzjr9iupCrDIn7rYPAmPBKqkIEK9ds3p+WFU YMxeZSvW49PnlS2CGSxq8zaiGu4cvv1TIjH43aqKp5u2bRVAlss/cLMxb8TXevOn TKOfq7EcAZtrBhTdeuhMHICCUQ2fc8/yUEFy2Mkye7ipJedXoGGQtYjwp/zMfXMq QW9RHNUEvF0/P8VRQqpGCn6caEMdm0Dd1LvTtRuQUbGTX5JGGzJ+IaipH2oLkEEU wC0miV/u8hh9i7jumPxM1obzLJZfroL2vk3G92LRqJskCw8vdQIFS/JI1NdcBvMV +gPfwDPXmgFrZj3Q7U/HyDoHI/TlMvsOCJWzR3A3q7AfWA0Iqap2xo9jfNOfiAKd GX6A0ylhKlVquC1h0UYvR/7pEdfmLmZAmJncVSsfbANlrzdfBaA=
    =aqac
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Christoph Berg on Thu Aug 1 18:40:01 2024
    On Thu, 1 Aug 2024 at 17:32, Christoph Berg <myon@debian.org> wrote:

    Re: Luca Boccassi
    The TL;DR is a request to override the base-files maintainer, and
    enable moving os-release into a new, independent and separate source package, so that these bugs may finally be fixed, and Debian's os-
    release may finally be made compliant with the specification.

    If we are fixing that, we should also fix /etc/debian_version in the
    same way. I've always been wondering why we don't put better content
    into these files.

    (Though I'm not sure the ruling should include the "move to new source package" part. It could also be fixed inside base-files.)

    I left that out intentionally, as that is by definition a
    Debian-specific file and the main goal here is fixing the
    distro-agnostic metadata issues, and also changing that might affect
    backward compatibility of existing consumers (not an issue in
    os-release, as the relevant metadata is either absent or the wrong one
    is very new). However, I personally do not have a strong opinion one
    way or the other, and I am happy to do extra work if required.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Christoph Berg@21:1/5 to All on Thu Aug 1 18:40:01 2024
    Re: Luca Boccassi
    The TL;DR is a request to override the base-files maintainer, and
    enable moving os-release into a new, independent and separate source
    package, so that these bugs may finally be fixed, and Debian's os-
    release may finally be made compliant with the specification.

    If we are fixing that, we should also fix /etc/debian_version in the
    same way. I've always been wondering why we don't put better content
    into these files.

    (Though I'm not sure the ruling should include the "move to new source
    package" part. It could also be fixed inside base-files.)

    Christoph

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Russ Allbery@21:1/5 to Luca Boccassi on Thu Aug 1 19:40:01 2024
    Luca Boccassi <bluca@debian.org> writes:

    There are several different ways of having different content in sid vs testing, and some have been proposed in the latest bug linked above, I
    would be happy to discuss those details too if required.

    Generally the technical committee works best if it can consider a concrete technical proposal for a fix alongside the problem statement. I'm not a member, but as an interested bystander, I would like to see the details of precisely how you would implement your desired functionality. That could
    be several options if you'd like the committee to choose between them.

    I'd also like to see an elaboration of how you propose to distinguish sid
    from testing. This would be an ill-defined concept on the systems that I personally install testing packages on, and the specific criteria that you would use is not obvious to me from the bug discussion.

    I did review the discussion #1021663 in the hope that I would find a
    detailed technical proposal there, but your messages to that bug seemed to focus on criticisms of the current behavior mixed with insults. I wasn't
    able to find a proposal, but it's entirely possible I missed it.

    --
    Russ Allbery (rra@debian.org) <https://www.eyrie.org/~eagle/>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Russ Allbery on Thu Aug 1 20:10:01 2024
    On Thu, 1 Aug 2024 at 18:33, Russ Allbery <rra@debian.org> wrote:

    Luca Boccassi <bluca@debian.org> writes:

    There are several different ways of having different content in sid vs testing, and some have been proposed in the latest bug linked above, I would be happy to discuss those details too if required.

    Generally the technical committee works best if it can consider a concrete technical proposal for a fix alongside the problem statement. I'm not a member, but as an interested bystander, I would like to see the details of precisely how you would implement your desired functionality. That could
    be several options if you'd like the committee to choose between them.

    I was about to say that the proposal is in the linked bug, but it has disappeared - it could be due to the bugs getting unlinked. Anyway, my
    variant is here:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=675731#54

    There was also a slight variant by Gioele, that again I fail to find
    now and it might be because of the bugs being rearranged, where testing-proposed-updates is used to upload testing-specific content.

    The TL;DR: ensure that the version of the 'os-release' package with
    the content for unstable stays in unstable and never migrates, and the
    version of the 'os-release' package with the content for testing goes
    to testing either via a quick migration or via
    testing-proposed-updates.

    And the exact details on _how_ to manage it are all up for discussion
    of course, if there are better ideas I'm happy to implement them. The
    reason for escalating to the CTTE is not the implementation details
    however, it's a core conflict about the basic concept of os-release
    itself.

    I'd also like to see an elaboration of how you propose to distinguish sid from testing. This would be an ill-defined concept on the systems that I personally install testing packages on, and the specific criteria that you would use is not obvious to me from the bug discussion.

    If you 'debootstrap unstable /tmp/a' and then 'cat
    /tmp/a/usr/lib/os-release' you will see:

    PRETTY_NAME="Debian GNU/Linux sid"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=sid
    ID=debian

    If you instead 'debootstrap testing /tmp/b' and then 'cat /tmt/b/lusr/lib/os-release' you will see:

    PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
    NAME="Debian GNU/Linux"
    VERSION_ID="13"
    VERSION="13 (trixie)"
    VERSION_CODENAME=trixie
    RELEASE_TYPE=pre-release
    ID=debian

    That's it. Of course if what you are saying is that you mix and match
    a selection of packages from testing and unstable, well that's a
    frankendebian - you can do that on any release (I have some testing
    packages pulled in my debian stable laptop right now). So the
    identification will be as it is right now, it will depend on the
    version of the package providing the os-release file, which like any
    other package can be manually overridden, upgraded, downgraded if one
    really wishes to do so. I could echo "ID=windows 3.1" into my local /etc/os-release and nothing would stop me or fix it until the next
    stable release. But this doesn't really change the purpose or meaning
    of the os-release specification and its implementation and purpose.

    I did review the discussion #1021663 in the hope that I would find a
    detailed technical proposal there, but your messages to that bug seemed to focus on criticisms of the current behavior mixed with insults. I wasn't able to find a proposal, but it's entirely possible I missed it.

    There are for sure a lot of criticisms of the bugs in base-files, but
    there are no insults.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Russ Allbery@21:1/5 to Luca Boccassi on Thu Aug 1 21:10:02 2024
    Luca Boccassi <bluca@debian.org> writes:

    I was about to say that the proposal is in the linked bug, but it has disappeared - it could be due to the bugs getting unlinked. Anyway, my variant is here:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=675731#54

    Ah, thank you. I think that answers my questions.

    To summarize briefly to ensure that I understand, your proposal is to
    separate only this content into a second package, make base-files depend
    on it, and then maintain different versions of that package in unstable
    and testing.

    There are two technical aspects of this proposal that worry me.

    The first is adding a dependency to base-files. I know people have put a
    whole lot of work into pure dependency-based bootstrapping for Debian, but historically base-files has been very special and posed lots of
    interesting complications that are separately handled in lots of different tools.

    I do agree with Santiago's desire to maintain base-files as a "normal"
    Debian package that gets tested in unstable and propagates to testing, so
    if we go down this route, splitting out this data does seem better to me
    than maintaining multiple lines of development for base-files itself.

    The second thing that I'm not fond of is giving testing the version number
    13 when we plan on using 13 as the version number for the trixie release.
    I fear that if we do that, someone (probably a third-party package
    provider) will add some workaround or behavior change for a package based
    on that version number for a problem that only ever existed in testing and
    that was not in the actual 13 release. I would instead expect testing to
    use some version number that is between stable and the version number that
    will be assigned to the next release, to reflect that it is likely to
    change substantially before Debian makes an actual release 13.

    (If I were designing this from scratch, I'd give serious thought to using
    even version numbers for releases and odd version numbers for testing,
    similar to how Perl releases are versioned for very similar reasons. But that's probably too big of a change for the level of benefit.)

    Presumably the RELEASE_TYPE setting of pre-release is supposed to help
    with that, but (a) that variable doesn't seem to be documented in os-release(5); (b) the sorts of packagers that I'm worried about are quite likely to not make subtle distinctions like that, so the version is still
    there as a potential foot-gun for people who aren't paying close
    attention; and (c) I would argue that calling testing a "pre-release" is
    not very accurate, since that applies that the contents are very similar
    to the eventual release and are in a relatively late stage of testing.

    There's a lot of merit to Santiago's decision to not give unstable a
    version number that I think still applies to testing even when it's
    considered separately. However, you do have a good point that this makes
    life difficult for third-party packages that want to enforce a minimum
    version number because there's no way to then tell that, although this is
    a testing release with no real version number, it does come after version
    12. (Obviously this is not a great way to handle dependencies on a Debian release, and we probably wouldn't allow it in a regular Debian package,
    but third-party packages often do things like this.) I'm not sure which
    side of that trade-off I'd fall on, although I do think not having a
    version number is more semantically correct given the current language documented in os-release(5). If RELEASE_TYPE were added to the spec with
    an additional type of "development-snapshot" or something else more
    accurate than "pre-release", that might change my mind, although my point
    (b) above still applies.

    There was also a slight variant by Gioele, that again I fail to find now
    and it might be because of the bugs being rearranged, where testing-proposed-updates is used to upload testing-specific content.

    That seems like a better approach than the one proposed in the message
    above, although I think it requires some manual intervention by the
    release team. This doesn't seem like a serious problem given that uploads
    are presumably quite infrequent and the package is trivial.

    So the identification will be as it is right now, it will depend on the version of the package providing the os-release file, which like any
    other package can be manually overridden, upgraded, downgraded if one
    really wishes to do so.

    Thanks, that answers the question that I was asking. You're keeping the
    same semantics as we currently have with base-files, and you're proposing maintaining two different lines of development for the package containing
    this file, one for unstable and one for testing.

    There are for sure a lot of criticisms of the bugs in base-files, but
    there are no insults.

    Debian would be a far more enjoyable project to work on if you would recalibrate your understanding of what is an insult. Right now, it
    requires substantial effort to read any thread that you have replied to
    because I have to brace myself for judgmental, emotionally loaded, and hostile-sounding language that gets in the way of understanding the root disagreement and having a cordial and constructive collaboration.

    --
    Russ Allbery (rra@debian.org) <https://www.eyrie.org/~eagle/>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Russ Allbery on Thu Aug 1 22:10:01 2024
    On Thu, 1 Aug 2024 at 20:06, Russ Allbery <rra@debian.org> wrote:

    Luca Boccassi <bluca@debian.org> writes:

    I was about to say that the proposal is in the linked bug, but it has disappeared - it could be due to the bugs getting unlinked. Anyway, my variant is here:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=675731#54

    Ah, thank you. I think that answers my questions.

    To summarize briefly to ensure that I understand, your proposal is to separate only this content into a second package, make base-files depend
    on it, and then maintain different versions of that package in unstable
    and testing.

    There are two technical aspects of this proposal that worry me.

    The first is adding a dependency to base-files. I know people have put a whole lot of work into pure dependency-based bootstrapping for Debian, but historically base-files has been very special and posed lots of
    interesting complications that are separately handled in lots of different tools.

    It could be a dependency of something else, or it could be marked as
    essential itself, given the content is a 5 lines text file and a
    symlink it shouldn't be too hard to figure out an acceptable way to
    ensure it ships everywhere. It doesn't have to be related to
    base-files at all, it was just the first thing that came to mind.

    I do agree with Santiago's desire to maintain base-files as a "normal"
    Debian package that gets tested in unstable and propagates to testing, so
    if we go down this route, splitting out this data does seem better to me
    than maintaining multiple lines of development for base-files itself.

    The second thing that I'm not fond of is giving testing the version number
    13 when we plan on using 13 as the version number for the trixie release.
    I fear that if we do that, someone (probably a third-party package
    provider) will add some workaround or behavior change for a package based
    on that version number for a problem that only ever existed in testing and that was not in the actual 13 release. I would instead expect testing to
    use some version number that is between stable and the version number that will be assigned to the next release, to reflect that it is likely to
    change substantially before Debian makes an actual release 13.

    The version number is the least important part of the changes - so for
    example, it could still be omitted until the actual release like it is
    now. The really important part is adding different and separate
    codenames, so that a testing image can be reliably and univocally
    distinguished from a sid image, and VERSION_CODENAME is enough for
    that, the version number is cherry on top. I still think that trixie
    is 13 and 13 is trixie, so there's no point in delaying, as that piece
    of metadata is not going to change, and I think it would be better if "debootstrap trixie" always gave the same identification metadata
    (barring the release type as per below perhaps) but it's not a crucial
    matter and it's fine either way, in the end.
    But this example seems a bit too tortured to me. First, if you add a
    workaround like that, you would normally do it based on the package
    version you are working around, or at least that's how I usually do it
    and see it done. And secondly, that same strawman can be applied to
    stable, as we do point releases and security uploads. One could see a
    bug in bookworm and decide to check for VERSION_ID=12 to work around
    it, even if that bug is later solved in a point release or security
    update. It is still correct to mark stable as VERSION=12 (without the
    point release).

    (If I were designing this from scratch, I'd give serious thought to using even version numbers for releases and odd version numbers for testing, similar to how Perl releases are versioned for very similar reasons. But that's probably too big of a change for the level of benefit.)

    Presumably the RELEASE_TYPE setting of pre-release is supposed to help
    with that, but (a) that variable doesn't seem to be documented in os-release(5);

    What do you mean?!! It's right there! https://www.freedesktop.org/software/systemd/man/devel/os-release.html#RELEASE_TYPE=

    ...ok, ok, it's there now because I just merged it and regenerated the docs :-P

    (b) the sorts of packagers that I'm worried about are quite
    likely to not make subtle distinctions like that, so the version is still there as a potential foot-gun for people who aren't paying close
    attention; and (c) I would argue that calling testing a "pre-release" is
    not very accurate, since that applies that the contents are very similar
    to the eventual release and are in a relatively late stage of testing.

    As above, if someone wants to abuse the version to pin things, it can
    already happen in all stable point releases too. In fact with kernel
    upstream LTS releases being part of those, the amount of changes in a
    Debian stable point release is actually quite large, and it does
    happen often that those kernel LTS releases either break egregiously
    or fix egregious breakages.

    There's a lot of merit to Santiago's decision to not give unstable a
    version number that I think still applies to testing even when it's considered separately. However, you do have a good point that this makes life difficult for third-party packages that want to enforce a minimum version number because there's no way to then tell that, although this is
    a testing release with no real version number, it does come after version
    12. (Obviously this is not a great way to handle dependencies on a Debian release, and we probably wouldn't allow it in a regular Debian package,
    but third-party packages often do things like this.) I'm not sure which
    side of that trade-off I'd fall on, although I do think not having a
    version number is more semantically correct given the current language documented in os-release(5). If RELEASE_TYPE were added to the spec with
    an additional type of "development-snapshot" or something else more
    accurate than "pre-release", that might change my mind, although my point
    (b) above still applies.

    There ya go: https://github.com/systemd/systemd/pull/33904

    I omitted 'snapshot' as that sort of implies a fixed content, which
    for package-based distro seems inaccurate.

    There was also a slight variant by Gioele, that again I fail to find now and it might be because of the bugs being rearranged, where testing-proposed-updates is used to upload testing-specific content.

    That seems like a better approach than the one proposed in the message
    above, although I think it requires some manual intervention by the
    release team. This doesn't seem like a serious problem given that uploads are presumably quite infrequent and the package is trivial.

    Yes if that does end up happening, it would probably require flagging
    it to stop autoremoval via a hint or something like that, but it
    naively feels like an eminently solvable problem, and very much
    secondary to the core issue, which is, "should the os-release spec be
    adhered to and unstable vs testing made identifiable"

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Helmut Grohne@21:1/5 to Luca Boccassi on Fri Aug 2 00:00:01 2024
    Hi Luca,

    On Thu, Aug 01, 2024 at 04:54:20PM +0100, Luca Boccassi wrote:
    This is an escalation requesting a ruling on the matter of several
    base-files bugs around its buggy implementation of the os-release specification, the most recent example being #1021663 and other
    instances that I could find with a cursory look being #1008735 and
    #675731.

    I observe that Santiago has replied to each of them with patience and
    that he has presented relatable reasons for his choices.

    As you detail later, it seems that the corner stone of your complaint is
    that an unstable installation should have VERSION_CODENAME=sid rather
    than VERSION_CODENAME=trixie. Do you agree with this characterization?

    The TL;DR is a request to override the base-files maintainer, and
    enable moving os-release into a new, independent and separate source
    package, so that these bugs may finally be fixed, and Debian's os-
    release may finally be made compliant with the specification.

    On a process level, the CTTE can only decide among available options. In
    this context available roughly equates the existence of a patch (or
    source package). Reading multiple bugs, I found disagreement on this
    approach, but no code that could be characterized as a reviewable
    solution.

    Another plausible way to interpret your mail is that you really ask the
    CTTE to override the base-files maintainer in claiming ownership of /etc/os-release in the base-files package request releasing the file to
    another package. Given that said file has become part of the essential interface, releasing it is subtle and warrants a more detailed look at
    how the take-over is supposed to happen. To me that process is too
    sketchy to consider at this time.

    Numerous attempts were independently made by many different people to
    try and convince the base-files maintainer to fix this issue, the
    oldest one linked above being 12 years ago, and they have all been
    rejected, as recently as today. The only course of action left is
    therefore asking for a CTTE intervention in the matter, as all attempts
    at mediation and negotiation over the years have failed.

    Evidently, there are multiple conflicting requirements that various
    parties would like to see implemented. The base-files maintainer has
    made a compromise and argued in favour of his position. Said compromise encompasses an interpretation of the os-release specification that does
    not follow it to the letter.

    The os-release specification, of which I am an upstream author and maintainer, defines a distro-agnostic text-based metadata format to
    allow identifying Linux distributions images, root directories, trees
    and whatnot, without requiring distro-specific quirks, executables,
    binaries, scripts or workarounds. It has been adopted pretty much
    universally on Linux, including in Debian since 2012. It supersedes deprecated tools and specifications such as lsb_release and distro-
    specific files such as debian_release.

    Spec:

    https://www.freedesktop.org/software/systemd/man/devel/os-release.html

    With my upstream spec maintainer hat on, I am asserting that the base-
    files implementation of the os-release specification is buggy. This has always been the case, since the very beginning, as it can be seen in
    the oldest of the bugs linked above. The crux of the issue is that the
    way base-files implements the specification does not allow to
    distinguish testing vs unstable images, and worse than that, it
    recently started providing wrong and misleading information,
    incorrectly identifying sid as trixie (via VERSION_CODENAME=trixie).

    Please allow me to raise the question of what is the benefit of
    differentiating sid and trixie in /etc/os-release. I am inclined to
    agree that VERSION_CODENAME would be technically wrong in unstable, but
    we have a history of sometimes bending rules. For instance libc6 being Multi-Arch: same technically is a lie as multiple architectures share
    the same dynamic loader path. A strict interpretation would require us
    to remove Multi-Arch: same, but that would make much of Multi-Arch
    useless. Likewise, linux-libc-dev is currently declared Multi-Arch:
    foreign, which also is a technical lie. We also tolerate violations of
    Debian policy in exceptional circumstances. Given the arguments
    presented by the base-files maintainer, I kindly request more specific
    details on what use case is broken by being unable to differentiate
    testing and unstable.

    Conversely, I am unsure how to distinguish testing and unstable myself.
    Say I operate an unstable system and eventually decide that my ride is
    too bumpy and I prefer running testing, I may edit my sources.list and
    after a month or so my system will have reasonably converged to testing.
    At what point would my /etc/os-release change?

    Russ raised the question of how to represent a testing system that pulls
    some packages from unstable.

    This has resulted in numerous downstream users, tools, scripts and code having to employ fragile Debian-specific hacks, such as trying to grep /etc/apt/sources.list in an attempt to catch "unstable/sid" or
    "testing" keywords, which of course is can break spectacularly, for
    example if apt is not configure in an image (which is normal in a read-
    only image-based system), or if both unstable and testing repositories
    are present, with unstable pinned via apt-preferences to 1. Other distributions do not have this issue, it is only a problem that Debian
    forces its users to deal with, causing grief and pain.

    Given the issues you experienced, would you be kind enough to reference
    some of them here?

    The base-files maintainer provides broadly two categories of
    justifications for refusing to fix these issues. The first one is
    dismissing any proposed solution as "ugly", without really
    substantiating what it means - that is for example the case for
    multiple proposals in #1021663. The second one is pushing forward a

    As far as I grasped from reading the bugs there are roughly two solution categories. One continues to install /etc/os-release as a conffile and
    uses the t-p-u mechanism to update it in trixie. The other category
    turns it into a configuration file constructing it from some maintainer
    script. I can relate to characterizing both as ugly.

    With my CTTE member hat lifted, I may also participate in design
    discussions and would like to propose a third alternative (although it
    might have been mentioned in the parts that I skimmed too quickly and
    hope that you can point to the earlier discussion in that case).

    Consider adding a new Debian binary package containing /etc/os-release
    with contents suitable for unstable. This package would use the
    dpkg-divert mechanism to avoid a conflict with base-files which would
    continue to install /etc/os-release with contents suitable for testing
    (even in unstable). We would mark this new package "Essential: yes",
    but have no other package depend on it. We would also file a permanent
    rc-bug to prevent it from migrating to testing. As a result, the set of essential packages as discovered by bootstrapping tools would differ
    between testing and unstable and the /etc/os-release would be diverted
    for unstable only. A significant downside of this approach is that all
    existing unstable systems would never install this package (and thus
    continue to be seen as testing installations) and all systems that were bootstrapped as unstable would be keep this package even if they were to
    be downgraded to testing at a later time (unless the administrator
    actively removes the new package).

    philosophical explanation according to which testing and unstable are
    not actually different images, but they are one and the same (two sides
    of the same coin is the expression used). While that might be true in a philosophical sense, this is a practical matter, and it concerns only
    the os-release specification and its implementation. In such context,
    testing and unstable are different and independent images, built from different and independent archives of packages. For example, at any
    point in time you can do:

    deboostrap testing /tmp/a
    deboostrap unstable /tmp/b

    and if your shell history is lost, you have no reliable, stable, distro-agnostic way to identify what exactly /tmp/a and /tmp/b are.
    These, created at the same time, contain different packages and refer
    to different archives, so while from a philosophical point of view one
    might make one argument or the other, from the very specific, concrete
    and real issue of implementing the os-release specification, they are different releases and it must be possible to identify them as such,
    and wrong information should not be conveyed to users.

    We have a disagreement about whether the information you intend to
    convey actually exists beyond the point in time where you deboostrap. If
    I debootstrap unstable and look at it a week later, it more closely
    represents testing than unstable.

    There is also another common misunderstanding regarding what
    constitutes a rolling release, sometimes used to justify avoiding to
    fix these bugs. Again here such a concept from a philosophical point of
    view might be bent into meaning many different things, but from the
    point of view of the os-release specification, a rolling release is a
    release that will never have a +1 or a -1 version. From the os-release
    point of view, the fact that a distribution is updated often and gets a
    lot of new packages, that might break ABI/API, or that is not security supported, does not mean it is a rolling distribution. So unstable/sid
    is a rolling distribution, because there will never be a new version,
    it will always be sid. Trixie however is _not_ a rolling distribution, because there is a trixie-1 (bookworm) and there will be a trixie+1
    (forky). The fact that trixie gets a lot of changes in this 2 years development period is orthogonal and independent, and does not qualify
    it as a rolling distribution, in the context of the os-release
    specification. In fact, there is a proposal to add an independent os-
    release field that qualifies a version as "stable", "lts" or in "development", that would be suited to mark testing as such. So it
    would be entirely appropriate to set VERSION_ID=13 in trixie's os-
    release right now. It is not appropriate to set VERSION_ID=13 in sid's os-release, now or ever.

    Conversely, we might consider that the os-release specification that is
    meant to cover the various aspects of Linux distributions is a poor fit
    for Debian and that its expressiveness is too limited to accurately
    represent the migration-based approach that Debian uses to assemble its releases. We might consider this a bug in the os-release specification
    and we may even disagree with the os-release specification upstream (aka
    you) about that. It all depends on how you look at it.

    These issues are not just theoretical, and do not concern mere personal preferences or cleanliness or code quality or ugliness. They cause very
    real, very actual and very painful grief for Debian users, as evidenced
    by the multiple independent bugs with multiple independent reporters
    chiming in, and the multiple ugly hacks that have to be implemented as Debian-specific workarounds (the latest instance of which can be found atáhttps://sources.debian.org/src/systemd/256.4-2/debian/tests/upstream/#L15 ).

    Thank you for referencing a practical effect. It is not clear how mkosi
    uses the Release field and why it is important to differentiate testing
    from unstable though.

    The base-files maintainer repeatedly, over numerous years, refused to
    fix these incompatibilities with the specification, citing personal preferences and interpretations, and the latest suggestion as per
    #1021663 is to override the lsb_releae maintainer and ship again buggy
    and deprecated lsb_release python scripts to try again to solve the
    problem in a Debian-specific way, parsing apt's sources.list. The point
    of a cross-distro specification is to perform its function reliably so
    that users do not have to employ distro-specific workarounds, so we are currently doing our users a disservice by shipping a buggy
    implementation, and require them to use deprecated and buggy scripts as workarounds. It would in fact be much better to simply not ship an implementation of os-release at all, rather than implement it wrongly
    based on reinterpretations.

    As far as I read the specification, no field is mandatory. This gives
    rise to another solution to come into compliance with the letter of the specification: Drop the VERSION_CODENAME from /etc/os-release just as
    the VERSION is already dropped. As far as I can see, all other fields
    have compliant values.

    A concrete proposal that I can put forward is to move os-release away
    from base-files, into a new source+binary package, that can be managed independently, and can be updated to respect the specification it is
    supposed to follow. base-files ships code in maintainer scripts so
    requires changes and updates, and using a separate package allows to do
    only one upload per cycle to set the new metadata. base-files can then
    depend on this new binary package, which will ship only /usr/lib/os-
    release, its /etc/os-release symlink and no maintainer script. This
    package should be team-maintained on Salsa (as opposed as base-files
    that is individually maintained with no VCS).

    The os-release installed in sid's images would then be something along
    those lines:

    PRETTY_NAME="Debian GNU/Linux sid"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=sid
    ID=debian

    And trixie's would be something along those lines:

    PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
    NAME="Debian GNU/Linux"
    VERSION_ID="13"
    VERSION="13 (trixie)"
    VERSION_CODENAME=trixie
    RELEASE_TYPE=pre-release
    ID=debian

    With RELEASE_TYPE= changing to 'lts' immediately before release day.
    There are several different ways of having different content in sid vs testing, and some have been proposed in the latest bug linked above, I
    would be happy to discuss those details too if required.

    I think this needs agreement from the release team before moving
    forward.

    With my bootstrapping-hat, I would also like to see evidence of tests
    that this approach does not negatively impact debootstrap-like tools.
    (Russ gave a longer rationale on this, thanks.)

    I volunteer to do the work to create and team-maintain the new package,
    and provide a patch to do the move from base-files. If requested, I am
    happy to do such work in advance so that you can judge based on
    something concrete.

    Thank you for the offer. Before asking you to do that work, I think
    there are a few actionable items for moving the disagreement forward:

    I'd like to better understand the problems caused by the imprecise implementation of the os-release specification as that aspect is still
    quite sketchy in your request.

    Your request actually includes a number of possible solutions with
    varying implications. Could you rank the various solutions according to
    your preference and express your reasons for ranking when it is not
    obvious?

    If your preferred solution requires the use of t-p-u, I suggest seeking approval from the release team before proceeding to implement it.

    In any case, my impression is that your request is not yet actionable on
    the CTTE side.

    Helmut

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Helmut Grohne on Fri Aug 2 02:50:01 2024
    On Thu, 1 Aug 2024 at 22:52, Helmut Grohne <helmut@subdivi.de> wrote:

    Hi Luca,

    On Thu, Aug 01, 2024 at 04:54:20PM +0100, Luca Boccassi wrote:
    This is an escalation requesting a ruling on the matter of several base-files bugs around its buggy implementation of the os-release specification, the most recent example being #1021663 and other
    instances that I could find with a cursory look being #1008735 and
    #675731.

    I observe that Santiago has replied to each of them with patience and
    that he has presented relatable reasons for his choices.

    As you detail later, it seems that the corner stone of your complaint is
    that an unstable installation should have VERSION_CODENAME=sid rather
    than VERSION_CODENAME=trixie. Do you agree with this characterization?

    Yes, _and_ testing should have VERSION_CODENAME=trixie at the same
    time, to be precise. I.e., the very core of the conflict is about
    whether being able to tell the difference between testing and unstable
    should be possible following the distro-agnostic os-release
    specification.

    The TL;DR is a request to override the base-files maintainer, and
    enable moving os-release into a new, independent and separate source package, so that these bugs may finally be fixed, and Debian's os-
    release may finally be made compliant with the specification.

    On a process level, the CTTE can only decide among available options. In
    this context available roughly equates the existence of a patch (or
    source package). Reading multiple bugs, I found disagreement on this approach, but no code that could be characterized as a reviewable
    solution.

    Well you know this better than me of course, but isn't this also
    something you can do? Decide between:

    1) The os-release specification must be adhered to, and it must be
    possible to tell the difference between testing vs unstable, and each
    must be correctly identified by the respective metadata

    or

    2) Testing and unstable can continue to remain indistinguishable, and
    both be erroneously identified as trixie

    Again you'll know better than me, but it seems to me rulings were made
    in the past that were along similar lines (eg: usrmerge) - there
    wasn't reviewable code there, no?

    Another plausible way to interpret your mail is that you really ask the
    CTTE to override the base-files maintainer in claiming ownership of /etc/os-release in the base-files package request releasing the file to another package. Given that said file has become part of the essential interface, releasing it is subtle and warrants a more detailed look at
    how the take-over is supposed to happen. To me that process is too
    sketchy to consider at this time.

    Numerous attempts were independently made by many different people to
    try and convince the base-files maintainer to fix this issue, the
    oldest one linked above being 12 years ago, and they have all been rejected, as recently as today. The only course of action left is
    therefore asking for a CTTE intervention in the matter, as all attempts
    at mediation and negotiation over the years have failed.

    Evidently, there are multiple conflicting requirements that various
    parties would like to see implemented. The base-files maintainer has
    made a compromise and argued in favour of his position. Said compromise encompasses an interpretation of the os-release specification that does
    not follow it to the letter.

    Sorry but I do not think that is an accurate representation. First of
    all, the implementation of the spec is bugged, period - it's not about
    being pedantic about it, it's about being completely incompatible: sid
    is identified as trixie, and that is just plain wrong, and there's no
    room for interpretation, no matter how one might try to bend it. You
    might say that you don't _care_ that the implementation is buggy, you
    might even say that it is worth, nay _good_ it to leave it buggy - but
    buggy it is, if I create a sid image, it will never in a million years
    be trixie, and yet it says it's trixie.

    Secondly, I am not even sure what these conflicting requirements
    actually are? Could you please spell them out? If trixie was
    identified as trixie, and sid was identified as unstable, what
    compromise would be, er, compromised, precisely? Because the only
    practical objections I could find were based on the idea that
    implementations would be ugly or hard to maintain or so - as already
    mentioned, I am happy to relieve anybody else and take that hard and
    ugly maintenance burden for myself. What other actual problem would
    suddenly appear? What feature or advantage do we leave behind? How are
    things made worse for our users?

    The os-release specification, of which I am an upstream author and maintainer, defines a distro-agnostic text-based metadata format to
    allow identifying Linux distributions images, root directories, trees
    and whatnot, without requiring distro-specific quirks, executables, binaries, scripts or workarounds. It has been adopted pretty much universally on Linux, including in Debian since 2012. It supersedes deprecated tools and specifications such as lsb_release and distro- specific files such as debian_release.

    Spec:

    https://www.freedesktop.org/software/systemd/man/devel/os-release.html

    With my upstream spec maintainer hat on, I am asserting that the base- files implementation of the os-release specification is buggy. This has always been the case, since the very beginning, as it can be seen in
    the oldest of the bugs linked above. The crux of the issue is that the
    way base-files implements the specification does not allow to
    distinguish testing vs unstable images, and worse than that, it
    recently started providing wrong and misleading information,
    incorrectly identifying sid as trixie (via VERSION_CODENAME=trixie).

    Please allow me to raise the question of what is the benefit of differentiating sid and trixie in /etc/os-release. I am inclined to
    agree that VERSION_CODENAME would be technically wrong in unstable, but
    we have a history of sometimes bending rules.

    Again, this is not just some slight deviation, this is completely and
    truly bugged, as it says it's one thing while it's another. The
    benefit is the same as having os-release in the first place - to have
    a standard, Linux-wide, distro-agnostic way of identifying an image.
    Everyone can take any OS vendor tree, open usr/lib/os-release under
    it, and know which distro and version it belongs to.
    You can do that for every Linux distro that I know of, but for Debian
    you cannot, you have to employ Debian-specifc hacks on top of it, such
    as trying to grep apt/sources.list and hope only one set is present.
    The benefit is allowing users to drop all these painful
    Debian-specific kludges that they have to carry - I linked in a
    previous mail the very latest one that I had to add myself. This is a
    well known and widely reported pain point, that you'll find traces of
    in the weirdest places. Here's one I am well familiar with as the git
    history will show:

    https://github.com/openSUSE/obs-build/blob/master/build-recipe-livebuild#L138

    This implicitly imposes a requirement on which sources can be used to
    build live-build based images in the open build service, because of
    this base-files bug. Fortunately at the time we didn't care about
    that, for external reasons, so it didn't cause troubles, besides
    needing to hack it.

    Here's a random one, first result found searching on Github:

    https://github.com/lpereira/hardinfo/blob/4c97625c5666fa5fc353e7cab322b09159e54ed4/modules/computer/os.c#L486

    /* HACK: Some Debian systems doesn't include the distribuition
    * name in /etc/debian_release, so add them here. */

    Note how it starts with HACK, all caps? This is what we subject our
    users to. This is what we are known for. What do we even gain in
    exchange?

    Conversely, I am unsure how to distinguish testing and unstable myself.
    Say I operate an unstable system and eventually decide that my ride is
    too bumpy and I prefer running testing, I may edit my sources.list and
    after a month or so my system will have reasonably converged to testing.
    At what point would my /etc/os-release change?

    Russ raised the question of how to represent a testing system that pulls
    some packages from unstable.

    Exactly in the same way as you represent a stable system that pulls
    some packages from testing, or pins some packages to oldstable.
    Whatever version of the package that provides os-release wins, as
    that's the only sensible and reasonable conclusion to reach. And if
    you have built a frankendebian and it's weird or incorrect? Well, as
    always when you build frankendebians, you can do it, but you get to
    keep the pieces, and the incorrectness of os-release will be the least
    of your worries if history has anything to say about it. The fact that
    you can install base-files from stable in an oldstable release doesn't
    mean os-release is useless and should be dropped or broken. It serves
    its purpose in the normal and expected use case, when you have an
    image or vendor tree built from one archive and you want to be able to
    identify it. I could echo 'ID=Skynet' into my /usr/lib/os-release
    right now, and nothing would stop me or revert it. It doesn't
    invalidate the concept and utility of os-release as a specification
    implemented by distributions. This metadata file is not magic, and is
    not a package manager, it cannot guarantee that what it says always
    matches what's around it, if one is willing to muck with things. But
    that's not its purpose. Its purpose is: I have a normal, correctly
    built OS vendor tree, and I am able to identify what vendor and
    version of the tree it is, without needing special hacks, workarounds,
    special programs, scripts, or hoops to jump through, whatever the
    distribution might be, whatever the vendor might be. Everyone else
    does this correctly.

    This has resulted in numerous downstream users, tools, scripts and code having to employ fragile Debian-specific hacks, such as trying to grep /etc/apt/sources.list in an attempt to catch "unstable/sid" or
    "testing" keywords, which of course is can break spectacularly, for
    example if apt is not configure in an image (which is normal in a read- only image-based system), or if both unstable and testing repositories
    are present, with unstable pinned via apt-preferences to 1. Other distributions do not have this issue, it is only a problem that Debian forces its users to deal with, causing grief and pain.

    Given the issues you experienced, would you be kind enough to reference
    some of them here?

    Apart from what shared above and below,

    "Oh look, a DDI ( https://uapi-group.org/specifications/specs/discoverable_disk_image/
    )! I wonder what it is?"

    $ sudo image.raw
    Name: image.raw
    Size: 3.6G

    OS Release: NAME=Fedora Linux
    VERSION=40 (Forty)
    ID=fedora
    VERSION_ID=40
    VERSION_CODENAME=
    PLATFORM_ID=platform:f40
    PRETTY_NAME=Fedora Linux 40 (Forty)
    ANSI_COLOR=0;38;2;60;110;180
    LOGO=fedora-logo-icon
    CPE_NAME=cpe:/o:fedoraproject:fedora:40
    DEFAULT_HOSTNAME=fedora
    HOME_URL=https://fedoraproject.org/
    DOCUMENTATION_URL=https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/
    SUPPORT_URL=https://ask.fedoraproject.org/
    BUG_REPORT_URL=https://bugzilla.redhat.com/
    REDHAT_BUGZILLA_PRODUCT=Fedora
    REDHAT_BUGZILLA_PRODUCT_VERSION=40
    REDHAT_SUPPORT_PRODUCT=Fedora
    REDHAT_SUPPORT_PRODUCT_VERSION=40
    SUPPORT_END=2025-05-13

    Use As: ✓ bootable system for UEFI
    ✓ bootable system for container
    ✗ portable service
    ✗ extension for system
    ✗ extension for initrd
    ✗ extension for portable service

    RW DESIGNATOR PARTITION UUID PARTITION LABEL
    FSTYPE ARCHITECTURE VERITY GROWFS NODE PARTNO
    rw root 02d1fb3a-d58c-4be9-a165-4e1b33590… root-x86-64 btrfs
    x86-64 no yes /dev/loop0p2 2
    rw esp abe612e8-6f83-4f1f-ad34-b82204c26… esp vfat
    - - no /dev/loop0p1 1


    "Fedora 40, cool. Oh look, another DDI! I wonder what this one is instead?"


    $ sudo systemd-dissect image.raw
    Name: image.raw
    Size: 9.0G

    Machine ID: 341eb96eb8094d8a93e700d9ba42c68c
    OS Release: PRETTY_NAME=Debian GNU/Linux trixie/sid
    NAME=Debian GNU/Linux
    VERSION_CODENAME=trixie
    ID=debian
    HOME_URL=https://www.debian.org/
    SUPPORT_URL=https://www.debian.org/support
    BUG_REPORT_URL=https://bugs.debian.org/

    Use As: ✓ bootable system for UEFI
    ✓ bootable system for container
    ✗ portable service
    ✗ extension for system
    ✗ extension for initrd
    ✗ extension for portable service

    RW DESIGNATOR PARTITION UUID PARTITION LABEL
    FSTYPE ARCHITECTURE VERITY GROWFS NODE PARTNO
    rw root 7214d0b9-9b02-492d-b6db-af983c74c… root-x86-64 ext4
    x86-64 no yes /dev/loop0p2 2
    rw esp b5626e44-b572-4315-ab82-3ba507126… esp vfat
    - - no /dev/loop0p1 1


    "Ah it's Debian Trix..."

    $ sudo build/systemd-dissect --copy-from image.raw
    /etc/apt/sources.list /tmp/sources
    $ grep Suites /tmp/sources
    Suites: unstable
    Suites: unstable-debug

    "Oh wait no, it's Debian Si..."

    $ sudo build/systemd-dissect --copy-from image.raw /etc/debian_version /tmp/debian_version
    $ cat /tmp/debian_version
    trixie/sid

    "Oh no, wait, it's... both?!"

    The base-files maintainer provides broadly two categories of
    justifications for refusing to fix these issues. The first one is dismissing any proposed solution as "ugly", without really
    substantiating what it means - that is for example the case for
    multiple proposals in #1021663. The second one is pushing forward a

    As far as I grasped from reading the bugs there are roughly two solution categories. One continues to install /etc/os-release as a conffile and
    uses the t-p-u mechanism to update it in trixie. The other category
    turns it into a configuration file constructing it from some maintainer script. I can relate to characterizing both as ugly.

    To be pedantic, please note that /etc/os-release is a symlink, not a
    conffile. The real content is in /usr/lib/os-release.
    I personally don't think it should be done via maintainer scripts if
    possible, it should simply ship fixed content. The fewer runtime
    moving parts we have, especially in the essential set, the safer and
    the better, and I think your experience should match here. Things
    working great in image-based systems is important to me.

    I do not find using t-p-u to update the content ugly at all to be
    honest, it's there to be used as a piece of infrastructure. I do not
    see anything wrong with using it? What would be the actual issue? And
    anyway as already mentioned, I am fine with taking the burden of such
    ugliness upon myself, so that nobody else has to be subjected to it.
    Win/win!

    With my CTTE member hat lifted, I may also participate in design
    discussions and would like to propose a third alternative (although it
    might have been mentioned in the parts that I skimmed too quickly and
    hope that you can point to the earlier discussion in that case).

    Consider adding a new Debian binary package containing /etc/os-release
    with contents suitable for unstable. This package would use the
    dpkg-divert mechanism to avoid a conflict with base-files which would continue to install /etc/os-release with contents suitable for testing
    (even in unstable). We would mark this new package "Essential: yes",
    but have no other package depend on it. We would also file a permanent
    rc-bug to prevent it from migrating to testing. As a result, the set of essential packages as discovered by bootstrapping tools would differ
    between testing and unstable and the /etc/os-release would be diverted
    for unstable only. A significant downside of this approach is that all existing unstable systems would never install this package (and thus
    continue to be seen as testing installations) and all systems that were bootstrapped as unstable would be keep this package even if they were to
    be downgraded to testing at a later time (unless the administrator
    actively removes the new package).

    The downsides you have mentioned are significant already, and also as
    you know I very strongly dislike dpkg-diverts, but that's my problem.
    However, having complex maintainer script machinery in the essential
    set is everyone's problem, as it can and will break, and as above, I
    am sure it is best avoided. This still requires blocking the migration
    of a package, so it does not seem to me it provides any advantages
    over simply having an os-release binary package pinned to unstable,
    with no maintainer scripts, and just the content appropriate for
    unstable inside it. It still requires overruling the base-files
    maintainer. What would be the difference/advantage over the other
    approach?

    philosophical explanation according to which testing and unstable are
    not actually different images, but they are one and the same (two sides
    of the same coin is the expression used). While that might be true in a philosophical sense, this is a practical matter, and it concerns only
    the os-release specification and its implementation. In such context, testing and unstable are different and independent images, built from different and independent archives of packages. For example, at any
    point in time you can do:

    deboostrap testing /tmp/a
    deboostrap unstable /tmp/b

    and if your shell history is lost, you have no reliable, stable, distro-agnostic way to identify what exactly /tmp/a and /tmp/b are.
    These, created at the same time, contain different packages and refer
    to different archives, so while from a philosophical point of view one might make one argument or the other, from the very specific, concrete
    and real issue of implementing the os-release specification, they are different releases and it must be possible to identify them as such,
    and wrong information should not be conveyed to users.

    We have a disagreement about whether the information you intend to
    convey actually exists beyond the point in time where you deboostrap. If
    I debootstrap unstable and look at it a week later, it more closely represents testing than unstable.

    I don't think so. It is unstable, one week out of date. It's not any
    different than running "debootstrap bookworm" and checking back X
    weeks later, after a point release is available - it will be outdated,
    but still bookworm, and still one apt update; apt upgrade away from
    being up to date again. Same for unstable: if it's a week old, after
    you apt upgrade it, it will be on par again. It will not magically
    become testing by itself. If you debootstrap unstable today and check
    back again in a year, it will not be stable trixie, it will be
    outdated unstable, and an apt upgrade will make it an up to date
    unstable.
    As above, os-release is not magic, and it is not a package manager. It
    cannot guarantee that things are up to date, or weren't manually
    broken somehow - that's just impossible. Its job is, given a normal
    and correctly built OS vendor tree, tell you what that tree is at the
    point it was created/last updated/whatever. An unstable tree is still
    unstable even if it's old.

    And if you build images and you want to identify _when_ it was built?
    We got a field for that! BUILD_ID= can be set to a timestamp for
    example. Then your ID=debian VERSION_CODENAME=sid
    BUILD_ID=20240802T0017 triplet in your tree tells you everything you
    need to know. Of course the latter is for image build tools, not for
    packages to ship.

    There is also another common misunderstanding regarding what
    constitutes a rolling release, sometimes used to justify avoiding to
    fix these bugs. Again here such a concept from a philosophical point of view might be bent into meaning many different things, but from the
    point of view of the os-release specification, a rolling release is a release that will never have a +1 or a -1 version. From the os-release point of view, the fact that a distribution is updated often and gets a
    lot of new packages, that might break ABI/API, or that is not security supported, does not mean it is a rolling distribution. So unstable/sid
    is a rolling distribution, because there will never be a new version,
    it will always be sid. Trixie however is _not_ a rolling distribution, because there is a trixie-1 (bookworm) and there will be a trixie+1 (forky). The fact that trixie gets a lot of changes in this 2 years development period is orthogonal and independent, and does not qualify
    it as a rolling distribution, in the context of the os-release specification. In fact, there is a proposal to add an independent os- release field that qualifies a version as "stable", "lts" or in "development", that would be suited to mark testing as such. So it
    would be entirely appropriate to set VERSION_ID=13 in trixie's os-
    release right now. It is not appropriate to set VERSION_ID=13 in sid's os-release, now or ever.

    Conversely, we might consider that the os-release specification that is
    meant to cover the various aspects of Linux distributions is a poor fit
    for Debian and that its expressiveness is too limited to accurately
    represent the migration-based approach that Debian uses to assemble its releases. We might consider this a bug in the os-release specification
    and we may even disagree with the os-release specification upstream (aka
    you) about that. It all depends on how you look at it.

    Sounds good to me, then if it's a poor fit please rule against the
    base-file maintainer shipping an os-release file and force him to drop
    it entirely. That would be great. So then I can take it over from my
    packag... wait, did I say the quiet part out loud?

    Joking aside, there's nothing special about Debian here, it's just
    like any other distribution, most others have testing pockets too -
    Arch has them, SUSE has them, Ubuntu has them. Heck RHEL has an entire
    separate distro as a testing pocket! And yet they manage just fine to
    correctly implement the os-release specification. Our idiosyncrasies
    do not make us special and do not justify bugs. This is a bug in
    Debian's implementation, which says that X is Y, in exchange for...
    nothing in particular, it's just a bug, nobody wins anything from the
    current situation.

    These issues are not just theoretical, and do not concern mere personal preferences or cleanliness or code quality or ugliness. They cause very real, very actual and very painful grief for Debian users, as evidenced
    by the multiple independent bugs with multiple independent reporters chiming in, and the multiple ugly hacks that have to be implemented as Debian-specific workarounds (the latest instance of which can be found
    at https://sources.debian.org/src/systemd/256.4-2/debian/tests/upstream/#L15
    ).

    Thank you for referencing a practical effect. It is not clear how mkosi
    uses the Release field and why it is important to differentiate testing
    from unstable though.

    It's an image builder tool - it builds images, so it needs to know
    _which_ image to build and in this case, I need it to build a guest
    that matches the host - do I pull from testing or unstable? Which one
    is this? Ah it says trixie, so I can use the trixie repository and...
    oh wait now everything is broken because it was actually sid and a
    transition was not finished so I got a broken image. Try again next
    week?
    Because it's not just standalone images, but images based on other
    images (ie, sysext: https://uapi-group.org/specifications/specs/extension_image/ ). If you
    cannot identify an image, what the heck did you just build? And
    against what? And what do you base this other one on? Nobody knows.
    And then the hacks begin.

    The base-files maintainer repeatedly, over numerous years, refused to
    fix these incompatibilities with the specification, citing personal preferences and interpretations, and the latest suggestion as per
    #1021663 is to override the lsb_releae maintainer and ship again buggy
    and deprecated lsb_release python scripts to try again to solve the
    problem in a Debian-specific way, parsing apt's sources.list. The point
    of a cross-distro specification is to perform its function reliably so
    that users do not have to employ distro-specific workarounds, so we are currently doing our users a disservice by shipping a buggy
    implementation, and require them to use deprecated and buggy scripts as workarounds. It would in fact be much better to simply not ship an implementation of os-release at all, rather than implement it wrongly
    based on reinterpretations.

    As far as I read the specification, no field is mandatory. This gives
    rise to another solution to come into compliance with the letter of the specification: Drop the VERSION_CODENAME from /etc/os-release just as
    the VERSION is already dropped. As far as I can see, all other fields
    have compliant values.

    Yes, and that solves the "wrong information given" problem (which is
    new, VERSION_CODENAME was introduced somewhat recently in base-files),
    but does not solve the "cannot identify image without horrendous
    hacks" problem, so the implementation is still buggy - less so, but
    still buggy. The point of the spec is to uniquely identify an image,
    and if you are Arch and don't do releases then of course you don't
    specify the release codename (there ain't one), so the field is
    optional to cater to those use cases. It's not optional to cater to
    the "distribution is held together with duct tape and prayers" cases,
    I'm afraid. And if you don't implement the spec to enable its purpose
    of identifying vendor trees, why implement it at all?

    A concrete proposal that I can put forward is to move os-release away
    from base-files, into a new source+binary package, that can be managed independently, and can be updated to respect the specification it is supposed to follow. base-files ships code in maintainer scripts so
    requires changes and updates, and using a separate package allows to do only one upload per cycle to set the new metadata. base-files can then depend on this new binary package, which will ship only /usr/lib/os- release, its /etc/os-release symlink and no maintainer script. This
    package should be team-maintained on Salsa (as opposed as base-files
    that is individually maintained with no VCS).

    The os-release installed in sid's images would then be something along those lines:

    PRETTY_NAME="Debian GNU/Linux sid"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=sid
    ID=debian

    And trixie's would be something along those lines:

    PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
    NAME="Debian GNU/Linux"
    VERSION_ID="13"
    VERSION="13 (trixie)"
    VERSION_CODENAME=trixie
    RELEASE_TYPE=pre-release
    ID=debian

    With RELEASE_TYPE= changing to 'lts' immediately before release day.
    There are several different ways of having different content in sid vs testing, and some have been proposed in the latest bug linked above, I would be happy to discuss those details too if required.

    I think this needs agreement from the release team before moving
    forward.

    Sure, and as mentioned elsewhere the version number is not the
    important bit and can be omitted if preferred. There's other fields
    that are better suited to identify release vs development stages, but
    it's not too important, and either way works.

    With my bootstrapping-hat, I would also like to see evidence of tests
    that this approach does not negatively impact debootstrap-like tools.
    (Russ gave a longer rationale on this, thanks.)

    Sorry, I do not follow - how would this impact debootstrap negatively?
    It's just a package with a single file? The only part to decide is
    what pulls it in and yeah that should be compatible with debootstrap
    of course.

    I volunteer to do the work to create and team-maintain the new package,
    and provide a patch to do the move from base-files. If requested, I am happy to do such work in advance so that you can judge based on
    something concrete.

    Thank you for the offer. Before asking you to do that work, I think
    there are a few actionable items for moving the disagreement forward:

    I'd like to better understand the problems caused by the imprecise implementation of the os-release specification as that aspect is still
    quite sketchy in your request.

    I think I have shared enough examples of the hacks it forces one to
    use above, but the biggest bug can be seen by simply doing this:

    $ debootstrap sid /tmp/sid
    $ grep VERSION_CODENAME /tmp/sid/usr/lib/os-release
    <surprise!>

    Your request actually includes a number of possible solutions with
    varying implications. Could you rank the various solutions according to
    your preference and express your reasons for ranking when it is not
    obvious?

    The best and easiest solution is what I shared in a previous mail: a
    binary os-release package built from a new os-release source. It ships
    only /usr/lib/os-release and the /etc symlink, no maintainer scripts,
    no dependencies, no moving parts. Version 12345, which matches the
    combination of my luggage, will be in unstable with content:

    PRETTY_NAME="Debian GNU/Linux sid"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=sid
    ID=debian
    RELEASE_TYPE=development

    and prevented from migrating via the preferred mechanism by ftp/rt.

    Version 13 will be in testing via testing-p-u with at least content:

    PRETTY_NAME="Debian GNU/Linux trixie"
    NAME="Debian GNU/Linux"
    VERSION_CODENAME=trixie
    ID=debian
    RELEASE_TYPE=development

    and possibly the version numbers if rt wants to, if not it gets added
    with the new upload at release time to drop the development bit.
    Post-release, a new upload is done for forky - rinse and repeat.
    No moving parts, no switcharoos, no juggling of flaming swords.

    The second best, in case t-p-u is not usable for any reason, is what I
    shared in the older email. Same as above w.r.t content and structure
    of the package, but at the beginning of each cycle a new version with
    the content appropriate for the new codename is uploaded to unstable
    with urgency high (and if rt is amenable with a hint to migrate the
    same day), and after migration another upload is done to restore the
    content for sid, and pinned again with the preferred method. Rinse and
    repeat.
    This requires more uploads, and one day every two years sid will have
    the wrong metadata. Still better than having the wrong metadata every
    day forever.

    After that I guess there's the maintainer scripts options - either the
    one you suggested above, or others. Not a fan: moving parts in the
    essential set bad, fixed package content good.

    Then further below, I guess I could start changing image build tools
    to adjust the content behind the maintainer's back. When building an
    unstable image in debootstrap, I know I am building unstable, so I
    could change debootstrap to fix the content of os-release after
    unpacking. Every other image builder tool should have to do the same,
    though, and worse, it would fight with dpkg as the content wouldn't
    match, and would be overwritten on updates, so I'd have to mark it as immutable. Really a bad option.

    Doing nothing would be the worst option of course. At that point,

    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Russ Allbery@21:1/5 to Luca Boccassi on Fri Aug 2 05:10:02 2024
    Luca Boccassi <bluca@debian.org> writes:

    It could be a dependency of something else, or it could be marked as essential itself, given the content is a 5 lines text file and a symlink
    it shouldn't be too hard to figure out an acceptable way to ensure it
    ships everywhere. It doesn't have to be related to base-files at all, it
    was just the first thing that came to mind.

    Given that it's included in base-files now and base-files is essential, I believe it has to continue to be provided by an essential package, unless
    we want to try to do the work of figuring out if os-release can be removed
    from essential (and I would not be eager to do that).

    Since it is part of the essential set, though, I'm not sure the dependency
    from base-files is actually needed (but also it may not really matter). I think dependencies between essential packages are only really used during
    the bootstrapping phase, and presumably os-release is not needed by bootstrapping.

    Anyway, I haven't done any work in this area of Debian so I'll leave this
    for other people with more relevant expertise to comment on.

    [version numbers]
    The really important part is adding different and separate codenames, so
    that a testing image can be reliably and univocally distinguished from a
    sid image, and VERSION_CODENAME is enough for that, the version number
    is cherry on top.

    Like Santiago, I admit to not finding this use case compelling. Most of
    the reasons why I might imagine someone would want to do this sound like misunderstandings of how Debian works, given that in many cases, excluding
    the apt configuration, today's unstable image is next week's testing image without changing a single byte on disk. In other words, in the cases
    where this does make sense, I feel like this desire is usually a proxy for "what package pool will *new* packages for this image be drawn from," and
    using os-release to guess at that information seems at least a bit questionable. If what someone cares about is apt configuration, it seems better to get that information from apt directly, not via a fallible proxy
    (and maybe we need a better way to do that).

    However, it doesn't seem obviously *bad* to do this either, and I trust
    that you have reasons why you think this is important.

    But this example seems a bit too tortured to me.

    Well, it's related to your example of the zoom package basing decisions on
    the version number. If they had done that based on a version number of testing, there's a fairly high chance that whatever decisions they made
    would be wrong by the time the stable release happens, particularly if
    they do that early in a release cycle.

    That said, I would expect most third-party non-free packages like that to
    not care at all about anything in Debian until it reached stable, so the chances of them doing that may be low.

    And secondly, that same strawman

    straw man (noun)

    1: a weak or imaginary opposition (such as an argument or adversary)
    set up only to be easily confuted

    This is the sort of thing I was talking about when I said insults. I'm
    not sure if you're using this term with some non-standard definition (believable, since I was using this argument in the opposite way from how
    one would use a straw man), but the normal implication of calling my
    argument a straw man is that I was arguing in bad faith. This comes
    across as weirdly aggressive and makes these discussions unnecessarily annoying.

    can be applied to stable, as we do point releases and security uploads.

    I am surprised that point releases don't change VERSION_ID, and now I'm
    curious why that's the case. I was assuming, having not previously looked
    at it, that VERSION_ID would match /etc/debian_release, but I see that it doesn't and has only the major version.

    Regardless, security uploads do potentially create this problem, but we
    also try pretty hard to not change major functionality in security uploads
    in ways that may prompt someone to want to change behavior based on that version. There is a window of possibility there, I think it's
    sufficiently narrow to not worry that much about. It's at least a much narrower problem than version numbers in testing.

    I'm not sure how important this is, and all the options have obvious
    problems. I just know that I've seen a lot of code that uses version
    numbers or code names this way, mostly in things like Puppet rules. Most
    of the time people will probably get this right, but there are some
    obvious potential mistakes such as coding a condition that says 13 behaves
    the same as 12 (but the eventual release won't) or that 13 always behaves
    in some new way (but testing systems that weren't upgraded to the released version 13 don't and instead behave like 12).

    This problem also applies to codenames, which I've seen used in Puppet
    rules as well (more often than version numbers, in fact), so we already
    have this problem since, as you pointed out when opening this bug, the
    current base-files os-release file declares unstable and testing to be
    trixie. To be clear, although I understand why Santiago made that change,
    I have a similar worry about that decision.

    Anyway, I don't know how much we should care about this, particularly
    given the RELEASE_TYPE addition. That's why I said it was a worry, not a blocking objection. The most mistake-resistant approach would be to give testing some *other* code name that isn't trixie, and only give the code
    name of trixie at the time of release, but that's also weirdly different
    from how we use codenames in the archive structure and I am probably overthinking this.

    What do you mean?!! It's right there! https://www.freedesktop.org/software/systemd/man/devel/os-release.html#RELEASE_TYPE=

    ...ok, ok, it's there now because I just merged it and regenerated the
    docs :-P

    Thanks! This looks good to me.

    --
    Russ Allbery (rra@debian.org) <https://www.eyrie.org/~eagle/>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Haber@21:1/5 to Luca Boccassi on Fri Aug 2 10:40:01 2024
    On Thu, Aug 01, 2024 at 06:58:09PM +0100, Luca Boccassi wrote:
    The TL;DR: ensure that the version of the 'os-release' package with
    the content for unstable stays in unstable and never migrates, and the version of the 'os-release' package with the content for testing goes
    to testing either via a quick migration or via
    testing-proposed-updates.

    This also means that os-release NEEDS to be managed in a package that is
    easy to get bug free: Either automatically generated or so simple that
    it's impossible to get wrong. The "testing" version of the package that
    will be promoted to stable on release day will never be in unstable,
    thus bugs in that package will be fatal immediately.

    This in my opinion rules out the option of keeping this inside
    base-files, which is a complex package that I really want to see managed through the normal unstable-testing-stable mirgration process.

    That's it. Of course if what you are saying is that you mix and match
    a selection of packages from testing and unstable, well that's a frankendebian - you can do that on any release (I have some testing
    packages pulled in my debian stable laptop right now).

    Hence, on such systems os-release is ALWAYS wrong in one or the other
    way, hence the local admin is on her own here. I don't see that as a
    problem.

    I could echo "ID=windows 3.1" into my local
    /etc/os-release and nothing would stop me or fix it until the next
    stable release.

    Not even automatically. /etc/os-release is a conffile, isnt it?

    Greetings
    Marc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Haber@21:1/5 to Russ Allbery on Fri Aug 2 10:50:01 2024
    On Thu, Aug 01, 2024 at 12:06:21PM -0700, Russ Allbery wrote:
    The second thing that I'm not fond of is giving testing the version number
    13 when we plan on using 13 as the version number for the trixie release.
    I fear that if we do that, someone (probably a third-party package
    provider) will add some workaround or behavior change for a package based
    on that version number for a problem that only ever existed in testing and that was not in the actual 13 release. I would instead expect testing to
    use some version number that is between stable and the version number that will be assigned to the next release, to reflect that it is likely to
    change substantially before Debian makes an actual release 13.

    And we cannot even use 13~, since we might release trixie as 12.9 or
    something. So that decision would have to be taken early by the release
    team, and it is almost impossible to revert.

    Does the proposal include lanugage about what to put in the Version:
    field in debian/control of the proposed package? Would it be pulled in
    by a versioned dependency (in base-files)?

    (If I were designing this from scratch, I'd give serious thought to using even version numbers for releases and odd version numbers for testing, similar to how Perl releases are versioned for very similar reasons. But that's probably too big of a change for the level of benefit.)

    Using yy.mm as release version number is one of the things that Ubuntu
    does right. I'd suggest going that path should we decide to touch
    version numbering.

    Presumably the RELEASE_TYPE setting of pre-release is supposed to help
    with that, but (a) that variable doesn't seem to be documented in os-release(5); (b) the sorts of packagers that I'm worried about are quite likely to not make subtle distinctions like that, so the version is still there as a potential foot-gun for people who aren't paying close
    attention; and (c) I would argue that calling testing a "pre-release" is
    not very accurate, since that applies that the contents are very similar
    to the eventual release and are in a relatively late stage of testing.

    Local variables in os_release are unlikely to be picked up by
    distribution independent tools like ansible and are thus of very limited usefulness.

    There's a lot of merit to Santiago's decision to not give unstable a
    version number that I think still applies to testing even when it's considered separately.

    It would be very nice to not have to do a two-stage distribution
    comparision in ansible playbooks or such, and to be able to do a numeric comparision. Personally, I currently reference my debian versions on
    codenames, which puts a lot of distribution specific knowledge about
    codenames into my playbooks. I am not very fond of that, but it is just
    a single stage, and it allows me to install new machines on trixie NOW
    and have them automatically migrate over when trixie becomes stable. I
    think that I had to define a local variable to accomplish this in my
    playbooks, but that's a few years in the past. It may be possible easier
    today.

    There was also a slight variant by Gioele, that again I fail to find now and it might be because of the bugs being rearranged, where testing-proposed-updates is used to upload testing-specific content.

    That seems like a better approach than the one proposed in the message
    above, although I think it requires some manual intervention by the
    release team. This doesn't seem like a serious problem given that uploads are presumably quite infrequent and the package is trivial.

    For this method to work the package MUST be trivial, if not impossible
    to get wrong.

    Greetings
    Marc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Haber@21:1/5 to Helmut Grohne on Fri Aug 2 11:00:01 2024
    On Thu, Aug 01, 2024 at 11:51:45PM +0200, Helmut Grohne wrote:
    Conversely, I am unsure how to distinguish testing and unstable myself.
    Say I operate an unstable system and eventually decide that my ride is
    too bumpy and I prefer running testing, I may edit my sources.list and
    after a month or so my system will have reasonably converged to testing.
    At what point would my /etc/os-release change?

    Probably never since the os-release version in unstable would always
    have to be higher than the one in testing to not confuse dak. But alas,
    such an unstable-going-testing system will probably never be a "true"
    testing system since it will continue to keep packages that were removed
    from testing but not from unstable. Therefore, after the system has
    "reasonably converged" to testing, the local admin (you) would have to
    compare package lists anyway, and at this stage an apt --force-downgrade os-release or its working equivalent would be in order.

    Russ raised the question of how to represent a testing system that pulls
    some packages from unstable.

    That would stil be a testing system in my opinion. One of the core (mis)features of testing is that you don't get as speedy security
    support as you get in stable or unstable in most cases. This should be automatically distinguishable.

    Using apt-pinning it is possible to have a system misrepresent itself in
    most arbitrary ways, so if you want to be really sure you'd need to look
    at the versioned set of installed packages, but that's the pain you
    asked for yourself.

    This has resulted in numerous downstream users, tools, scripts and code having to employ fragile Debian-specific hacks, such as trying to grep /etc/apt/sources.list in an attempt to catch "unstable/sid" or
    "testing" keywords, which of course is can break spectacularly, for
    example if apt is not configure in an image (which is normal in a read- only image-based system), or if both unstable and testing repositories
    are present, with unstable pinned via apt-preferences to 1. Other distributions do not have this issue, it is only a problem that Debian forces its users to deal with, causing grief and pain.

    Given the issues you experienced, would you be kind enough to reference
    some of them here?

    For example, having ansible playbooks that support testing becoming
    stable without breaking the systems or having to do in-sync changes to
    the inventory is unnecessarliy hard and error-prone.

    We have a disagreement about whether the information you intend to
    convey actually exists beyond the point in time where you deboostrap. If
    I debootstrap unstable and look at it a week later, it more closely represents testing than unstable.

    Not quite, it would have packages that are not in testing. And if
    upgraded, it would upgrade von unstable.

    Conversely, we might consider that the os-release specification that is
    meant to cover the various aspects of Linux distributions is a poor fit
    for Debian and that its expressiveness is too limited to accurately
    represent the migration-based approach that Debian uses to assemble its releases. We might consider this a bug in the os-release specification
    and we may even disagree with the os-release specification upstream (aka
    you) about that. It all depends on how you look at it.

    I would expect from Debian to work constructively with the os-release specification upstream to adapt the specification that it might be a
    better fit for Debian some time in the future. If we divert from the
    specs here, distribution independent tools (like ansible, python, puppet
    etc) are unlikely to go along and special case Debian.

    As far as I read the specification, no field is mandatory. This gives
    rise to another solution to come into compliance with the letter of the specification: Drop the VERSION_CODENAME from /etc/os-release just as
    the VERSION is already dropped. As far as I can see, all other fields
    have compliant values.

    That would make the file even less useful than it it today. A classical lose-lose solution. Please don't do that.

    I'd like to better understand the problems caused by the imprecise implementation of the os-release specification as that aspect is still
    quite sketchy in your request.

    Configuration Management, CMDBs, both in heterogenous fleets, using
    standard software that isn't willing to specialcase Debian.

    Greetings
    Marc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Luca Boccassi on Fri Aug 2 11:20:01 2024
    On Thu, 01 Aug 2024 at 16:54:20 +0100, Luca Boccassi wrote:
    The second [objection from the base-files maintainer] is pushing forward a philosophical explanation according to which testing and unstable are
    not actually different images, but they are one and the same (two sides
    of the same coin is the expression used). While that might be true in a philosophical sense, this is a practical matter, and it concerns only
    the os-release specification and its implementation. In such context,
    testing and unstable are different and independent images, built from different and independent archives of packages. For example, at any
    point in time you can do:

    deboostrap testing /tmp/a
    deboostrap unstable /tmp/b

    and if your shell history is lost, you have no reliable, stable, distro-agnostic way to identify what exactly /tmp/a and /tmp/b are.

    But, let's continue your example: suppose you ran those commands back in January. Now, 6 months later, run similar commands again:

    debootstrap testing /tmp/c
    debootstrap unstable /tmp/d

    With your proposed labelling of testing and unstable as being fundamentally different, you would have:

    /tmp/a: testing from January, labelled as testing (or trixie or Debian 13) /tmp/b: unstable from January, labelled as unstable
    /tmp/c: testing from July, labelled as testing (or trixie or Debian 13)
    /tmp/d: unstable from July, labelled as unstable

    But, contrary to that, the differences between a and b will be relatively small, and so will the differences between c and d; whereas the differences between a and c will be large (even though they're both labelled as
    testing) and so will the differences between b and d.

    For example, a and b will have glibc 2.37, but c and d will have 2.39,
    with whatever behaviour changes have happened in the last 6 months.
    Similarly, neither a nor b has been through the t64 transition, but
    both c and d have.

    I think the most important fact about all of these chroots is
    "it's strictly newer than Debian 12, so expect some behaviour
    changes". Precisely how much newer, and precisely which behaviour changes,
    is not such a simple question to answer: it depends which package's
    behaviour you're interested in, and if you want to answer that question,
    the only way is to look at individual packages, so that you can tell
    whether they were last updated in January or whether they have been
    updated to July's version.

    smcv
    (not a TC member)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Russ Allbery on Fri Aug 2 11:20:01 2024
    On Thu, 01 Aug 2024 at 20:00:40 -0700, Russ Allbery wrote:
    I just know that I've seen a lot of code that uses version
    numbers or code names this way, mostly in things like Puppet rules. Most
    of the time people will probably get this right, but there are some
    obvious potential mistakes such as coding a condition that says 13 behaves the same as 12 (but the eventual release won't) or that 13 always behaves
    in some new way (but testing systems that weren't upgraded to the released version 13 don't and instead behave like 12).

    I think the only right ways to handle version-dependent conditions
    are either feature detection (looking for the feature of interest, e.g.
    dpkg --assert-versioned-provides), or looking at the version number of the (possibly backported) package of interest (e.g. dpkg-query -W systemd),
    or if neither of those is feasible, something like this pattern:

    if major_version <= 11:
    do old things
    else if major_version == 12:
    do things suitable for bookworm
    else:
    assume testing/unstable/future and do new things

    with more or fewer "else if" depending on the number of major versions
    with divergent behaviour that you aim to support. All of those patterns
    would work without a VERSION_ID in testing/unstable, or even without a VERSION_CODENAME.

    But, obviously, third-party software doesn't always get this right, and
    will sometimes say things like "all Debian systems except testing/unstable
    have 32-bit time_t on armhf" - which happens to be true *today*, but will immediately become false when we release trixie.

    The most mistake-resistant approach would be to give
    testing some *other* code name that isn't trixie, and only give the code
    name of trixie at the time of release, but that's also weirdly different
    from how we use codenames in the archive structure

    That also breaks some of the design principles of the
    unstable -> testing -> stable flow, which are that testing should be approximately equivalent to a previous state of unstable (one where
    everything worked acceptably together), the next stable should be
    functionally equivalent to a late-freeze version of testing, and as
    little as possible should change as we cross release milestones, to
    avoid perturbing packages' behaviour.

    We don't 100% stick to those design principles, because getting all of
    unstable into a state where it works acceptably together and is ready
    to migrate is not actually feasible most of the time, so instead we
    migrate a package or a group of packages at a time - but the design goal
    is that there are no surprises when testing is updated, because every
    behaviour change has already been seen before, in unstable. So I can
    understand why Santiago is reluctant to have testing and unstable be
    obviously, identifiably different.

    I think the release team needs to be involved in the decision of how
    testing and unstable should be labelled, because it's the release team
    that is responsible for the flow of packages from unstable into testing
    and the flag-day transition from "trixie is testing" to "trixie is stable",
    and it's also the release team that would have to deal with the fallout
    if packages changed their behaviour (possibly during hard freeze!) when
    they saw /etc/os-release change from unstable to trixie.

    In other distributions like Fedora and Ubuntu, the branch that is going
    to become the next stable (Fedora rawhide, Ubuntu devel) is already
    labelled as though it *was* the next stable. The Debian equivalent of
    this would be to label testing as Debian 13, trixie, starting as soon
    as the branch opens (I often call it something like "a Debian 13 alpha"
    when I need to communicate its status to developers outside the Debian
    bubble) and I think that would be a reasonable thing to do.

    The unusual thing about Debian is that we have not one but two "future" branches, unstable and testing, together with the unstable -> testing migration, *and people actually use unstable*. In Fedora, I believe
    new packages go directly to rawhide (the Debian equivalent would be not
    having unstable, and uploading directly to testing), and the VERSION_ID
    in rawhide is the major version that the *next* Fedora release will
    have (so, yes, the Debian equivalent would be to have had VERSION_ID=13 starting from the beginning of trixie).

    In Ubuntu, they do technically have an equivalent of unstable (they call
    it "proposed"), but my understanding is that nobody outside the Ubuntu infrastructure actually runs it on their computers - the ability to
    install it on systems other than buildds isn't advertised. So if it's mis-labelled, there's no actual practical impact, because it's very
    close to their equivalent of testing, and nobody is running third-party software on it anyway. In terms of how it's used, it's more like Debian's buildd-unstable branch, used on buildds, QA/test infrastructure and
    nowhere else.

    The closest equivalent of what Fedora and Ubuntu do would be to label
    both testing and unstable as though they were some sort of Debian 13 prerelease, but not distinguish between the two. But Luca is asking for unstable images/chroots/installations to be machine-readably different,
    even if they happen to contain all of the same packages at the same
    versions (other than base-files), and I think that's because unstable
    has more users than Ubuntu proposed, and is typically further away from
    testing than the gap between Ubuntu proposed and devel.

    So I think Luca really has two distinct change requests here, not just one:

    1. Label testing as Debian 13 starting from the beginning of the trixie
    cycle, and the equivalent for each future cycle
    2. Label unstable as something that differs from testing

    and it would be technically possible to have both, or neither, or accept
    (1.) but reject (2.).

    I personally have a lot of sympathy for wanting (1.) - as I said, when
    I'm communicating with developers outside the Debian bubble who don't
    know our processes, I tend to refer to both testing and unstable as some
    sort of prerelease, alpha or preview of Debian 13, because that's close
    enough to true. I am much more hesitant about (2.), because testing and unstable are more similar than they are different, and more similar to
    each other than they are to their state 6 months ago.

    smcv
    (not a TC member)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Russ Allbery on Fri Aug 2 12:00:01 2024
    On Fri, 2 Aug 2024 at 04:00, Russ Allbery <rra@debian.org> wrote:

    Luca Boccassi <bluca@debian.org> writes:

    It could be a dependency of something else, or it could be marked as essential itself, given the content is a 5 lines text file and a symlink
    it shouldn't be too hard to figure out an acceptable way to ensure it
    ships everywhere. It doesn't have to be related to base-files at all, it was just the first thing that came to mind.

    Given that it's included in base-files now and base-files is essential, I believe it has to continue to be provided by an essential package, unless
    we want to try to do the work of figuring out if os-release can be removed from essential (and I would not be eager to do that).

    Since it is part of the essential set, though, I'm not sure the dependency from base-files is actually needed (but also it may not really matter). I think dependencies between essential packages are only really used during
    the bootstrapping phase, and presumably os-release is not needed by bootstrapping.

    Anyway, I haven't done any work in this area of Debian so I'll leave this
    for other people with more relevant expertise to comment on.

    Yeah it really has to be part of the essential set, it's just expected
    to be there in the minimalest of barest vendor trees. Priority:
    essential is probably the easiest.

    [version numbers]
    The really important part is adding different and separate codenames, so that a testing image can be reliably and univocally distinguished from a sid image, and VERSION_CODENAME is enough for that, the version number
    is cherry on top.

    Like Santiago, I admit to not finding this use case compelling. Most of
    the reasons why I might imagine someone would want to do this sound like misunderstandings of how Debian works, given that in many cases, excluding the apt configuration, today's unstable image is next week's testing image without changing a single byte on disk. In other words, in the cases
    where this does make sense, I feel like this desire is usually a proxy for "what package pool will *new* packages for this image be drawn from," and using os-release to guess at that information seems at least a bit questionable. If what someone cares about is apt configuration, it seems better to get that information from apt directly, not via a fallible proxy (and maybe we need a better way to do that).

    That's yet another Debian-specific workaround. The point of this is,
    again, answering the question "what is this vendor tree" _without_
    distro specific kludges. That's the entire reason for os-release to
    exist. If the answer at any point is "check os-release AND THEN run
    this distro specific set of scripts or binaries", then the answer is
    wrong, and the implementation of the spec is buggy. Again, one might
    say "I am ok with this being buggy because we gain X Y and Z in
    exchange", but buggy it is and buggy it will remain.
    apt might not even be installed or configured in an otherwise correct
    and minimal read-only OS tree. It's not just about your laptop or your
    server, it's about building, running, stacking and identifying many
    types of images - bare metal, virtual, container, chroot, you name it.
    Please see examples in my other email to Helmut.

    However, it doesn't seem obviously *bad* to do this either, and I trust
    that you have reasons why you think this is important.

    But this example seems a bit too tortured to me.

    Well, it's related to your example of the zoom package basing decisions on the version number. If they had done that based on a version number of testing, there's a fairly high chance that whatever decisions they made
    would be wrong by the time the stable release happens, particularly if
    they do that early in a release cycle.

    That said, I would expect most third-party non-free packages like that to
    not care at all about anything in Debian until it reached stable, so the chances of them doing that may be low.

    Uh, I did not provide an example regarding zoom? Where's that from?

    And secondly, that same strawman

    straw man (noun)

    1: a weak or imaginary opposition (such as an argument or adversary)
    set up only to be easily confuted

    This is the sort of thing I was talking about when I said insults. I'm
    not sure if you're using this term with some non-standard definition (believable, since I was using this argument in the opposite way from how
    one would use a straw man), but the normal implication of calling my
    argument a straw man is that I was arguing in bad faith. This comes
    across as weirdly aggressive and makes these discussions unnecessarily annoying.

    I admit I don't really pick up the Oxford dictionary every time I have
    to write an email, as there's not enough time in the world. I meant it
    as something like "example constructed during an argument that you
    cannot find in the real world".
    And look, I live in Scotland. When I'll actually mean to insult you,
    _you will know it_, without subtleties or hidden implications, so
    don't worry about it, ok? Hope this helps. Probably not.

    can be applied to stable, as we do point releases and security uploads.

    I am surprised that point releases don't change VERSION_ID, and now I'm curious why that's the case. I was assuming, having not previously looked
    at it, that VERSION_ID would match /etc/debian_release, but I see that it doesn't and has only the major version.

    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora
    40, or Ubuntu Noble, and so on.

    Regardless, security uploads do potentially create this problem, but we
    also try pretty hard to not change major functionality in security uploads
    in ways that may prompt someone to want to change behavior based on that version. There is a window of possibility there, I think it's
    sufficiently narrow to not worry that much about. It's at least a much narrower problem than version numbers in testing.

    See other mail. It is really not narrow at all, because of kernel
    upstream LTS updates. The upstream kernel quality of these branches is
    really, really low, and massive regressions sneak in at all times. The difference of behaviour between point releases is huge. Debian stable
    updates do not, and pretty much never have, include only security
    fixes. I do the same for systemd btw, it's not just the kernel: I
    regularly push systemd LTS updates to p-u, and it gets lots of generic
    bug fixes, and sometimes regressions do sneak in, although I like to
    delude myself into thinking it's better than the upstream kernel
    LTSes.

    I'm not sure how important this is, and all the options have obvious problems. I just know that I've seen a lot of code that uses version
    numbers or code names this way, mostly in things like Puppet rules. Most
    of the time people will probably get this right, but there are some
    obvious potential mistakes such as coding a condition that says 13 behaves the same as 12 (but the eventual release won't) or that 13 always behaves
    in some new way (but testing systems that weren't upgraded to the released version 13 don't and instead behave like 12).

    As mentioned in the other mail, the version number being present or
    not is actually a minor side issue, and it's fine either way, really.
    It's ok to add that at release time, if there are concerns about it,
    as it's not crucial to the core issue at hand, which is correctly
    identifying testing vs unstable images.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Marc Haber on Fri Aug 2 12:10:01 2024
    On Fri, 02 Aug 2024 at 10:31:29 +0200, Marc Haber wrote:
    On Thu, Aug 01, 2024 at 06:58:09PM +0100, Luca Boccassi wrote:
    I could echo "ID=windows 3.1" into my local
    /etc/os-release and nothing would stop me or fix it until the next
    stable release.

    Not even automatically. /etc/os-release is a conffile, isnt it?

    No, it's canonically a symlink to /usr/lib/os-release which is "owned"
    by the packaging system (specifically base-files.deb, although Luca's
    proposal in this thread involves moving it to another package). It's technically possible to delete the symlink, replace it with a regular
    file and edit the regular file, for example to add a VARIANT or IMAGE_ID
    - although I'm not sure how that would interact with upgrades, and in
    practice the situation where you'd be most likely to do that would be
    an image-based environment where you throw away the image and bootstrap
    a new one instead of upgrading.

    smcv

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Helmut Grohne@21:1/5 to Russ Allbery on Fri Aug 2 12:20:01 2024
    Hi Russ,

    Let me adress the essential/bootstrap aspects of this sub-discussion
    only.

    On Thu, Aug 01, 2024 at 08:00:40PM -0700, Russ Allbery wrote:
    Given that it's included in base-files now and base-files is essential, I believe it has to continue to be provided by an essential package, unless
    we want to try to do the work of figuring out if os-release can be removed from essential (and I would not be eager to do that).

    I concur.

    Since it is part of the essential set, though, I'm not sure the dependency from base-files is actually needed (but also it may not really matter). I think dependencies between essential packages are only really used during
    the bootstrapping phase, and presumably os-release is not needed by bootstrapping.

    It actually is the other way round. debootstrap-like tools will
    automatically pick up all packages marked with "Essential: yes".
    Bootstrapped systems will not magically install newly essential packages though. So doing an upload of base-files that releases /etc/os-release
    will not magically cause a newly essential os-release package to be
    installed and thus our essential promise of /etc/os-release may be
    temporarily broken. (There is no implication of how bad breaking this
    promise is.) So whenever we want to add a new package to the essential
    set, we need some existing essential package to declare a dependency on
    that new package for the duration of one release cycle (as we do not
    support skip upgrades).

    The obvious candidate to express such a dependency would be base-files
    here and that brings us back to the aspects you (Russ) mentioned earlier regarding the fragility of the bootstrap order related to base-files. Admittedly, bootstrapping is more empirically solved in Debian than well-defined. As I attempted clarifying this in Debian policy earlier,
    the outcome was to explicitly leave it undefined. If I remember
    correctly, randomly ordering the maintainer scripts executed during
    filesystem bootstrap makes things fail every now and then and the order
    that most tools produce works well enough currently. Any new dependency
    inside the essential set poses a risk of perturbing this order that
    happens to work by chance. Hence my request to validate the proposed
    changes. With luck, things just work, but we better figure out before
    we upload to unstable.

    This is not pretty, but it is what we have. And then I see this mostly
    as a work item rather than a blocking issue once we agree on the other
    matters.

    Helmut

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Simon McVittie on Fri Aug 2 12:20:02 2024
    On Fri, 2 Aug 2024 at 10:09, Simon McVittie <smcv@debian.org> wrote:

    On Thu, 01 Aug 2024 at 16:54:20 +0100, Luca Boccassi wrote:
    The second [objection from the base-files maintainer] is pushing forward a philosophical explanation according to which testing and unstable are
    not actually different images, but they are one and the same (two sides
    of the same coin is the expression used). While that might be true in a philosophical sense, this is a practical matter, and it concerns only
    the os-release specification and its implementation. In such context, testing and unstable are different and independent images, built from different and independent archives of packages. For example, at any
    point in time you can do:

    deboostrap testing /tmp/a
    deboostrap unstable /tmp/b

    and if your shell history is lost, you have no reliable, stable, distro-agnostic way to identify what exactly /tmp/a and /tmp/b are.

    But, let's continue your example: suppose you ran those commands back in January. Now, 6 months later, run similar commands again:

    debootstrap testing /tmp/c
    debootstrap unstable /tmp/d

    With your proposed labelling of testing and unstable as being fundamentally different, you would have:

    /tmp/a: testing from January, labelled as testing (or trixie or Debian 13) /tmp/b: unstable from January, labelled as unstable
    /tmp/c: testing from July, labelled as testing (or trixie or Debian 13) /tmp/d: unstable from July, labelled as unstable

    But, contrary to that, the differences between a and b will be relatively small, and so will the differences between c and d; whereas the differences between a and c will be large (even though they're both labelled as
    testing) and so will the differences between b and d.

    For example, a and b will have glibc 2.37, but c and d will have 2.39,
    with whatever behaviour changes have happened in the last 6 months. Similarly, neither a nor b has been through the t64 transition, but
    both c and d have.

    I think the most important fact about all of these chroots is
    "it's strictly newer than Debian 12, so expect some behaviour
    changes". Precisely how much newer, and precisely which behaviour changes,
    is not such a simple question to answer: it depends which package's
    behaviour you're interested in, and if you want to answer that question,
    the only way is to look at individual packages, so that you can tell
    whether they were last updated in January or whether they have been
    updated to July's version.

    If you chroot into /tmp/b after you create /tmp/d, and you update it,
    you will get content that matches /tmp/d, not /tmp/c (yes yes if you
    touched /tmp/b in some ways there will be subtle differences, and
    weird breakages might happen from time to time, but you know what I
    mean). sid remains sid, it will never be trixie, it will never become
    released with security support, then move to ELTS, and then go EOL. A particular instance might have some out of date content, but that's
    true of every OS tree in the universe, but it fundamentally doesn't
    change its identification from the point of view of os-release. The
    fact that some content might match the content of other releases
    doesn't change anything in the specific context of os-release - again
    it's fine to have a philosophical discussion on what actually
    constitutes a pipe, but this is not the purpose of this ticket - in
    fact, we have many many packages that never get rebuilt, and that are bit-by-bit identical from oldoldstable to oldstable to stable to
    testing to unstable. Does it mean that os-release in bullseye is wrong
    to identify it as bullseye and should say 'sid' instead, because some
    packages are identical and indistinguishable between the two?

    This is trying to ascribe a meaning to os-release that it really
    doesn't have, and nobody I know of uses it for. Because it doesn't
    tell you "yes this is exactly up to date at the time you are reading
    it". It tells you, "this is what this vendor tree was, at the time it
    was last updated or created", and yes, this is useful and needed
    information to convey. If you create an Archlinux or a SUSE Tumbleweed
    vendor tree now, and another one next year, they will be massively
    different. os-release will still, correctly, say the same thing.
    Because it is not a statement about updated-ness, it's a statement
    that captures the identity of a vendor tree at the point in time it
    was touched. As mentioned already in a separate mail, we actually have
    optional fields like BUILD_ID where timestamps can be added, if that
    needs to be tracked. A VERSION_CODENAME doesn't mean content will
    always be the same - it's not a reflection on every single bit of its
    content. It's the identity of the tree that matters.
    And again to bring up the same real world example from the other mail,
    if you do debootstrap bookworm in August last year, and you do that
    again in August 2026, the content will be wildly different in terms of packages, with tons of upgrades that in some cases, like the kernel,
    change the behaviour massively. But they are still both Bookworm OS
    trees from stable releases.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Simon McVittie on Fri Aug 2 12:40:02 2024
    On Fri, 2 Aug 2024 at 10:15, Simon McVittie <smcv@debian.org> wrote:
    The closest equivalent of what Fedora and Ubuntu do would be to label
    both testing and unstable as though they were some sort of Debian 13 prerelease, but not distinguish between the two. But Luca is asking for unstable images/chroots/installations to be machine-readably different,
    even if they happen to contain all of the same packages at the same
    versions (other than base-files), and I think that's because unstable
    has more users than Ubuntu proposed, and is typically further away from testing than the gap between Ubuntu proposed and devel.

    As far as I understand Ubuntu proposed is a partial pocket, like stable-proposed-updates. It doesn't have full content at all times.
    You cannot debootstrap and install oracular-proposed, you _have_ to
    include oracular. So it's correctly not identified separately and
    independently in its os-release, as it doesn't make sense to do so,
    from the point of view of the os-release specification and its purpose
    and intent. oracular-proposed will always be oracular, if you clone it
    now and update it a year on it will still fetch oracular 24.10
    content, not 25.04 <some animal codename>. Debian sid will remain
    debian sid forever, if you clone sid today and update it in 2 years
    time you will not get trixie 13.x. If you clone testing today and
    update it in 2 years time, you will get trixie 13.x. If you enable bookworm-proposed-updates on bookworm, it's still bookworm. If you
    enable experimental on sid, it's still sid.

    Testing and unstable have completely separate and independent
    archives, you can point an image builder to one OR the other, in
    isolation, and it will produce a fully complete and runnable and
    bootable OS tree. The fact that they might have some or even all
    content in common at particular points in time is orthogonal and
    unrelated to what the purpose of os-release is.

    So I think Luca really has two distinct change requests here, not just one:

    1. Label testing as Debian 13 starting from the beginning of the trixie
    cycle, and the equivalent for each future cycle
    2. Label unstable as something that differs from testing

    and it would be technically possible to have both, or neither, or accept
    (1.) but reject (2.).

    I personally have a lot of sympathy for wanting (1.) - as I said, when
    I'm communicating with developers outside the Debian bubble who don't
    know our processes, I tend to refer to both testing and unstable as some
    sort of prerelease, alpha or preview of Debian 13, because that's close enough to true. I am much more hesitant about (2.), because testing and unstable are more similar than they are different, and more similar to
    each other than they are to their state 6 months ago.

    1 is already the case, and actually I am asking to revert that. VERSION_CODENAME=trixie was added, and the problem as explained is
    that it's present in sid too. So the only identifier we have in sid,
    identifies it as trixie, which is categorically and unequivocally
    wrong.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Matthew Vernon@21:1/5 to All on Fri Aug 2 12:50:01 2024
    Hi,

    With my jaunty TC member hat on, I would prefer if issue came to us with
    a description of both sides' perspective on the discussion that they
    would view as fair. In any case, I hope that Santiago will feel able to
    chime in with their perspective.

    My initial thought is that this is really about whether the base-files maintainer is correct to have decided that os-release for testing and
    unstable should not provide VERSION nor VERSION_ID; that seems to me the technical policy question, and whether os-release moves into a new
    package or not is an implementation detail that flows from that decision?

    I think the base-files maintainer's position is that testing and
    unstable do not have a version, and that testing gets a version towards
    the end of the release cycle (in closing #659853 they say "like /etc/debian_version, this file should only be considered meaningful for
    stable releases"). They assert that the release team supports this
    approach (and I've not seen any suggestion to the contrary).

    I note that the os-release spec says "Note that operating system vendors
    may choose not to provide version information, for example to
    accommodate for rolling releases. In this case, VERSION and VERSION_ID
    may be unset. Applications should not rely on these fields to be set."

    I think the submitter's contention against that is that in fact people
    do want to be able to differentiate between testing and unstable. I
    think they would go further and say that people want to be able to do
    this without doing anything more involved than inspecting
    /etc/os-release and that Debian should support them in so doing.

    Is that a broadly fair summary?

    Regards,

    Matthew

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Matthew Vernon on Fri Aug 2 13:10:01 2024
    On Fri, 2 Aug 2024 at 11:39, Matthew Vernon <matthew@debian.org> wrote:

    Hi,

    With my jaunty TC member hat on, I would prefer if issue came to us with
    a description of both sides' perspective on the discussion that they
    would view as fair. In any case, I hope that Santiago will feel able to
    chime in with their perspective.

    In case that doesn't happen, for reference, his position is
    articulated in https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1021663#55
    and the other linked bugs.

    My initial thought is that this is really about whether the base-files maintainer is correct to have decided that os-release for testing and unstable should not provide VERSION nor VERSION_ID; that seems to me the technical policy question, and whether os-release moves into a new
    package or not is an implementation detail that flows from that decision?

    Almost, but not quite - as mentioned in other emails it's actually
    fine to omit VERSION/VERSION_ID until release time. The main vector to
    do this distinction is VERSION_CODENAME which is currently set to
    'trixie' in both trixie and sid. I am asking the CTTE to rule that
    testing and unstable must have different VERSION_CODENAME fields in
    their respective os-release files, that is to say "trixie" and "sid" respectively.

    It is correct to say that "sid does not have a version", just like
    Arch or Tumbleweed, so that is not a contentious point. It is
    acceptable to me to say "trixie does not have a version until release
    day", although I would prefer it did, because it is sufficient to have VERSION_CODENAME being different for the purpose of this ticket.

    Please note that older bugs against base-files mention version numbers
    because VERSION_CODENAME is a later addition to the spec, it appeared
    in 2016, so VERSION_ID used to be the only way to tell the difference
    between releases programmatically, so naturally users reporting bugs
    about being impossible to distinguish testing vs unstable asked for
    that to be added. It's no longer the case today, so this request is
    _not_ about overriding the decision to omit VERSION_ID until release
    date.

    I think the submitter's contention against that is that in fact people
    do want to be able to differentiate between testing and unstable. I
    think they would go further and say that people want to be able to do
    this without doing anything more involved than inspecting
    /etc/os-release and that Debian should support them in so doing.

    Yes, this is correct, minus the part about the specific field numeric
    versions, which is more of a "nice to have" but can still be omitted
    if, e.g., RT prefers doing so.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Luca Boccassi on Fri Aug 2 14:10:01 2024
    On Fri, 02 Aug 2024 at 12:19:20 +0100, Luca Boccassi wrote:
    To further clarify why the status quo with VERSION_CODENAME=trixie in
    sid is really bad: it used to be that if you had "debian" mentioned in os-release but no other version identifying fields, you knew you were
    on testing OR unstable and you'd have to deploy horrendous hacks to
    attempt and figure out which of the two it was really.

    OK, I think this is progress:

    What is the scenario / use-case in which it becomes necessary to
    distinguish between those two suites?

    To put that another way, what external piece of software needs to
    change its behaviour, dependent on whether you are running testing
    (of an unspecified datestamp) or unstable (of an unspecified datestamp)?

    Or perhaps you are thinking of a scenario in which a *person* needs to
    change their behaviour, dependent on whether they are running testing
    or unstable?

    Sorry, but there's no other way to define this than a bug.

    I would personally characterize it as a potential root cause for bugs,
    more than as a bug itself. To me, an example of one of those bugs might
    look more like "I run ansible/Puppet/etc. against my test VM, and I
    expect it to do a useful thing, but actually it..." (with the buggy result perhaps being to crash, or to install the wrong package, or something).

    smcv

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Luca Boccassi on Fri Aug 2 14:00:01 2024
    On Fri, 02 Aug 2024 at 11:35:54 +0100, Luca Boccassi wrote:
    VERSION_CODENAME=trixie was added, and the problem as explained is
    that it's present in sid too. So the only identifier we have in sid, identifies it as trixie, which is categorically and unequivocally
    wrong.

    When involved in a disagreement, please could you try to make an effort
    to understand the point of view of the other side, rather than declaring
    them to be categorically and unequivocally wrong? I think that would
    lead to fewer people feeling that they're being shouted at and refusing
    to engage with you, which is likely to result in more of the changes
    you want to see actually being adopted.

    Dismissing the other side's point of view as "just wrong" is a pattern
    that I keep seeing in Debian, from multiple people, and frankly it's exhausting. Even when I completely agree with you about the technical
    content of what you're saying, it makes every disagreement into an
    unpleasant interaction that drains my energy and motivation, and I know
    that I'm not the only DD who is put off by the way relatively minor disagreements escalate.

    Normally when there's a non-obvious technical decision to be made,
    "both sides" have a valid design principle that they're trying to follow,
    and the essence of the decision is a value-judgement about which of the
    two contradictory design principles is more important than the other
    one (better cost/benefit ratio, defining cost as broadly as possible).
    These are decisions that we need to make, but they shouldn't be a fight: sometimes we have to agree to disagree, and sometimes we have to accept
    that our reasons to want option A are outweighed by someone else's
    reasons to want option B.

    In this case, I think the two design principles might be:

    - you think of sid as an independent rolling-release distribution in
    its own right, an alternative to e.g. Arch Linux, and so you want to
    label sid images/containers/chroots/etc. in a way that is consistent
    with that point of view;

    - Santiago thinks of sid as a tool to be used as part of the process of
    making our next stable release, an alternative to e.g. Fedora Rawhide,
    and wants to label sid images/etc. in a way that is consistent with
    *that* point of view

    and each of you is arguing in favour of the metadata that makes most
    sense when you start from that point of view?

    Of course, the real answer to "is sid a rolling release distribution or
    is it a tool for making the next stable?" is "yes", so neither of those
    points of view is completely wrong, but neither of them is the whole
    story either.

    I think that, as a project, we need a lot more willingness to frame disagreements in terms of "I see your point, but I think my point is
    more important", and a lot less "you're just wrong". All of us are
    doing our best to make Debian the best possible Free operating system,
    even if we don't always agree on precisely what that means.

    smcv
    not a TC member

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Luca Boccassi on Fri Aug 2 13:30:01 2024
    On Fri, 2 Aug 2024 at 11:35, Luca Boccassi <bluca@debian.org> wrote:

    On Fri, 2 Aug 2024 at 10:15, Simon McVittie <smcv@debian.org> wrote:
    So I think Luca really has two distinct change requests here, not just one:

    1. Label testing as Debian 13 starting from the beginning of the trixie
    cycle, and the equivalent for each future cycle
    2. Label unstable as something that differs from testing

    and it would be technically possible to have both, or neither, or accept (1.) but reject (2.).

    I personally have a lot of sympathy for wanting (1.) - as I said, when
    I'm communicating with developers outside the Debian bubble who don't
    know our processes, I tend to refer to both testing and unstable as some sort of prerelease, alpha or preview of Debian 13, because that's close enough to true. I am much more hesitant about (2.), because testing and unstable are more similar than they are different, and more similar to
    each other than they are to their state 6 months ago.

    1 is already the case, and actually I am asking to revert that. VERSION_CODENAME=trixie was added, and the problem as explained is
    that it's present in sid too. So the only identifier we have in sid, identifies it as trixie, which is categorically and unequivocally
    wrong.

    To further clarify why the status quo with VERSION_CODENAME=trixie in
    sid is really bad: it used to be that if you had "debian" mentioned in os-release but no other version identifying fields, you knew you were
    on testing OR unstable and you'd have to deploy horrendous hacks to
    attempt and figure out which of the two it was really. But if you had VERSION_CODENAME, you could just use that, full stop, and everything
    was sane.

    Now all these hacks have to be further hacked, and you have to check
    if you are on Debian, and if you have VERSION_CODENAME, and if you do
    _not_ have VERSION_ID _then_ you have to discard VERSION_CODENAME,
    completely ignore it, and then run the previous hacks.

    Sorry, but there's no other way to define this than a bug. Well, there
    are many more I could mention, but then Russ would whip out the cane
    ;-)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Simon McVittie on Fri Aug 2 15:10:02 2024
    On Fri, 2 Aug 2024 at 12:48, Simon McVittie <smcv@debian.org> wrote:

    On Fri, 02 Aug 2024 at 11:35:54 +0100, Luca Boccassi wrote:
    VERSION_CODENAME=trixie was added, and the problem as explained is
    that it's present in sid too. So the only identifier we have in sid, identifies it as trixie, which is categorically and unequivocally
    wrong.

    When involved in a disagreement, please could you try to make an effort
    to understand the point of view of the other side, rather than declaring
    them to be categorically and unequivocally wrong? I think that would
    lead to fewer people feeling that they're being shouted at and refusing
    to engage with you, which is likely to result in more of the changes
    you want to see actually being adopted.

    Some things are viewpoints, and then there are such things as facts.
    As mentioned in another mail, one is of course allowed to say "it is
    fine if the os-release implementation in debian is buggy". One can say
    "the severity of this bug is nil". One can say "it is better if the
    bug is not solved". One doesn't even have to state a reason for such a
    belief, and it's perfectly valid nonetheless. That's a viewpoint.
    It is not a "viewpoint" to say "the os-release implementation in
    debian is not buggy", because it's not a competing opinion or design
    choice, it's denying a fact that exists independently of opinions, for
    reasons already explained at length, that I am not going to repeat yet
    again. One can disagree on the severity of the bug and think it is
    nil, one can disagree on whether it should be fixed or how. It is
    still a bug. Why is it a problem to define it as such? Why is saying
    "the spec says A, this does B, therefore it's a bug" equivalent to
    "shouting" or "insulting"? If this was a running program and it
    checked the state according to the spec and assert on it, it would
    crash. Whether one holds the view that it would be right or wrong to
    crash, it would still crash, and there's no point in denying it would,
    and I don't see how it helps with resolving anything or making any
    progress.

    In this case, I think the two design principles might be:

    - you think of sid as an independent rolling-release distribution in
    its own right, an alternative to e.g. Arch Linux, and so you want to
    label sid images/containers/chroots/etc. in a way that is consistent
    with that point of view;

    I don't think that's accurate. It's not an opinion that one can run "debootstrap sid", install it, run it, and never ever reach any point
    in time where that is a stable, security supported os vendor tree that
    will go EOL and have a version+1. This is a fact. We know for a fact
    that this happens, today, yesterday and tomorrow, in the real world.
    It is also a fact that due to this, the os-release specification
    mandates certain things to be defined in its metadata, that are
    currently not done today, and that some that are done, shouldn't.

    It is an opinion that I think this should be fixed, and it is also an
    opinion that fixing it is more important than other competing
    concerns. It is an opinion to say that it is better to leave it as-is.

    - Santiago thinks of sid as a tool to be used as part of the process of
    making our next stable release, an alternative to e.g. Fedora Rawhide,
    and wants to label sid images/etc. in a way that is consistent with
    *that* point of view

    That's not an opinion either. It is a fact that sid is a tool used to
    develop the next stable release. I recognize that fact, and I do not
    want to change it.

    My understanding is that Santiago's opinion is that fact is a reason
    enough to avoid fixing the above issue, because labeling is
    incompatible with <something that I do not quite understand to be
    perfectly honest>, and because sid and trixie must remain
    undistinguishable because they are the same thing. It is my opinion
    that labeling does not impede on the goal of sid being a tool to
    develop the next stable release, and it is a fact that the os-release specification is not incompatible with this situation, and it is my
    opinion that we should change this implementation, and it is my
    opinion that it would not negatively affect sid's purpose and role in
    our development model, and it is my opinion that trixie and sid should
    be distinguishable, and it is a fact that trixie and sid being
    distinguishable would fix a bug in the os-release implementation.

    I think that, as a project, we need a lot more willingness to frame disagreements in terms of "I see your point, but I think my point is
    more important", and a lot less "you're just wrong". All of us are
    doing our best to make Debian the best possible Free operating system,
    even if we don't always agree on precisely what that means.

    I don't see saying "this is a bug" as "I don't see your point" or "you
    are just wrong". I see it as stating a fact. This is my opinion on it
    being a fact and not an opinio... ok I am getting entangled now. The
    point of saying "this is a bug" is to clarify what is an opinion and
    what isn't, without having to pedantically pre-label everything as I
    have just done in this frankly unreadable reply. The purpose is to
    establish facts, and then argue about severity and solutions and their
    merits or lack thereof.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Simon McVittie on Fri Aug 2 15:40:02 2024
    On Fri, 2 Aug 2024 at 13:00, Simon McVittie <smcv@debian.org> wrote:

    On Fri, 02 Aug 2024 at 12:19:20 +0100, Luca Boccassi wrote:
    To further clarify why the status quo with VERSION_CODENAME=trixie in
    sid is really bad: it used to be that if you had "debian" mentioned in os-release but no other version identifying fields, you knew you were
    on testing OR unstable and you'd have to deploy horrendous hacks to
    attempt and figure out which of the two it was really.

    OK, I think this is progress:

    What is the scenario / use-case in which it becomes necessary to
    distinguish between those two suites?

    To put that another way, what external piece of software needs to
    change its behaviour, dependent on whether you are running testing
    (of an unspecified datestamp) or unstable (of an unspecified datestamp)?

    Or perhaps you are thinking of a scenario in which a *person* needs to
    change their behaviour, dependent on whether they are running testing
    or unstable?

    Are the examples I provided at:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#43 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#5

    enough to answer this question? (I'm trying to avoid copy/pasting the
    same stuff multiple times in an already long and probably-going-to-be-even-longer thread)

    Sorry, but there's no other way to define this than a bug.

    I would personally characterize it as a potential root cause for bugs,
    more than as a bug itself. To me, an example of one of those bugs might
    look more like "I run ansible/Puppet/etc. against my test VM, and I
    expect it to do a useful thing, but actually it..." (with the buggy result perhaps being to crash, or to install the wrong package, or something).

    It's not running code, but we consider mistakes in documentation bugs
    too, and treat them as such in our tools and processes. A wrong
    implementation of a specification, that results in wrong text being
    published, should still qualify as a bug given precedents, even if
    it's not in itself running code. It might or might not cause other
    bugs/bad behaviour, but that should be orthogonal.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to All on Fri Aug 2 17:30:01 2024
    On Fri, 2 Aug 2024 08:22:55 +0200 Helmut Grohne <helmut@subdivi.de>
    wrote:
    Hi Russ,

    Let me adress the essential/bootstrap aspects of this sub-discussion
    only.

    On Thu, Aug 01, 2024 at 08:00:40PM -0700, Russ Allbery wrote:
    Given that it's included in base-files now and base-files is
    essential, I
    believe it has to continue to be provided by an essential package,
    unless
    we want to try to do the work of figuring out if os-release can be
    removed
    from essential (and I would not be eager to do that).

    I concur.

    Since it is part of the essential set, though, I'm not sure the
    dependency
    from base-files is actually needed (but also it may not really
    matter).  I
    think dependencies between essential packages are only really used
    during
    the bootstrapping phase, and presumably os-release is not needed by bootstrapping.

    It actually is the other way round. debootstrap-like tools will
    automatically pick up all packages marked with "Essential: yes".
    Bootstrapped systems will not magically install newly essential
    packages
    though. So doing an upload of base-files that releases /etc/os-
    release
    will not magically cause a newly essential os-release package to be
    installed and thus our essential promise of /etc/os-release may be temporarily broken. (There is no implication of how bad breaking this
    promise is.) So whenever we want to add a new package to the
    essential
    set, we need some existing essential package to declare a dependency
    on
    that new package for the duration of one release cycle (as we do not
    support skip upgrades).

    The obvious candidate to express such a dependency would be base-
    files
    here and that brings us back to the aspects you (Russ) mentioned
    earlier
    regarding the fragility of the bootstrap order related to base-files. Admittedly, bootstrapping is more empirically solved in Debian than well-defined. As I attempted clarifying this in Debian policy
    earlier,
    the outcome was to explicitly leave it undefined. If I remember
    correctly, randomly ordering the maintainer scripts executed during filesystem bootstrap makes things fail every now and then and the
    order
    that most tools produce works well enough currently.  Any new
    dependency
    inside the essential set poses a risk of perturbing this order that
    happens to work by chance. Hence my request to validate the proposed changes.  With luck, things just work, but we better figure out
    before
    we upload to unstable.

    This is not pretty, but it is what we have. And then I see this
    mostly
    as a work item rather than a blocking issue once we agree on the
    other
    matters.

    Validating is of course necessary. If the worry is around changing the dependencies of base-files, I would be happy to carry the dependency on
    a new os-release binary package in init-system-helpers, which is
    already Essential: yes. I already did something similar in Bookworm to
    force all installations to become usrmerged, and I do not recall issues
    with the bootstrapping order. This would be even easier in practice as
    the new package would have a single file, no maintainer scripts, no dependencies and no build dependencies. Would that solve your concerns?

    --
    Kind regards,
    Luca Boccassi

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEErCSqx93EIPGOymuRKGv37813JB4FAmas+JcACgkQKGv37813 JB4fQA//R5dzAu7igyEI21yvSGZC7RRwpOiK5iRuc2sfaK9Jy3x5f8T4QTT3bPv1 zzvkRABS6GEfkpN8alX/X8TzVevwpvpU/m5QPaEJl6lCY897ADGULAzCxDpxBs+V YfcZBOfdsW2O14mAXZQod9OOfTBax9rI0gsO5qcZogXrLb6l6egAkkbzGXr0+t+b kJ/HnTybEnuN3qq+a32Q31UhGggkla7wjmquYLRx14HeDbLoFgJsU1UeGZw65MtG Exyknwp6GiyuwKK8iZ4pVfKLYTKLvyyYntVEDG0y06UIBluBqfnJ5zUys11cAsij KlGWzWtIR0RpIesM2EoTFgQmjJDsl6+RgAhYo6988qSgDClcyalJquPj0mtx3ipJ WWdIPXBkVEcq9Af8TLsARfUBALX6GgtwJCiuKnGSItjy8ywQDiiNdkgEOfaUV46z xwkgiPROW3ZvLtopsjdgTxGRoRWufbDF9yCCk2RZypOHiKvwd5bVHleBwEW1bDsY mQF2B0jM2cvkjZAOU+sRPu0M5+1CqbL/DXQ41UiVJ/x8/eQVG/2HX5OwqZyQCKkB MFSA6l+Ry+Wp2uMG7Lb84rjnuSbq4jjOq+dTy/re4IV4q5qOJynPjw6m+L/mOEZv /0ZzZuKU8fMi9JXQ6TBsqzCoBa6NiMuO9C0CeEGavWAr7w91VgA=
    =IWtR
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Russ Allbery@21:1/5 to Luca Boccassi on Fri Aug 2 18:10:01 2024
    Luca Boccassi <bluca@debian.org> writes:

    That's yet another Debian-specific workaround. The point of this is,
    again, answering the question "what is this vendor tree" _without_
    distro specific kludges. That's the entire reason for os-release to
    exist. If the answer at any point is "check os-release AND THEN run this distro specific set of scripts or binaries", then the answer is wrong,
    and the implementation of the spec is buggy. Again, one might say "I am
    ok with this being buggy because we gain X Y and Z in exchange", but
    buggy it is and buggy it will remain.

    This talk about "buggy" and "workarounds" didn't help me understand what
    you meant, but I think what you're saying is that I'm right, you *do* only
    care about the apt configuration, BUT apt is Debian-specific and figuring
    out how it is configured is not something that can be done portably, so
    you do want to use os-release as a proxy for that information because it's
    a cross-distro tool.

    That makes sense to me. It's a fallible proxy and it will get a bunch of
    edge cases wrong, but it's probably not possible to do better with an equivalently simple tool.

    Fundamentally, you want to change Debian's policy about testing to
    complete the separation from unstable and treat it as a first-class
    release in its own right in our metadata. Debian has historically not
    done this and generally discouraged people from doing this (this is *not*
    just Santiago's position; Santiago is correctly reflecting the previous consensus of the project), but there's always been a fair bit of
    controversy over that point, and I personally tend towards the side that
    thinks testing can be usefully treated as a rolling release with very substantial caveats and limitations.

    I do agree that it's often useful to be able to quickly determine if an
    image is pointing to testing or to unstable.

    On Fri, 2 Aug 2024 at 04:00, Russ Allbery <rra@debian.org> wrote:

    Well, it's related to your example of the zoom package basing decisions
    on the version number. If they had done that based on a version number
    of testing, there's a fairly high chance that whatever decisions they
    made would be wrong by the time the stable release happens,
    particularly if they do that early in a release cycle.

    That said, I would expect most third-party non-free packages like that
    to not care at all about anything in Debian until it reached stable, so
    the chances of them doing that may be low.

    Uh, I did not provide an example regarding zoom? Where's that from?

    Ugh, I'm sorry, I was reading a lot of bug history and completely
    misattributed that message (and, for that matter, when it was sent). I
    was thinking of:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1008735#91

    which was from Kipp Cannon. My apologies for the confusion.

    I am surprised that point releases don't change VERSION_ID, and now I'm
    curious why that's the case. I was assuming, having not previously
    looked at it, that VERSION_ID would match /etc/debian_release, but I
    see that it doesn't and has only the major version.

    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora
    40, or Ubuntu Noble, and so on.

    Why would you not want to identify point releases? This really surprises
    me.

    Regardless, security uploads do potentially create this problem, but we
    also try pretty hard to not change major functionality in security
    uploads in ways that may prompt someone to want to change behavior
    based on that version. There is a window of possibility there, I think
    it's sufficiently narrow to not worry that much about. It's at least a
    much narrower problem than version numbers in testing.

    See other mail. It is really not narrow at all, because of kernel
    upstream LTS updates. The upstream kernel quality of these branches is really, really low, and massive regressions sneak in at all times. The difference of behaviour between point releases is huge.

    I believe kernels are usually (not always, but usually) updated as part of point releases, which is yet another reason why I am so baffled as to why
    the VERSION_ID would not track point releases.

    Debian stable updates do not, and pretty much never have, include only security fixes.

    Exactly, which is why they should result in a VERSION_ID bump.

    --
    Russ Allbery (rra@debian.org) <https://www.eyrie.org/~eagle/>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon McVittie@21:1/5 to Russ Allbery on Fri Aug 2 18:50:01 2024
    On Fri, 02 Aug 2024 at 09:07:12 -0700, Russ Allbery wrote:
    Luca Boccassi <bluca@debian.org> writes:
    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora
    40, or Ubuntu Noble, and so on.

    Why would you not want to identify point releases? This really surprises
    me.

    I think the idea is that two releases have a different VERSION_ID if and
    only if they can both be fully up to date, but still remain different. If
    we make the analogy of git, VERSION_ID labels a branch, not a tag.

    If Debian 12 is like a git branch (and unstable is like git main),
    then Debian 12.0 and 12.6 are more like tags on the Debian 12 branch.
    Debian 12 is still maintained and changing, but Debian 12.6 was a point
    in time, it already happened, and now it's never going to change.

    So, 11 vs. 12 vs. 13 are different VERSION_IDs, because a fully updated
    Debian 11 is not the same as a fully updated Debian 12 or 13.

    But 12.5 vs. 12.6 don't have different VERSION_IDs, because if you upgrade Debian 12.5, it *becomes* 12.6: there is no separate 12.5.x branch that
    anyone is maintaining as something distinct from 12.6.

    (It might make sense for there to be a defined field in os-release for
    "what's the most recent point release we've caught up with?" *as well*,
    but VERSION_ID is not that.)

    smcv

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Russ Allbery on Fri Aug 2 18:50:02 2024
    On Fri, 2 Aug 2024 at 17:07, Russ Allbery <rra@debian.org> wrote:

    Luca Boccassi <bluca@debian.org> writes:

    That's yet another Debian-specific workaround. The point of this is,
    again, answering the question "what is this vendor tree" _without_
    distro specific kludges. That's the entire reason for os-release to
    exist. If the answer at any point is "check os-release AND THEN run this distro specific set of scripts or binaries", then the answer is wrong,
    and the implementation of the spec is buggy. Again, one might say "I am
    ok with this being buggy because we gain X Y and Z in exchange", but
    buggy it is and buggy it will remain.

    This talk about "buggy" and "workarounds" didn't help me understand what
    you meant, but I think what you're saying is that I'm right, you *do* only care about the apt configuration, BUT apt is Debian-specific and figuring
    out how it is configured is not something that can be done portably, so
    you do want to use os-release as a proxy for that information because it's
    a cross-distro tool.

    That makes sense to me. It's a fallible proxy and it will get a bunch of edge cases wrong, but it's probably not possible to do better with an equivalently simple tool.

    Right, but one important correction though - it's not _only_ apt, it's
    _also_ apt. Apt is one of the common issues, yes, but it's not the
    only one. It is entirely valid to create an OS vendor tree without apt
    or its configuration, for a minimal read-only image deployment for a
    VM or a container, that you update with an image-based tool with A/B
    style partitioning, for example. How do you identify such a vendor
    tree? There's no apt. The answer on every other distro is: read usr/lib/os-release. In Debian it's: read os-release and pray the old
    gods and the new that it returns something identifiable, and otherwise
    just despair and take a wild guess.

    Fundamentally, you want to change Debian's policy about testing to
    complete the separation from unstable and treat it as a first-class
    release in its own right in our metadata. Debian has historically not
    done this and generally discouraged people from doing this (this is *not* just Santiago's position; Santiago is correctly reflecting the previous consensus of the project), but there's always been a fair bit of
    controversy over that point, and I personally tend towards the side that thinks testing can be usefully treated as a rolling release with very substantial caveats and limitations.

    I do agree that it's often useful to be able to quickly determine if an
    image is pointing to testing or to unstable.

    I see what you are saying, but I have to say that expressing it like
    that makes it sound like I am asking to flip the thing on its head
    completely, and do something new and unprecedented, but I'm really
    not? I am asking to add one line to a text file. I'm not asking to
    change a policy. Nothing else will change - all workflows, all usages,
    all intentions, all procedures, all tools, everything will be exactly
    the same before and after. Because you can already, today, build and
    install a testing image, run it, update it, manage it, use it for
    workloads, and never, ever get even a hint that something called
    "unstable" even exists. We know this happens, and it always has
    happened, and it will continue to happen. And the same is true for
    unstable. They each have their own section of the archive, which are independent from each other and fully complete on their own (as
    opposed to other things already mentioned like ubuntu-proposed or
    experimental or stable-proposed-updates). You can do 'debootstrap
    unstable' build an image and run it, you can do 'debootstrap trixie'
    build an image and run it, and you were always able to do so. So, I
    don't know, it seems excessive and scary to say it's a change in
    policy? No policy changes here, no?

    On Fri, 2 Aug 2024 at 04:00, Russ Allbery <rra@debian.org> wrote:

    Well, it's related to your example of the zoom package basing decisions
    on the version number. If they had done that based on a version number
    of testing, there's a fairly high chance that whatever decisions they
    made would be wrong by the time the stable release happens,
    particularly if they do that early in a release cycle.

    That said, I would expect most third-party non-free packages like that
    to not care at all about anything in Debian until it reached stable, so
    the chances of them doing that may be low.

    Uh, I did not provide an example regarding zoom? Where's that from?

    Ugh, I'm sorry, I was reading a lot of bug history and completely misattributed that message (and, for that matter, when it was sent). I
    was thinking of:

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1008735#91

    which was from Kipp Cannon. My apologies for the confusion.

    Right, I can see things like that happening - that's both a symptom of
    a bug in zoom and a bug in Debian. It's a bug in zoom because
    VERSION_ID is not mandatory, and a rolling release like Archlinux
    won't have it. It's a bug in Debian because it shows that external
    developers are (rightly, in my view) less and less willing to cater to
    special snowflakes, and will use distro-agnostic tools and
    specifications every time they are available, and we are falling
    behind. The answer to a user reporting such an issue won't be "sure we
    will add Debian-specific workarounds" it will be "run a supported
    distribution, not Debian"

    I am surprised that point releases don't change VERSION_ID, and now I'm
    curious why that's the case. I was assuming, having not previously
    looked at it, that VERSION_ID would match /etc/debian_release, but I
    see that it doesn't and has only the major version.

    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora
    40, or Ubuntu Noble, and so on.

    Why would you not want to identify point releases? This really surprises
    me.

    It's fine to identify point releases. It's not what VERSION_ID is for,
    though, that's all I am saying. If you want to propose that a full
    version is included in Debian's os-release, that's fine! The spec
    intentionally allow any namespaced fields to be added by a vendor, so
    we could have something like DEBIAN_VERSION_FULL_ID=12.3 or something
    like that, if you think it's important to do so - I don't see any
    problem with it and I'd be happy to add it if the CTTE rules in my
    favour.

    Regardless, security uploads do potentially create this problem, but we
    also try pretty hard to not change major functionality in security
    uploads in ways that may prompt someone to want to change behavior
    based on that version. There is a window of possibility there, I think
    it's sufficiently narrow to not worry that much about. It's at least a
    much narrower problem than version numbers in testing.

    See other mail. It is really not narrow at all, because of kernel
    upstream LTS updates. The upstream kernel quality of these branches is really, really low, and massive regressions sneak in at all times. The difference of behaviour between point releases is huge.

    I believe kernels are usually (not always, but usually) updated as part of point releases, which is yet another reason why I am so baffled as to why
    the VERSION_ID would not track point releases.

    They are updated via security too. This will happen more and more with
    the CNA change where they basically tag every commit with a CVE.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Russ Allbery@21:1/5 to Simon McVittie on Fri Aug 2 19:10:01 2024
    Simon McVittie <smcv@debian.org> writes:
    On Fri, 02 Aug 2024 at 09:07:12 -0700, Russ Allbery wrote:
    Luca Boccassi <bluca@debian.org> writes:

    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora
    40, or Ubuntu Noble, and so on.

    Why would you not want to identify point releases? This really
    surprises me.

    I think the idea is that two releases have a different VERSION_ID if and
    only if they can both be fully up to date, but still remain
    different. If we make the analogy of git, VERSION_ID labels a branch,
    not a tag.

    Oh, thank you, this was not at all obvious to me. If this is indeed the
    case, that would be a useful clarification to add to the specification.

    This also explains the desire to identify testing as trixie, but not
    identify unstable as trixie. If one configures a testing system to point
    to trixie, then fully updating it will move it into the stable release
    when the stable release comes out. However, if one points a system at unstable, that system will never become a trixie system and will always continue to point to a different release.

    This is not an entirely clean analogy, since it's also possible to point a system at the testing suite directly, rather than using the code name, in
    which case that system will also never become trixie. So in that sense
    testing is simultaneously both trixie and not trixie depending on exactly
    how you configure apt.

    This sort of ambiguity is, I think, part of why this proposal generates so
    much discussion. Debian simply doesn't currently have clean semantics for testing. It exists in a sort of quantum superposition where it is
    multiple things simultaneously for different people, and this proposal is trying to label it in a way that collapses that state to match the mental
    model of one group of people, invalidating the mental model of a different group of people.

    --
    Russ Allbery (rra@debian.org) <https://www.eyrie.org/~eagle/>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Russ Allbery on Fri Aug 2 20:00:01 2024
    On Fri, 2 Aug 2024 at 18:01, Russ Allbery <rra@debian.org> wrote:

    Simon McVittie <smcv@debian.org> writes:
    On Fri, 02 Aug 2024 at 09:07:12 -0700, Russ Allbery wrote:
    Luca Boccassi <bluca@debian.org> writes:

    It is correct as-is. VERSION_ID is meant to identify a release, not
    updates or point releases. A release as in, Debian Bookworm, or Fedora >>> 40, or Ubuntu Noble, and so on.

    Why would you not want to identify point releases? This really
    surprises me.

    I think the idea is that two releases have a different VERSION_ID if and only if they can both be fully up to date, but still remain
    different. If we make the analogy of git, VERSION_ID labels a branch,
    not a tag.

    Oh, thank you, this was not at all obvious to me. If this is indeed the case, that would be a useful clarification to add to the specification.

    This also explains the desire to identify testing as trixie, but not
    identify unstable as trixie. If one configures a testing system to point
    to trixie, then fully updating it will move it into the stable release
    when the stable release comes out. However, if one points a system at unstable, that system will never become a trixie system and will always continue to point to a different release.

    This is not an entirely clean analogy, since it's also possible to point a system at the testing suite directly, rather than using the code name, in which case that system will also never become trixie. So in that sense testing is simultaneously both trixie and not trixie depending on exactly
    how you configure apt.

    This sort of ambiguity is, I think, part of why this proposal generates so much discussion. Debian simply doesn't currently have clean semantics for testing. It exists in a sort of quantum superposition where it is
    multiple things simultaneously for different people, and this proposal is trying to label it in a way that collapses that state to match the mental model of one group of people, invalidating the mental model of a different group of people.

    If you instantiate it as 'testing', using that keyword through your configuration, including apt, then it will be updated to the next
    version when that is created in the archive. So it is still trixie
    today, and tomorrow it will be forky, and everything, including the
    os-release file, will be updated accordingly with my proposal.

    From the point of view of the os-release specification, this is
    exactly the same as using 'stable' to build and manage an image. Today
    that is bookworm, yesterday it was buster, tomorrow it will be trixie.
    It is still correct that today os-release says it's bookworm. Once it
    is upgraded, the os-release will be upgraded too and say 'trixie'
    because that's released and that's what the 'stable' alias points to.
    It's the same installation, and it gets upgraded to a new release -
    that's entirely supported by the os-release spec. That's the same if
    you are tracking 'testing'. And that is why in my very first mail at
    the top of this bug, I said that testing is _not_ a rolling release,
    because there's a -1 and a +1 and it has a limited lifespan. Support
    status is different than stable, but there are other fields to
    indicate that, and again it applies just as well to oldoldoldstable.

    So again, while I see why there could be different points of views and
    some confusion around what means what, my view is that this proposal
    doesn't really introduce anything new, and doesn't change anything
    that happens today in any fundamental way. As already mentioned, I do
    not see anything fundamentally incompatible between the os-release
    concept and the unstable or testing concepts as they are today,
    whether they are considered with their codenames or the aliases.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Sam Hartman@21:1/5 to All on Fri Aug 2 22:10:01 2024
    "Luca" == Luca Boccassi <bluca@debian.org> writes:

    Luca> On Fri, 2 Aug 2024 at 13:00, Simon McVittie <smcv@debian.org> wrote:
    >>
    >> On Fri, 02 Aug 2024 at 12:19:20 +0100, Luca Boccassi wrote:
    >> > To further clarify why the status quo with
    >> VERSION_CODENAME=trixie in > sid is really bad: it used to be
    >> that if you had "debian" mentioned in > os-release but no other
    >> version identifying fields, you knew you were > on testing OR
    >> unstable and you'd have to deploy horrendous hacks to > attempt
    >> and figure out which of the two it was really.
    >>
    >> OK, I think this is progress:
    >>
    >> What is the scenario / use-case in which it becomes necessary to
    >> distinguish between those two suites?
    >>
    >> To put that another way, what external piece of software needs to
    >> change its behaviour, dependent on whether you are running
    >> testing (of an unspecified datestamp) or unstable (of an
    >> unspecified datestamp)?
    >>
    >> Or perhaps you are thinking of a scenario in which a *person*
    >> needs to change their behaviour, dependent on whether they are
    >> running testing or unstable?

    Luca> Are the examples I provided at:

    Luca> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#43
    Luca> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#5

    Not to me.
    I read what I think is the examples you linked from both bug reports.
    I didn't dig too far into the github links you provided though.
    What I see from your mail is that people want to distinguish unstable
    from testing and have created various hacks to do so.

    What I do not see is a compelling explanation of why Debian as a project
    wants to encourage that distinction.
    I agree that people doing a thing is evidence that it has value to those people.
    But I do not think you provided an explanation of what that value is.

    If it were easy to distinguish testing from unstable, why would I want
    to do that?

    --Sam

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Helmut Grohne@21:1/5 to Luca Boccassi on Fri Aug 2 22:40:01 2024
    Hi Luca,

    On Fri, Aug 02, 2024 at 01:43:04AM +0100, Luca Boccassi wrote:
    1) The os-release specification must be adhered to, and it must be
    possible to tell the difference between testing vs unstable, and each
    must be correctly identified by the respective metadata

    Given the state of discussion, I think it is fairly evident that we do
    not have consensus for the need to distinguish testing and unstable. We
    have people arguing in favour and we have people arguing against that.
    This is a point of disagreement.

    2) Testing and unstable can continue to remain indistinguishable, and
    both be erroneously identified as trixie

    Isn't there the third option of adhering to the os-release specification without making testing and unstable distinguishable? I did not see this
    ranked in your preference. Do you see it as even worse than the status
    quo?

    Again you'll know better than me, but it seems to me rulings were made
    in the past that were along similar lines (eg: usrmerge) - there
    wasn't reviewable code there, no?

    I think /usr-merge was quite different. The usrmerge package existed for
    a long time before things to to the CTTE. The changes to debootstrap
    were uploaded before things escalated to the CTTE another time and what remained was basically a question of what defaults debootstrap should
    have. In the case of os-release, the disagreement reached CTTE before
    actual changes to the disputed status quo have been uploaded to unstable
    and the available solution space is wider. Also the transition cost is
    lower.

    Keep in mind that our constitution says that you cannot be asked to work
    (2.1) and in particular the CTTE cannot request work to be done either. Instead, it can authorize a solution and require that developers do not
    work against the chosen solution. Furthermore, the CTTE should select
    among designs that have been proposed and "reasonably thoroughly
    discussed" (6.3.5). My perception is that your initial filing did not
    meet this bar, but you later clarified your design and discussion is
    ongoing.

    Sorry but I do not think that is an accurate representation. First of
    all, the implementation of the spec is bugged, period - it's not about
    being pedantic about it, it's about being completely incompatible: sid
    is identified as trixie, and that is just plain wrong, and there's no
    room for interpretation, no matter how one might try to bend it. You
    might say that you don't _care_ that the implementation is buggy, you
    might even say that it is worth, nay _good_ it to leave it buggy - but
    buggy it is, if I create a sid image, it will never in a million years
    be trixie, and yet it says it's trixie.

    I think it has become abundantly clear that your view on this does not represent consensus of discussion participants. It is not as black and
    white as you paint it. Simon compared unstable to Ubuntu's proposed
    pocket. It also happens that testing and unstable share the same pool
    hierarchy and the vast majority of packages. On the other hand, Devuan
    operates as an overlay repository to be added on top of a Debian
    repository. I don't think it matters that Ubuntu's proposed is
    implemented as a partial distribution overlaid onto another as that's
    what other derivatives (that do update their os-release file) do as
    well.

    It would help if you could stop dismissing other people's views and respectfully disagree with their views instead. Refer to Simon's reply https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#118 for more
    details on this aspect.

    Secondly, I am not even sure what these conflicting requirements
    actually are? Could you please spell them out? If trixie was
    identified as trixie, and sid was identified as unstable, what
    compromise would be, er, compromised, precisely? Because the only
    practical objections I could find were based on the idea that
    implementations would be ugly or hard to maintain or so - as already mentioned, I am happy to relieve anybody else and take that hard and
    ugly maintenance burden for myself. What other actual problem would
    suddenly appear? What feature or advantage do we leave behind? How are
    things made worse for our users?

    The devil is in the detail. Debian currently does not provide a simple
    way to distinguish testing and unstable. As a result, some users have
    opted to not rely on such differentiation and instead inspect particular package versions for the features they are interested in. Others have implemented heuristics to somehow tell testing and unstable apart as
    they saw a need for doing so (that I still fail to see at this time).
    Whilst you and others have presented code for telling testing and
    unstable apart in multiple places, I am still having a hard time
    figuring out why we had to tell them apart and in what way code would
    behave differently for one or the other. If Debian were to differentiate testing and unstable in a simple way, people would start relying on
    that. That in turn (as laid out by Russ and Simon) would degrade our distribution testing as code that was working in unstable may stop
    working once it migrates to testing for the sole reason of inspecting /etc/os-release. To put this another way, enabling users to
    differentiate between testing and unstable would encourage developers to
    write code that some of us see as broken by design.

    in the weirdest places. Here's one I am well familiar with as the git
    history will show:

    https://github.com/openSUSE/obs-build/blob/master/build-recipe-livebuild#L138

    This one vastly predates the introduction of os-release and the actual
    problem being solved there is to not distinguish testing from unstable
    and rather treat unstable in the same way as testing even though
    lsb_release would differentiate them.

    build live-build based images in the open build service, because of
    this base-files bug. Fortunately at the time we didn't care about
    that, for external reasons, so it didn't cause troubles, besides
    needing to hack it.

    Here's a random one, first result found searching on Github:

    https://github.com/lpereira/hardinfo/blob/4c97625c5666fa5fc353e7cab322b09159e54ed4/modules/computer/os.c#L486

    /* HACK: Some Debian systems doesn't include the distribuition
    * name in /etc/debian_release, so add them here. */

    Again, this is not concerned with os-release, but with lsb_release
    --codename attempting to differentiate between testing and unstable. The
    actual result here is that DIST would contain the codename of testing
    when run in an unstable environment.

    Both of these are likely no longer needed.

    Note how it starts with HACK, all caps? This is what we subject our
    users to. This is what we are known for. What do we even gain in
    exchange?

    I hear you and agree that we should get rid of this code once we no
    longer need to support old releases. On the flip side, my reading of the examples you presented strengthens the position that testing and
    unstable should indeed be indistinguishable, which likely is not what
    you intended.

    "Ah it's Debian Trix..."

    $ sudo build/systemd-dissect --copy-from image.raw
    /etc/apt/sources.list /tmp/sources
    $ grep Suites /tmp/sources
    Suites: unstable
    Suites: unstable-debug

    "Oh wait no, it's Debian Si..."

    $ sudo build/systemd-dissect --copy-from image.raw /etc/debian_version /tmp/debian_version
    $ cat /tmp/debian_version
    trixie/sid

    "Oh no, wait, it's... both?!"

    You successfully detail how testing and unstable are difficult to
    distinguish. What I still fail to see is what negative consequence there
    is as a result.

    To be pedantic, please note that /etc/os-release is a symlink, not a conffile. The real content is in /usr/lib/os-release.

    Right. To be pedantic, a symlink can be a conffile. Either way, that
    only changes the location of the dispute, but little beyond.

    I do not find using t-p-u to update the content ugly at all to be
    honest, it's there to be used as a piece of infrastructure. I do not
    see anything wrong with using it? What would be the actual issue? and
    anyway as already mentioned, I am fine with taking the burden of such ugliness upon myself, so that nobody else has to be subjected to it.

    I'm not sure this is worth debating. Whether I or Santiago would
    describe it as ugly likely does not matter much. What really matters is
    whether the release team agrees with such use of t-p-u and that's a
    question you can relatively easily settle.

    Consider adding a new Debian binary package containing /etc/os-release
    with contents suitable for unstable. This package would use the
    dpkg-divert mechanism to avoid a conflict with base-files which would continue to install /etc/os-release with contents suitable for testing (even in unstable). We would mark this new package "Essential: yes",
    but have no other package depend on it. We would also file a permanent rc-bug to prevent it from migrating to testing. As a result, the set of essential packages as discovered by bootstrapping tools would differ between testing and unstable and the /etc/os-release would be diverted
    for unstable only. A significant downside of this approach is that all existing unstable systems would never install this package (and thus continue to be seen as testing installations) and all systems that were bootstrapped as unstable would be keep this package even if they were to
    be downgraded to testing at a later time (unless the administrator
    actively removes the new package).

    The downsides you have mentioned are significant already, and also as
    you know I very strongly dislike dpkg-diverts, but that's my problem. However, having complex maintainer script machinery in the essential
    set is everyone's problem, as it can and will break, and as above, I
    am sure it is best avoided. This still requires blocking the migration
    of a package, so it does not seem to me it provides any advantages
    over simply having an os-release binary package pinned to unstable,
    with no maintainer scripts, and just the content appropriate for
    unstable inside it. It still requires overruling the base-files
    maintainer. What would be the difference/advantage over the other
    approach?

    Unless base-files gains a dependency on the proposed os-release package,
    your t-p-u approach shares the downside of existing unstable systems
    never getting classified as unstable. Your approach also shares the
    downside of systems that are being bootstrapped as unstable keep being classified as unstable even if they become testing. If you see these as significant, you should go back to the drawing board.

    I sympathise with your dislike of diversions in principle, but not at
    any cost. I've removed diversions of /bin/sh from unstable when I saw
    their cost exceeding their benefit and added a lot of diversions or
    finalizing the /usr-move. To me they're a tool whose cost should be
    evaluated for each use. What makes them less attractive here is that
    this diversion would be permanent. On the flip side, it would only ever
    be present in unstable and never reach any other release (and thus the
    majority of users would never see it).

    Indeed, you may pin a package to unstable by other means than adding an
    rc-bug. Adding a britney hint works as well (both for the t-p-u approach
    and for the diversion approach).

    One advantage of the diversion mechanism I see is that its effects are
    limited to unstable. We don't need to add any new package to any other
    release nor do we need to move files between essential packages or pull
    a new package into the essential set.

    Please do not read this as me trying to convince you to use diversions.
    I've given some arguments, but even now, I am not convinced myself that
    I would prefer this approach. I merely try to widen the solution space
    and allow us to better understand their advantages and disadvantages.

    We have a disagreement about whether the information you intend to
    convey actually exists beyond the point in time where you deboostrap. If
    I debootstrap unstable and look at it a week later, it more closely represents testing than unstable.

    I don't think so. It is unstable, one week out of date. It's not any different than running "debootstrap bookworm" and checking back X
    weeks later, after a point release is available - it will be outdated,
    but still bookworm, and still one apt update; apt upgrade away from
    being up to date again. Same for unstable: if it's a week old, after
    you apt upgrade it, it will be on par again. It will not magically
    become testing by itself. If you debootstrap unstable today and check
    back again in a year, it will not be stable trixie, it will be
    outdated unstable, and an apt upgrade will make it an up to date
    unstable.

    At that point when you have an outdated unstable and a current testing, differentiating them becomes meaningless as your current testing will
    have a lot of more recent packages. What do you do with this knowledge
    that one is unstable and the other is testing?

    Thank you for referencing a practical effect. It is not clear how mkosi uses the Release field and why it is important to differentiate testing from unstable though.

    It's an image builder tool - it builds images, so it needs to know
    _which_ image to build and in this case, I need it to build a guest
    that matches the host - do I pull from testing or unstable? Which one
    is this? Ah it says trixie, so I can use the trixie repository and...
    oh wait now everything is broken because it was actually sid and a
    transition was not finished so I got a broken image. Try again next
    week?

    Both Johannes and me have fallen into this trap. You have create a
    flaky autopkgtest that is not actually testing what it is supposed to
    test. Rather than inspecting the release name, your test should copy the
    hosts' sources and apt pins into the guest. Your typical autopkgtest
    runs with both testing and unstable enabled with some packages pinned
    from unstable and you need to reproduce this package set inside your
    guest.

    This now is an example for why distinguishing testing and unstable bears
    a risk of abuse. Thus far, every single use of the testing vs unstable difference that I've seen in this discussion is better solved in another
    way.

    Because it's not just standalone images, but images based on other
    images (ie, sysext: https://uapi-group.org/specifications/specs/extension_image/ ). If you
    cannot identify an image, what the heck did you just build? And
    against what? And what do you base this other one on? Nobody knows.
    And then the hacks begin.

    If you knew your image was unstable, you'd gain nothing in terms
    figuring out what is inside without knowing when it was produced. You
    gain something once you add a BUILD_ID. As you rewrite /etc/os-release
    anyway, you may update VERSION_CODENAME as well at little extra effort.

    Yes, and that solves the "wrong information given" problem (which is
    new, VERSION_CODENAME was introduced somewhat recently in base-files),
    but does not solve the "cannot identify image without horrendous
    hacks" problem, so the implementation is still buggy - less so, but
    still buggy. The point of the spec is to uniquely identify an image,
    and if you are Arch and don't do releases then of course you don't
    specify the release codename (there ain't one), so the field is
    optional to cater to those use cases. It's not optional to cater to
    the "distribution is held together with duct tape and prayers" cases,
    I'm afraid. And if you don't implement the spec to enable its purpose
    of identifying vendor trees, why implement it at all?

    More and more I am reaching the conclusion that not being able to
    distinguish testing from unstable is a feature, not a bug. I'm using the information from /etc/os-release (e.g. via ansible or puppet). For that
    use case, Simon gave a recipe that works well with the VERSION_ID as it
    is today. I'm trying to better understand other uses of the information contained.

    Sorry, I do not follow - how would this impact debootstrap negatively?
    It's just a package with a single file? The only part to decide is
    what pulls it in and yeah that should be compatible with debootstrap
    of course.

    This matter is discussed in Russ' subthread. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#93

    The best and easiest solution is what I shared in a previous mail: a

    Thanks for summarizing and ranking the solutions you considered. That
    helped better understand your point of view.

    Besides what I provided above, is there anything else required to make
    it actionable?

    We've made significant progress in understanding your request and
    desired solution. I expect that we will take at least a week to gather
    views and use cases on distinguishing testing from unstable before we
    can draw any conclusions or ballots, but then this doesn't look super
    urgent to me. Thanks for your patience.

    Helmut

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Sean Whitton@21:1/5 to Luca Boccassi on Sat Aug 3 06:00:01 2024
    Hello,

    On Fri 02 Aug 2024 at 12:19pm +01, Luca Boccassi wrote:

    Sorry, but there's no other way to define this than a bug. Well, there
    are many more I could mention, but then Russ would whip out the cane
    ;-)

    Russ is not the only person who finds interactions with you difficult.
    Please don't trivialise his efforts to point you in a better direction
    by comparisng them to punishment for schoolchildren.

    --
    Sean Whitton

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Sean Whitton@21:1/5 to All on Sat Aug 3 06:30:01 2024
    Hello,

    Luca is the upstream maintainer of the specification, but whether and
    how the specification as published applies to Debian is not simply up to
    his assertion.

    The TC is being asked to override how Santiago has determined the
    specification applies to Debian.
    The Release Team's opinion is as relevant as Santiago's, I think.

    Here is how it seems to me:

    - the specification applies cleanly to our stable releases, and we
    want to support it, so we ship the appropriate metadata

    - it applies to testing during the later stages of the freeze, and
    indeed we ship correct metadata at that time

    - it does not apply to testing the rest of the time, and it never
    applies to unstable. We ship metadata, but only as a side-effect of
    our process for preparing stable releases.

    If this is right, then the goal should not be to ship correct metadata
    in testing and unstable, because that's impossible.
    The goal should simply be to make whatever we ship in testing and
    unstable relatively unobtrusive to users.

    Possibly it's less obtrusive to always ship "trixie" in both testing and unstable, rather than the special "trixie/sid" value. Or maybe not.
    Santiago doesn't think so; it would be good to hear why, in this bug.

    I'd also like to note, in response to Luca, that it's misleading to say
    that it's a frankendebian to have packages from sid installed on a
    testing system, because that's how testing and sid are meant to work.
    It's only a frankendebian to have packages from different suites
    installed on stable.

    --
    Sean Whitton

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Sean Whitton on Sat Aug 3 11:40:01 2024
    On Sat, 3 Aug 2024 at 05:23, Sean Whitton <spwhitton@spwhitton.name> wrote:

    Hello,

    Luca is the upstream maintainer of the specification, but whether and
    how the specification as published applies to Debian is not simply up to
    his assertion.

    To be really really precise, what I asserted is that the
    implementation is currently buggy in unstable, which is technically
    correct. I then _ask_ for a ruling to change the implementation. As
    already mentioned many times in other mails, one is perfectly allowed
    to say "this bug should not be fixed", "this bug's severity is nil",
    but not to say "this bug does not exist". To repeat the same example,
    if os-release was a program asserting on the state, it would run
    correctly on testing, and it would crash when run in unstable. One can
    say it's wrong that it crashes and one wants the state to remain
    as-is, but one can't say it doesn't crash, because it is a fact that
    it does, not an opinion. Both of these things can happen at the same
    time and be both true: the TC rules that the os-release file in
    unstable will remain as-is, and os-release implementation in Debian is
    buggy. A bug report can be closed by an upload that changes something,
    or by a close+wontfix.

    The TC is being asked to override how Santiago has determined the specification applies to Debian.
    The Release Team's opinion is as relevant as Santiago's, I think.

    Everybody is welcomed to chime in at any time, and I have already said
    so on RT's IRC channel the other day just after opening this bug.
    On the matter of formal ownership however, I want to highlight that,
    as you can see in various replies detailing the precise technical
    solution that could possibly be implemented, there are _no changes to
    testing_ being proposed here, in case what you are worried about here
    is ownership of testing and changes to it. The only change would be in unstable, and as far as I understand (I might be wrong, please correct
    me) RT owns testing and [old]stable, not unstable. If you want to
    ensure the owner of the relevant area is directly involved, then
    perhaps it's the FTP team that should be, since as far as I understand
    they are the owners of unstable (might be wrong here too)? Again,
    everyone's welcome to chime in at any time, just trying to clarify
    who's responsible for what here.

    Here is how it seems to me:

    - the specification applies cleanly to our stable releases, and we
    want to support it, so we ship the appropriate metadata

    - it applies to testing during the later stages of the freeze, and
    indeed we ship correct metadata at that time

    - it does not apply to testing the rest of the time, and it never
    applies to unstable. We ship metadata, but only as a side-effect of
    our process for preparing stable releases.

    If this is right, then the goal should not be to ship correct metadata
    in testing and unstable, because that's impossible.
    The goal should simply be to make whatever we ship in testing and
    unstable relatively unobtrusive to users.

    If I understand correctly what you mean by "apply" here, and you mean
    in terms of the specification and what it is meant for, then as one of
    the owners of the spec I can say with certainty that the spec applies
    to testing and unstable, at any time. There is nothing incompatible
    with the way testing and unstable exist, are created, handled,
    maintained, used or anything else, and they are nothing "special"
    compared to other distributions, other than in the fact that the spec
    is not implemented correctly in unstable. There should not be any
    doubt on any of this, solely from the point of view of what the
    specification is for and what its goals are. One can of course
    disagree on whether it should be implemented as such and where, which
    is what is happening right now.
    If you mean it in terms of what is currently implemented in Debian,
    then that's also inaccurate: the spec is currently correctly
    implemented in testing, where it says VERSION_CODENAME=trixie at all
    times. It is incorrectly implemented in unstable, since also there it
    says VERSION_CODENAME=trixie, which makes it buggy, as sid is
    obviously not trixie, and that's the main change I am asking to
    implement. I'll note again that it is perfectly ok to omit VERSION_ID
    until release time, and in one of the replies I am clarifying that, if
    there are reasons to leave it out, it is ok to do so, and I am not
    asking the CTTE to overrule that.

    Also, speaking as someone who has worked on image building tools for
    many years, the current state is extremely intrusive for users, and
    that's why I am trying to fix it.

    Possibly it's less obtrusive to always ship "trixie" in both testing and unstable, rather than the special "trixie/sid" value. Or maybe not.
    Santiago doesn't think so; it would be good to hear why, in this bug.

    I'd also like to note, in response to Luca, that it's misleading to say
    that it's a frankendebian to have packages from sid installed on a
    testing system, because that's how testing and sid are meant to work.
    It's only a frankendebian to have packages from different suites
    installed on stable.

    The implementation does not match what you are saying here though:

    $ sudo debootstrap testing foo/
    <...>
    $ cat foo/etc/apt/sources.list
    deb http://deb.debian.org/debian testing main

    No trace whatsoever of 'unstable'.

    $ sudo debootstrap unstable bar/
    <...>
    $ cat bar/etc/apt/sources.list
    deb http://deb.debian.org/debian unstable main

    No trace whatsoever of 'testing'.

    Is debootstrap buggy, then? If what you are saying is correct, then I
    should fix debootstrap to add apt sources for both testing and
    unstable, when one calls it with either "testing" or "unstable" or
    either codename, right?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Paul Gevers on Sat Aug 3 12:10:01 2024
    On Sat, 3 Aug 2024 at 10:51, Paul Gevers <elbrus@debian.org> wrote:

    Hi,

    [Release Team member hat on, but I only voice my opinion as a member].

    On the use of tpu:
    Personally, until now I fail to see enough value of being able to
    distinguish unstable and testing to give the package carrying
    /etc/os-release a permanent exception via tpu.

    Thanks for chiming in - assuming for a moment that it is decided that
    the change will be implemented, do you see any technical obstacles in
    using t-p-u as proposed?

    On Debian version numbers:
    I my view we only assign version numbers the moment we release. You can
    see that reflected in the symlink layout of debian/dists and in the trixie/Release file.

    Understood, thanks for providing that additional information - then as mentioned in another reply, I am changing the request from what it was originally stated in the initial email that opened the bug, and I do
    not request that version numbers be added to testing. The
    implementation I am then requesting to rule on is defined in https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#43 and, in
    practice, results only in a change to unstable, testing's content will
    remain as it currently is, with no change at all.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Sam Hartman on Sat Aug 3 12:30:03 2024
    On Fri, 2 Aug 2024 at 21:06, Sam Hartman <hartmans@debian.org> wrote:

    "Luca" == Luca Boccassi <bluca@debian.org> writes:

    Luca> On Fri, 2 Aug 2024 at 13:00, Simon McVittie <smcv@debian.org> wrote:
    >>
    >> On Fri, 02 Aug 2024 at 12:19:20 +0100, Luca Boccassi wrote:
    >> > To further clarify why the status quo with
    >> VERSION_CODENAME=trixie in > sid is really bad: it used to be
    >> that if you had "debian" mentioned in > os-release but no other
    >> version identifying fields, you knew you were > on testing OR
    >> unstable and you'd have to deploy horrendous hacks to > attempt
    >> and figure out which of the two it was really.
    >>
    >> OK, I think this is progress:
    >>
    >> What is the scenario / use-case in which it becomes necessary to
    >> distinguish between those two suites?
    >>
    >> To put that another way, what external piece of software needs to
    >> change its behaviour, dependent on whether you are running
    >> testing (of an unspecified datestamp) or unstable (of an
    >> unspecified datestamp)?
    >>
    >> Or perhaps you are thinking of a scenario in which a *person*
    >> needs to change their behaviour, dependent on whether they are
    >> running testing or unstable?

    Luca> Are the examples I provided at:

    Luca> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#43
    Luca> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1077764#5

    Not to me.
    I read what I think is the examples you linked from both bug reports.
    I didn't dig too far into the github links you provided though.
    What I see from your mail is that people want to distinguish unstable
    from testing and have created various hacks to do so.

    What I do not see is a compelling explanation of why Debian as a project wants to encourage that distinction.
    I agree that people doing a thing is evidence that it has value to those people.
    But I do not think you provided an explanation of what that value is.

    If it were easy to distinguish testing from unstable, why would I want
    to do that?

    I don't see any of this being about "encouraging", because, as
    mentioned in a previous mail, this is already how things work, and it
    doesn't need any encouraging. It's about simply recognizing that this
    is how everything already works, and changing 5 characters in a text
    file that will have no repercussion on how these are used. Because
    once again, I can do:

    debootstrap trixie foo
    debootstrap sid bar

    foo and bar are different images, with different policies and
    different lifecycles.
    foo is currently in development, will freeze and then become stable
    and security supported, and then move to LTS, and then be EOL. It is a development-to-stable-to-eol image.
    bar will continue being a development image, will never freeze, will
    never become security supported, will never become LTS, will never be
    EOL. It is a rolling image.

    These details are what os-release is about, if you read the spec,
    there are tons of fields about lifecycle management of an image, with
    support and so on.

    I am not describing a proposal here, I am describing how things work
    and have always worked.

    If you are asking me _why_ other people use the above how they use
    them, well, I don't know? Unfortunately I left my Cerebro helmet in my
    other coat. What I can do is show that it happens, it's always
    happened, and it will very likely continue to happen. And what I am highlighting is that we are the only distro that makes it hard to do
    it, and I am highlighting that a specification (that I am one of the
    owners of) is implemented incorrectly since it says A is B. And I am
    asking to fix it so that A says it's A instead, and B continues to say
    it's B as it does today.

    I can say why _I_ do it though: because I regularly build and manage
    multiple images, and I can correctly identify all of them based on
    standard distro-agnostic tooling, but not Debian unstable, which is
    the _only_ exception that requires annoying kludges to be used.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luca Boccassi@21:1/5 to Paul Gevers on Sat Aug 3 12:40:01 2024
    On Sat, 3 Aug 2024 at 11:20, Paul Gevers <elbrus@debian.org> wrote:

    Hi

    On 03-08-2024 11:58, Luca Boccassi wrote:
    On the use of tpu:
    Personally, until now I fail to see enough value of being able to
    distinguish unstable and testing to give the package carrying
    /etc/os-release a permanent exception via tpu.

    Thanks for chiming in - assuming for a moment that it is decided that
    the change will be implemented, do you see any technical obstacles in
    using t-p-u as proposed?

    The biggest reason I know against using tpu is that it currently isn't receiving the same amount of testing (be it automatic (autopkgtest,
    piuparts, in the future reproducibility) or human) as
    unstable-to-testing migrations receive. For the automatic part, that's obviously a solvable problem (and already on my todo list for YEARS),
    but currently not the case. It also *always* requires human intervention
    by the Release Team. Another issue issue with tpu is that binNMU'ing is
    more difficult (I assume that's probably not very often relevant in the current case). I recall there are more issues with tpu, but I have
    forgotten them. When I find them, I'll add them.

    Thank you. For this particular case: there would be 2 uploads for
    every cycle, one at the end to add version numbers (this already
    happens, no?), one at the beginning to change the VERSION_CODENAME. I
    think from the point of view of requiring manual labour it should be
    pretty lightweight compared to the current workload of managing
    stable-p-u, at 2 uploads to review once every ~2 years, right?

    For the binNMU side, this would be an Architecture: all package, so it
    doesn't apply I think, right? It wouldn't be subject to any binary
    transition for library bumps or things like that. In the current
    proposal I am putting forward it's a binary arch: all with a single
    fixed arch-independent text file in /usr/lib/ and a single fixed
    symlink in /etc/ to the file in /usr/lib, no maintainer scripts
    whatsoever, no dependencies.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Craig Small@21:1/5 to All on Fri Aug 9 00:20:01 2024
    =====
    BEGIN BALLOT

    The Technical Committee declines to overrule the maintainer of
    base-files, or issue any advice on issues concerning /etc/os-release.

    We do not think there is a clear proposal on the table for us to assess,
    and we do not think it is appropriate to issue any general statements on
    the issues concerning /etc/os-release.

    A: Decline to overrule or issue advice
    N: None of the above

    END BALLOT
    =====

    A > N


    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEEXT3w9TizJ8CqeneiAiFmwP88hOMFAma1QxoACgkQAiFmwP88 hOPMCQ/5AdmRZ8jsLCa9uk7N9lWuL6VFpRsiWYvKxcXNUL1lJbnthdqttwMahPWq C3luYDFRXiUYcDqsooX5MzghjbsL36clip2Gt0V4pXa66sYCNZ+QtroVkqSFjj6z jLNxd3obnsvmk4MOAxPsHWOgqYgv7RYS5YDftczf1Ar4JfGX7cOZIk3V0p2yrplt wDjhzUr1BHGfbKavzrGEmoZlvDHxba6aflJELIJ9lieX8iPlCC6unLq1h5pktgJD HPBNUljPi+fpolZ7m9QTEwSBAgI3rg4lNnJ6jDC+wwA6C6dudr14+qliyfSjysXR Dx2oUHyZvN3KDrrQ6VIQh888FWIjclKnDWKrpVuuKefrIKvFzBzz+HWwi3tSPHd0 40osh8MnKbJ19Ono5RX5mK+4qS5yVcZMg0xU2dVH7zk1OHYjcRWVExhZhBAfvgn1 23VtBSIRB3Kqj/nBCXcZu0JT8q2TXLgLZ26eKUH72mVIEHTWHXJB5RCEjjJT+QHz /vvjUyuemVz795CBMpYBzilNUK9zZqM6/wX1upmYikePlIYnO7YRDzOzIDS/w3uw /kDuEoj6cRq/qGiAvoQESSlSGL/ugf9VmrXPqlE4LLr7fm5U0DOtrg5Bk9j7q7no bF/OPnaAf8YbxsT19WIlKaHoxQzIh+lHEadaH1NEBhxNagEuTYw=
    =3rms
    -----END PGP SIGNATURE-----

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)