guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

consider "git describe"... harmful? (if misused)


From: Giovanni Biscuolo
Subject: consider "git describe"... harmful? (if misused)
Date: Mon, 05 Feb 2024 12:08:17 +0100

Hello developers,

Ipse dixit: a tag is a tag is a tag.

Sorry to stress on this but AFAIU "git describe" and it's variants is
(mis)used by some (many?) to obtain the last revision number of packages
got from a git tag on a repo, even in few upstream build config/scripts
(patched in Guix); here are just a few examples I've observed from
messages in this mailing list and our package definitions:

- https://yhetil.org/guix/7a759ffb-fca8-478d-a4aa-08e6b674da75@archlinux.org:
  `git describe --tags`, which is often used for --version output
  (especially in Go projects)

- https://yhetil.org/guix/87ediha5p0.wl-hako@ultrarare.space: I usually
  obtain the revision number from the output of 'git describe --tags', I
  think it's fine to use it when available.

- https://yhetil.org/guix/c93c18e5-8e01-45a0-b79f-05d72f6f8230@archlinux.org
  The output of `git describe --always --tags --dirty` was also embedded.

Some code/comments I got running "find . -type f -exec grep --color=auto
-nH --null -e "git describe" \{\} +" in "<guix-repo>/gnu/packages", in
Emacs:

- ./audio.scm:751: ;; Ardour expects this file to exist at build time.  The
                   revision is the output of git describe HEAD | sed
                   's/^[A-Za-z]*+//'

- ./build-tools.scm:589: (substitute* "src/tup/link.sh" (("`git
  describe`") ,version))
 
- ./linux.scm:7263: ;; the checkout lacks a .git directory, breaking ‘git
  describe’.
  
- ./axoloti.scm:500: ;; TODO: this is the output of: git describe --long
  --tags --dirty --always

IMHO "git describe" should never be used to obtain the last revision
for the reasons I explained in my previous message (see a quote below):
IF you get it right is ONLY by chance (probably it's most of the times),
not by **design**; executive summary:

1. "git describe [--tag]" have a bug and doesn't traverse the graph in
topological order; for the Guix git repo this means that now the last
"git describe" tell us something like "v1.3.0-53609-gc70c513317" (the
number of commits and the commit hash may vary depending on last "git
pull"), not something like...

2. is NOT guaranteed that the last tag reported by "git describe
[--tag]" (even if the above mentioned bug is resolved) is the one
corresponding to a released revision of the software, since tags (even
annotated one) can be added by repo committers for any reason they find
useful; i.e. the last tag commited gor the Guix repo is
base-for-issue-62196.  If and ONLY IF committers use a recognised
pattern for the tag - i.e. v<semver> - we can get the last (tagged)
revision from git (see below for alternative to "

Giovanni Biscuolo <g@xelera.eu> writes:

[...]

> The upstream bug report (and a reproducer) is this one:
> «Subject: [BUG] `git describe` doesn't traverse the graph in topological
> order»
> https://lore.kernel.org/git/ZNffWAgldUZdpQcr@farprobe/
>
> Another user also reported the issue and a reproducer:
> https://public-inbox.org/git/PH0PR08MB773203CE3206B8DEFB172B2F94839@PH0PR08MB7732.namprd08.prod.outlook.com/
>
> The "executive summary" is that "git describe" gets the count of "fewest
> commits different from the input commit-ish" wrong (see anso previous
> messages in this thread for details).
>
> Anyway, even if this bug was solved, I'd warmly suggest NOT to base the
> check for the latest stable Guix commit (usually tagged as v[0-9]*) on
> the result of "git describe".
>
> Today, if "guix describe"

I mean "git describe", sorry!

> had no bugs, the correct result would be:
> "base-for-issue-62196"... AFAIU :-)
>
> This is a reproducer:
>
> --8<---------------cut here---------------start------------->8---
>
> $ git describe $(git rev-list --tags --max-count=1)
> base-for-issue-62196
>
> --8<---------------cut here---------------end--------------->8---
>
> To get the value corresponding to the latest tagged version, we should
> testrict the list of tags to the ones matching the "v[0-9]*" regexp:
>
> --8<---------------cut here---------------start------------->8---
>
> $ git describe $(git rev-list --tags="v[0-9]*" --max-count=1)
> v1.4.0
>
> --8<---------------cut here---------------end--------------->8---

More efficient alternative:

--8<---------------cut here---------------start------------->8---

$ git tag --list 'v*' --sort=-creatordate | head -1
v1.4.0

--8<---------------cut here---------------end--------------->8---

[...]

Should we add some notes (a footnote?) in our Guix manual?

WDYT?

-- 
Giovanni Biscuolo

Xelera IT Infrastructures

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]