Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] add patchlevel to --version output
- X-seq: zsh-workers 54644
- From: dana <dana@xxxxxxx>
- To: zsh-workers@xxxxxxx
- Cc: "Wesley Schwengle" <wesleys@xxxxxxxxxxxxxxx>
- Subject: [PATCH] add patchlevel to --version output
- Date: Sat, 30 May 2026 19:56:30 -0500
- Archived-at: <https://zsh.org/workers/54644>
- Feedback-id: i9be146f9:Fastmail
- List-id: <zsh-workers.zsh.org>
wesley brought w/49374 (and w/52045 etc -- for some reason the mla
doesn't thread any of the replies) to our attention on irc today. i
think it's a good idea, but we talked about it more and revised
with this patch, the patchlevel (custom or not) is displayed in the
--version output whenever it doesn't look like the default patchlevel
for a tagged release
we also changed the format from the previous revision to ensure that any
scripts that might expect the target string at the end continue to work
the result looks like this:
# built from release tag or tarball (no change)
% Src/zsh --version
zsh 5.9.0.4-test (arm-apple-darwin24.6.0)
# built from master
% Src/zsh --version
zsh 5.9.999.3-test [zsh-5.9.0.3-test-279-g8714db6] (arm-apple-darwin24.6.0)
# built from tarball with custom patchlevel like debian's
% Src/zsh --version
zsh 5.9 [debian/5.9-8+b22] (x86_64-debian-linux-gnu)
wesley pointed out that the middle one is a bit noisy, and i agree, but
i'm not sure what a reliable alternative is. he had some other ideas,
i'll let him advocate for them if he likes
dana
diff --git a/Src/init.c b/Src/init.c
index 28bff0763..89a7ff714 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -35,6 +35,14 @@
#include "init.pro"
#include "version.h"
+#ifdef CUSTOM_PATCHLEVEL
+#define ZSH_PATCHLEVEL CUSTOM_PATCHLEVEL
+#else
+#include "patchlevel.h"
+#ifndef ZSH_PATCHLEVEL
+#define ZSH_PATCHLEVEL "unknown"
+#endif
+#endif
#if defined(HAVE_SYS_SYSCTL_H) && !defined(__linux)
#include <sys/sysctl.h>
@@ -435,8 +443,15 @@ parseopts(char *nam, char ***argvp, char *new_opts, char **cmdp,
/* GNU-style long options */
++*argv;
if (!strcmp(*argv, "version")) {
- printf("zsh %s (%s-%s-%s)\n",
- ZSH_VERSION, MACHTYPE, VENDOR, OSTYPE);
+ // omit patchlevel for a tagged release, which looks like:
+ // zsh-x.y.z-0-gabcdef
+ static const char *pfx = "zsh-" ZSH_VERSION "-0-";
+ if (strncmp(ZSH_PATCHLEVEL, pfx, strlen(pfx)))
+ printf("zsh %s [%s] (%s-%s-%s)\n",
+ ZSH_VERSION, ZSH_PATCHLEVEL, MACHTYPE, VENDOR, OSTYPE);
+ else
+ printf("zsh %s (%s-%s-%s)\n",
+ ZSH_VERSION, MACHTYPE, VENDOR, OSTYPE);
LAST_OPTION(0);
}
if (!strcmp(*argv, "help")) {
diff --git a/Src/zsh.mdd b/Src/zsh.mdd
index da8d58322..9a5e9daab 100644
--- a/Src/zsh.mdd
+++ b/Src/zsh.mdd
@@ -41,7 +41,7 @@ signames.c: signames1.awk signames2.awk ../config.h @SIGNAL_H@
sigcount.h: signames.c
grep 'define.*SIGCOUNT' signames.c > $@
-init.o: bltinmods.list zshpaths.h zshxmods.h
+init.o: bltinmods.list zshpaths.h zshxmods.h patchlevel.h
init.o params.o parse.o: version.h
diff --git a/Test/E01options.ztst b/Test/E01options.ztst
index dcb14e013..6e4690ef7 100644
--- a/Test/E01options.ztst
+++ b/Test/E01options.ztst
@@ -96,6 +96,15 @@
%test
+# --version is technically an option
+ v=$( $ZTST_testdir/../Src/zsh --version )
+ print -r - $v
+ # patchlevel should appear in output if different from version
+ [[ $ZSH_PATCHLEVEL == zsh-$ZSH_VERSION-0-* ]] ||
+ [[ $v == *\[$ZSH_PATCHLEVEL\]* ]]
+0:zsh --version output
+*>zsh * \(*\)
+
# setopt should move on to the next operation in the face of an error, but
# preserve the >0 return code
unsetopt aliases
Messages sorted by:
Reverse Date,
Date,
Thread,
Author