Compare commits

..

1 commit

Author SHA1 Message Date
Lukáš Zaoral
202c9ba023
fix crash with bracketed-paste-magic and undo
Resolves: rhbz#2484692
2026-07-22 17:51:15 +02:00
15 changed files with 2577 additions and 306 deletions

View file

@ -0,0 +1,178 @@
From 6935aa4b515fe9b782507820c77ab681136470bc Mon Sep 17 00:00:00 2001
From: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Thu, 15 Sep 2022 18:56:20 +0900
Subject: [PATCH] 50629: do not use egrep in tests
Upstream-commit: 4fc5dc0292acd77f17281f451774ba2ca4203026
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
Test/D07multibyte.ztst | 16 ++--------------
Test/E01options.ztst | 2 +-
Test/V07pcre.ztst | 16 ++--------------
Test/X02zlevi.ztst | 11 +----------
Test/X03zlebindkey.ztst | 11 +----------
Test/Y01completion.ztst | 11 +----------
Test/ztst.zsh | 15 +++++++++++++++
7 files changed, 23 insertions(+), 59 deletions(-)
diff --git a/Test/D07multibyte.ztst b/Test/D07multibyte.ztst
index e2e9a25..6909346 100644
--- a/Test/D07multibyte.ztst
+++ b/Test/D07multibyte.ztst
@@ -1,19 +1,7 @@
%prep
-# Find a UTF-8 locale.
- setopt multibyte
-# Don't let LC_* override our choice of locale.
- unset -m LC_\*
- mb_ok=
- langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
- $(locale -a 2>/dev/null | egrep 'utf8|UTF-8'))
- for LANG in $langs; do
- if [[ é = ? ]]; then
- mb_ok=1
- break;
- fi
- done
- if [[ -z $mb_ok ]]; then
+ LANG=$(ZTST_find_UTF8)
+ if [[ -z $LANG ]]; then
ZTST_unimplemented="no UTF-8 locale or multibyte mode is not implemented"
else
print -u $ZTST_fd Testing multibyte with locale $LANG
diff --git a/Test/E01options.ztst b/Test/E01options.ztst
index 2acbfd3..d38fbed 100644
--- a/Test/E01options.ztst
+++ b/Test/E01options.ztst
@@ -651,7 +651,7 @@
>noktarg1
>0 1
- showopt() { setopt | egrep 'localoptions|ksharrays'; }
+ showopt() { echo ${(FM)${(@f)"$(setopt)"}:#(localoptions|ksharrays)*} }
f1() { setopt localoptions ksharrays; showopt }
f2() { setopt ksharrays; showopt }
setopt kshoptionprint
diff --git a/Test/V07pcre.ztst b/Test/V07pcre.ztst
index c9c844d..ca13419 100644
--- a/Test/V07pcre.ztst
+++ b/Test/V07pcre.ztst
@@ -6,20 +6,8 @@
return 0
fi
setopt rematch_pcre
-# Find a UTF-8 locale.
- setopt multibyte
-# Don't let LC_* override our choice of locale.
- unset -m LC_\*
- mb_ok=
- langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
- $(locale -a 2>/dev/null | egrep 'utf8|UTF-8'))
- for LANG in $langs; do
- if [[ é = ? ]]; then
- mb_ok=1
- break;
- fi
- done
- if [[ -z $mb_ok ]]; then
+ LANG=$(ZTST_find_UTF8)
+ if [[ -z $LANG ]]; then
ZTST_unimplemented="no UTF-8 locale or multibyte mode is not implemented"
else
print -u $ZTST_fd Testing PCRE multibyte with locale $LANG
diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst
index 8146d67..203c13c 100644
--- a/Test/X02zlevi.ztst
+++ b/Test/X02zlevi.ztst
@@ -1,16 +1,7 @@
# Tests of the vi mode of ZLE
%prep
- unset -m LC_\*
- ZSH_TEST_LANG=
- langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
- $(locale -a 2>/dev/null | egrep 'utf8|UTF-8'))
- for LANG in $langs; do
- if [[ é = ? ]]; then
- ZSH_TEST_LANG=$LANG
- break;
- fi
- done
+ ZSH_TEST_LANG=$(ZTST_find_UTF8)
if ( zmodload zsh/zpty 2>/dev/null ); then
. $ZTST_srcdir/comptest
comptestinit -v -z $ZTST_testdir/../Src/zsh
diff --git a/Test/X03zlebindkey.ztst b/Test/X03zlebindkey.ztst
index 43692a8..5277332 100644
--- a/Test/X03zlebindkey.ztst
+++ b/Test/X03zlebindkey.ztst
@@ -3,16 +3,7 @@
# into bindings. The latter is particularly tricky with multibyte sequences.
%prep
- unset -m LC_\*
- ZSH_TEST_LANG=
- langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
- $(locale -a 2>/dev/null | egrep 'utf8|UTF-8'))
- for LANG in $langs; do
- if [[ é = ? ]]; then
- ZSH_TEST_LANG=$LANG
- break;
- fi
- done
+ ZSH_TEST_LANG=$(ZTST_find_UTF8)
if ( zmodload zsh/zpty 2>/dev/null ); then
. $ZTST_srcdir/comptest
comptestinit -z $ZTST_testdir/../Src/zsh
diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst
index 6af0efc..f976f9f 100644
--- a/Test/Y01completion.ztst
+++ b/Test/Y01completion.ztst
@@ -1,16 +1,7 @@
# Tests for completion system.
%prep
- unset -m LC_\*
- ZSH_TEST_LANG=
- langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
- $(locale -a 2>/dev/null | egrep 'utf8|UTF-8'))
- for LANG in $langs; do
- if [[ é = ? ]]; then
- ZSH_TEST_LANG=$LANG
- break;
- fi
- done
+ ZSH_TEST_LANG=$(ZTST_find_UTF8)
if ( zmodload zsh/zpty 2>/dev/null ); then
. $ZTST_srcdir/comptest
mkdir comp.tmp
diff --git a/Test/ztst.zsh b/Test/ztst.zsh
index aca275c..d95b726 100755
--- a/Test/ztst.zsh
+++ b/Test/ztst.zsh
@@ -37,6 +37,21 @@ emulate -R zsh
# LANG must be passed to child zsh.
export LANG
+# find UTF-8 locale
+ZTST_find_UTF8 () {
+ setopt multibyte
+ # Don't let LC_* override our choice of locale.
+ unset -m LC_\*
+ local langs=(en_{US,GB}.{UTF-,utf}8 en.UTF-8
+ ${(M)$(locale -a 2>/dev/null):#*.(utf8|UTF-8)})
+ for LANG in $langs; do
+ if [[ é = ? ]]; then
+ echo $LANG
+ return
+ fi
+ done
+}
+
# Don't propagate variables that are set by default in the shell.
typeset +x WORDCHARS
--
2.39.0

View file

@ -0,0 +1,541 @@
commit ab4d62eb975a4c4c51dd35822665050e2ddc6918
Author: Nicholas Vinson <nvinson234@gmail.com>
Date: Wed Sep 21 09:22:11 2022 +0900
50641: use 'int main()' in test C-codes in configure
diff --git a/aczsh.m4 b/aczsh.m4
index 1209ac614..b31236020 100644
--- a/aczsh.m4
+++ b/aczsh.m4
@@ -44,6 +44,7 @@ AC_DEFUN(zsh_64_BIT_TYPE,
#include <sys/types.h>
#endif
+int
main()
{
$1 foo = 0;
@@ -118,7 +119,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -146,29 +146,30 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle1, *handle2;
void *(*zsh_getaddr1)(), *(*zsh_getaddr2)();
void *sym1, *sym2;
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle2) exit(1);
+ if(!handle2) return(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
zsh_getaddr2 = (void *(*)()) dlsym(handle2, "${us}zsh_getaddr2");
sym1 = zsh_getaddr1();
sym2 = zsh_getaddr2();
- if(!sym1 || !sym2) exit(1);
- if(sym1 != sym2) exit(1);
+ if(!sym1 || !sym2) return(1);
+ if(sym1 != sym2) return(1);
dlclose(handle1);
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
sym1 = zsh_getaddr1();
- if(!sym1) exit(1);
- if(sym1 != sym2) exit(1);
- exit(0);
+ if(!sym1) return(1);
+ if(sym1 != sym2) return(1);
+ return(0);
}
]])],[zsh_cv_shared_$1=yes],
[zsh_cv_shared_$1=no],
@@ -200,7 +201,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -228,19 +228,19 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
-
+int
main()
{
void *handle1, *handle2;
int (*fred1)(), (*fred2)();
handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle1) exit(1);
+ if(!handle1) return(1);
handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle2) exit(1);
+ if(!handle2) return(1);
fred1 = (int (*)()) dlsym(handle1, "${us}fred");
fred2 = (int (*)()) dlsym(handle2, "${us}fred");
- if(!fred1 || !fred2) exit(1);
- exit((*fred1)() != 42 || (*fred2)() != 69);
+ if(!fred1 || !fred2) return(1);
+ return((*fred1)() != 42 || (*fred2)() != 69);
}
]])],[zsh_cv_sys_dynamic_clash_ok=yes],
[zsh_cv_sys_dynamic_clash_ok=no],
@@ -276,7 +276,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -304,17 +303,18 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
handle = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
]])],[zsh_cv_sys_dynamic_rtld_global=yes],
[zsh_cv_sys_dynamic_rtld_global=no],
@@ -346,7 +346,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
save_ldflags=$LDFLAGS
LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -374,15 +373,16 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
int fred () { return 42; }
@@ -420,7 +420,6 @@ elif
save_ldflags=$LDFLAGS
LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS -s"
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -448,15 +447,16 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*barneysym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
barneysym = (int (*)()) dlsym(handle, "${us}barney");
- if(!barneysym) exit(1);
- exit((*barneysym)() != 69);
+ if(!barneysym) return(1);
+ return((*barneysym)() != 69);
}
int fred () { return 42; }
@@ -488,7 +488,6 @@ echo 'int fred () { return 42; }' > conftest1.c
if AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS -s conftest1.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -516,15 +515,16 @@ char *zsh_gl_sym_addr ;
#define RTLD_GLOBAL 0
#endif
+int
main()
{
void *handle;
int (*fredsym)();
handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
- if(!handle) exit(1);
+ if(!handle) return(1);
fredsym = (int (*)()) dlsym(handle, "${us}fred");
- if(!fredsym) exit(1);
- exit((*fredsym)() != 42);
+ if(!fredsym) return(1);
+ return((*fredsym)() != 42);
}
]])],[zsh_cv_sys_dynamic_strip_lib=yes],
[zsh_cv_sys_dynamic_strip_lib=no],
diff --git a/configure.ac b/configure.ac
index 890ef8dd2..074141d38 100644
--- a/configure.ac
+++ b/configure.ac
@@ -585,7 +585,7 @@ fi
dnl Checking if compiler correctly cast signed to unsigned.
AC_CACHE_CHECK(if signed to unsigned casting is broken,
zsh_cv_c_broken_signed_to_unsigned_casting,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
AH_TEMPLATE([BROKEN_SIGNED_TO_UNSIGNED_CASTING],
[Define to 1 if compiler incorrectly cast signed to unsigned.])
if test x$zsh_cv_c_broken_signed_to_unsigned_casting = xyes; then
@@ -1046,7 +1046,7 @@ else
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
-main() { return sizeof(off_t) < 8; }
+int main() { return sizeof(off_t) < 8; }
]])],[zsh_cv_off_t_is_64_bit=yes],[zsh_cv_off_t_is_64_bit=no],[zsh_cv_off_t_is_64_bit=no])])
if test x$zsh_cv_off_t_is_64_bit = xyes; then
AC_DEFINE(OFF_T_IS_64_BIT)
@@ -1056,7 +1056,7 @@ main() { return sizeof(off_t) < 8; }
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
-main() { return sizeof(ino_t) < 8; }
+int main() { return sizeof(ino_t) < 8; }
]])],[zsh_cv_ino_t_is_64_bit=yes],[zsh_cv_ino_t_is_64_bit=no],[zsh_cv_ino_t_is_64_bit=no])])
if test x$zsh_cv_ino_t_is_64_bit = xyes; then
AC_DEFINE(INO_T_IS_64_BIT)
@@ -1369,7 +1369,7 @@ zsh_cv_func_realpath_accepts_null,
#include <stdlib.h>
#include <limits.h>
],[
-exit(!realpath("/", (char*)0));
+return(!realpath("/", (char*)0));
])],
[zsh_cv_func_realpath_accepts_null=yes],
[zsh_cv_func_realpath_accepts_null=no],
@@ -1393,10 +1393,9 @@ AC_CACHE_CHECK(if tgetent accepts NULL,
zsh_cv_func_tgetent_accepts_null,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <fcntl.h>
-#include <stdlib.h>
int tgetent(char *, char *);
char *tgetstr(char *, char **);
-main()
+int main()
{
char buf[4096];
int r1 = tgetent(buf, "vt100");
@@ -1407,7 +1406,7 @@ main()
tgetstr("cl", &u);
creat("conftest.tgetent", 0640);
}
- exit((r1 != r2) || r2 == -1);
+ return((r1 != r2) || r2 == -1);
}
]])],[if test -f conftest.tgetent; then
zsh_cv_func_tgetent_accepts_null=yes
@@ -1421,10 +1420,9 @@ AC_CACHE_CHECK(if tgetent returns 0 on success,
zsh_cv_func_tgetent_zero_success,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <fcntl.h>
-#include <stdlib.h>
int tgetent(char *, char*);
char *tgetstr(char *, char **);
-main()
+int main()
{
char buf[4096];
int r1 = tgetent(buf, "!@#$%^&*");
@@ -1435,7 +1433,7 @@ main()
tgetstr("cl", &u);
creat("conftest.tgetent0", 0640);
}
- exit(r1 == r2);
+ return(r1 == r2);
}
]])],[if test -f conftest.tgetent0; then
zsh_cv_func_tgetent_zero_success=yes
@@ -1869,8 +1867,7 @@ zsh_cv_rlim_t_is_longer,
#include <sys/time.h>
#endif
#include <sys/resource.h>
-#include <stdlib.h>
-main(){struct rlimit r;exit(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
+int main(){struct rlimit r;return(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
if test x$zsh_cv_rlim_t_is_longer = xyes; then
AC_CACHE_CHECK(if rlim_t is a quad,
zsh_cv_rlim_t_is_quad_t,
@@ -1880,13 +1877,12 @@ if test x$zsh_cv_rlim_t_is_longer = xyes; then
#endif
#include <stdio.h>
#include <sys/resource.h>
-#include <stdlib.h>
-main() {
+int main() {
struct rlimit r;
char buf[20];
r.rlim_cur = 0;
sprintf(buf, "%qd", r.rlim_cur);
- exit(strcmp(buf, "0"));
+ return(strcmp(buf, "0"));
}]])],[zsh_cv_rlim_t_is_quad_t=yes],[zsh_cv_rlim_t_is_quad_t=no],[zsh_cv_rlim_t_is_quad_t=no])])
if test x$zsh_cv_rlim_t_is_quad_t = xyes; then
AC_DEFINE(RLIM_T_IS_QUAD_T)
@@ -1903,8 +1899,7 @@ else
#include <sys/time.h>
#endif
#include <sys/resource.h>
-#include <stdlib.h>
- main(){struct rlimit r;r.rlim_cur=-1;exit(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
+ int main(){struct rlimit r;r.rlim_cur=-1;return(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
if test x$zsh_cv_type_rlim_t_is_unsigned = xyes; then
AC_DEFINE(RLIM_T_IS_UNSIGNED)
DEFAULT_RLIM_T="unsigned $DEFAULT_RLIM_T"
@@ -2187,9 +2182,8 @@ zsh_cv_sys_fifo,
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
-#include <stdlib.h>
#include <sys/stat.h>
-main()
+int main()
{
char c;
int fd;
@@ -2200,18 +2194,18 @@ main()
#else
if(mknod("/tmp/fifo$$", 0010600, 0) < 0)
#endif
- exit(1);
+ return(1);
pid = fork();
if(pid < 0)
- exit(1);
+ return(1);
if(pid) {
fd = open("/tmp/fifo$$", O_RDONLY);
- exit(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
+ return(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
}
fd = open("/tmp/fifo$$", O_WRONLY);
ret = (fd < 0 || write(fd, "x", 1) < 1);
unlink("/tmp/fifo$$");
- exit(ret);
+ return(ret);
}
]])],[zsh_cv_sys_fifo=yes],[zsh_cv_sys_fifo=no],[zsh_cv_sys_fifo=yes])
])
@@ -2289,8 +2283,7 @@ zsh_cv_sys_link,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <unistd.h>
#include <fcntl.h>
-#include <stdlib.h>
-main()
+int main()
{
int ret;
char *tmpfile, *newfile;
@@ -2299,11 +2292,11 @@ main()
unlink(tmpfile);
unlink(newfile);
if(creat(tmpfile, 0644) < 0)
- exit(1);
+ return(1);
ret = link(tmpfile, newfile);
unlink(tmpfile);
unlink(newfile);
- exit(ret<0);
+ return(ret<0);
}
]])],[zsh_cv_sys_link=yes],[zsh_cv_sys_link=no],[zsh_cv_sys_link=yes])])
AH_TEMPLATE([HAVE_LINK],
@@ -2322,12 +2315,11 @@ zsh_cv_sys_killesrch,
#include <unistd.h>
#include <signal.h>
#include <errno.h>
-#include <stdlib.h>
-main()
+int main()
{
int pid = (getpid() + 10000) & 0xffffff;
while (pid && (kill(pid, 0) == 0 || errno != ESRCH)) pid >>= 1;
- exit(errno!=ESRCH);
+ return(errno!=ESRCH);
}
]])],[zsh_cv_sys_killesrch=yes],[zsh_cv_sys_killesrch=no],[zsh_cv_sys_killesrch=yes])])
AH_TEMPLATE([BROKEN_KILL_ESRCH],
@@ -2348,12 +2340,11 @@ if test x$signals_style = xPOSIX_SIGNALS; then
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <signal.h>
#include <unistd.h>
-#include <stdlib.h>
int child=0;
void handler(sig)
int sig;
{if(sig==SIGCHLD) child=1;}
-main() {
+int main() {
struct sigaction act;
sigset_t set;
int pid, ret;
@@ -2368,7 +2359,7 @@ main() {
if(pid>0) {
sigemptyset(&set);
ret=sigsuspend(&set);
- exit(child==0);
+ return(child==0);
}
}
]])],[zsh_cv_sys_sigsuspend=yes],[zsh_cv_sys_sigsuspend=no],[zsh_cv_sys_sigsuspend=yes])])
@@ -2400,15 +2391,14 @@ case "x$zsh_working_tcsetpgrp" in
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
-#include <stdlib.h>
-main() {
+int main() {
int fd;
int ret;
fd=open("/dev/tty", O_RDWR);
- if (fd < 0) exit(2);
+ if (fd < 0) return(2);
ret=tcsetpgrp(fd, tcgetpgrp(fd));
- if (ret < 0) exit(1);
- exit(0);
+ if (ret < 0) return(1);
+ return(0);
}
]])],[zsh_cv_sys_tcsetpgrp=yes],[
case $? in
@@ -2448,7 +2438,7 @@ if test x$ac_cv_func_getpwnam = xyes; then
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
-main() {
+int main() {
struct passwd *pw1, *pw2;
char buf[1024], name[1024];
sprintf(buf, "%d:%d", getpid(), rand());
@@ -2456,7 +2446,7 @@ main() {
if (pw1) strcpy(name, pw1->pw_name);
sprintf(buf, "%d:%d", rand(), getpid());
pw2=getpwnam(buf);
- exit(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
+ return(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
}
]])],[zsh_cv_sys_getpwnam_faked=no],[zsh_cv_sys_getpwnam_faked=yes],[zsh_cv_sys_getpwnam_faked=no])])
if test x$zsh_cv_sys_getpwnam_faked = xyes; then
@@ -2775,20 +2765,17 @@ elif test "x$dynamic" = xyes; then
zsh_cv_sys_elf,
[AC_RUN_IFELSE([AC_LANG_SOURCE([[/* Test for whether ELF binaries are produced */
#include <fcntl.h>
-#include <stdlib.h>
#include <unistd.h>
-main(argc, argv)
-int argc;
-char *argv[];
+int main(int argc, char *argv[])
{
char b[4];
int i = open(argv[0],O_RDONLY);
if(i == -1)
- exit(1); /* fail */
+ return(1); /* fail */
if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
- exit(0); /* succeed (yes, it's ELF) */
+ return(0); /* succeed (yes, it's ELF) */
else
- exit(1); /* fail */
+ return(1); /* fail */
}]])],[zsh_cv_sys_elf=yes],[zsh_cv_sys_elf=no],[zsh_cv_sys_elf=yes])])
# We use [0-9]* in case statements, so need to change quoting
@@ -2924,13 +2911,12 @@ LDFLAGS="$old_LDFLAGS")
AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
zsh_cv_func_dlsym_needs_underscore,
[echo failed >conftestval && cat >conftest.c <<EOM
-fred () { }
+void fred () { }
EOM
AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&AS_MESSAGE_LOG_FD) &&
AC_TRY_COMMAND($DLLD $LDFLAGS $DLLDFLAGS -o conftest.$DL_EXT conftest.o 1>&AS_MESSAGE_LOG_FD) &&
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <stdio.h>
-#include <stdlib.h>
#ifdef HPUX10DYNAMIC
#include <dl.h>
#define RTLD_LAZY BIND_DEFERRED
@@ -2957,16 +2943,16 @@ char *zsh_gl_sym_addr ;
extern int fred() ;
-main()
+int main()
{
void * handle ;
void * symbol ;
FILE *f=fopen("conftestval", "w");
- if (!f) exit(1);
+ if (!f) return(1);
handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
if (handle == NULL) {
fprintf (f, "dlopen failed") ;
- exit(1);
+ return(1);
}
symbol = dlsym(handle, "fred") ;
if (symbol == NULL) {
@@ -2974,13 +2960,13 @@ main()
symbol = dlsym(handle, "_fred") ;
if (symbol == NULL) {
fprintf (f, "dlsym failed") ;
- exit(1);
+ return(1);
}
fprintf (f, "yes") ;
}
else
fprintf (f, "no") ;
- exit(0);
+ return(0);
}]])],[zsh_cv_func_dlsym_needs_underscore=`cat conftestval`],[zsh_cv_func_dlsym_needs_underscore=failed
dynamic=no],[zsh_cv_func_dlsym_needs_underscore=no])])
if test "x$zsh_cv_func_dlsym_needs_underscore" = xyes; then

View file

@ -0,0 +1,69 @@
From a84fdd7c8f77935ecce99ff2b0bdba738821ed79 Mon Sep 17 00:00:00 2001
From: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Mon, 26 Jun 2023 17:13:04 +0900
Subject: [PATCH] 51889: fix module loading problem with full RELRO
If full RELRO (relocation read-only, one of the security enhancement
methods for ELF-based systems) is used when building zsh (as in binary
packages of most Linuxes), loading a module (e.g. zsh/zftp) fails unless
all the modules it depends on are already loaded. With this patch the
necessary modules are automatically loaded.
Upstream-commit: a84fdd7c8f77935ecce99ff2b0bdba738821ed79
Signed-off-by: Lukáš Zaoral <lzaoral@redhat.com>
---
Src/Modules/zftp.c | 2 +-
Src/mkbltnmlst.sh | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/Src/Modules/zftp.c b/Src/Modules/zftp.c
index 49b3ffa89..47a5e9de9 100644
--- a/Src/Modules/zftp.c
+++ b/Src/Modules/zftp.c
@@ -3172,7 +3172,7 @@ static struct features module_features = {
int
setup_(UNUSED(Module m))
{
- return (require_module("zsh/net/tcp", NULL, 0) == 1);
+ return 0;
}
/**/
diff --git a/Src/mkbltnmlst.sh b/Src/mkbltnmlst.sh
index c4611d8b3..067ecdaf9 100644
--- a/Src/mkbltnmlst.sh
+++ b/Src/mkbltnmlst.sh
@@ -76,6 +76,30 @@ for x_mod in $x_mods; do
test "x$linked" = xno && echo "#endif"
done
+# if dynamic module 'mod' with load=no has moddeps in its .mdd,
+# then output add_dep(mod, dep) for each 'dep' in moddeps.
+dyn_mods="`grep ' link=dynamic .* load=no ' $CFMOD | \
+ sed -e '/^#/d' -e 's/ .*/ /' -e 's/^name=/ /'`"
+
+for mod in $dyn_mods; do
+ modfile="`grep '^name='$mod' ' $CFMOD | \
+ sed -e 's/^.* modfile=//' -e 's/ .*//'`"
+ if test "x$modfile" = x; then
+ echo >&2 "WARNING: no name for \`$mod' in $CFMOD (ignored)"
+ continue
+ fi
+ unset moddeps
+ . $srcdir/../$modfile
+ if test -n "$moddeps"; then
+ echo '#ifdef DYNAMIC'
+ echo "/* non-linked-in known module \`$mod' */"
+ for dep in $moddeps; do
+ echo " add_dep(\"$mod\", \"$dep\");"
+ done
+ echo '#endif'
+ fi
+done
+
echo
done_mods=" "
for bin_mod in $bin_mods; do
--
2.41.0

View file

@ -0,0 +1,64 @@
From 1b421e4978440234fb73117c8505dad1ccc68d46 Mon Sep 17 00:00:00 2001
From: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Mon, 26 Sep 2022 10:52:50 +0900
Subject: [PATCH] 50658 + test: Enable to switch between C/UTF-8 locales in
PCRE
---
Src/Modules/pcre.c | 10 ++--------
Test/V07pcre.ztst | 11 +++++++++++
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c
index 6289e003e..46875a59b 100644
--- a/Src/Modules/pcre.c
+++ b/Src/Modules/pcre.c
@@ -47,8 +47,6 @@ zpcre_utf8_enabled(void)
#if defined(MULTIBYTE_SUPPORT) && defined(HAVE_NL_LANGINFO) && defined(CODESET)
static int have_utf8_pcre = -1;
- /* value can toggle based on MULTIBYTE, so don't
- * be too eager with caching */
if (have_utf8_pcre < -1)
return 0;
@@ -56,15 +54,11 @@ zpcre_utf8_enabled(void)
return 0;
if ((have_utf8_pcre == -1) &&
- (!strcmp(nl_langinfo(CODESET), "UTF-8"))) {
-
- if (pcre_config(PCRE_CONFIG_UTF8, &have_utf8_pcre))
+ (pcre_config(PCRE_CONFIG_UTF8, &have_utf8_pcre))) {
have_utf8_pcre = -2; /* erk, failed to ask */
}
- if (have_utf8_pcre < 0)
- return 0;
- return have_utf8_pcre;
+ return (have_utf8_pcre == 1) && (!strcmp(nl_langinfo(CODESET), "UTF-8"));
#else
return 0;
diff --git a/Test/V07pcre.ztst b/Test/V07pcre.ztst
index ca13419e5..22a0b64c7 100644
--- a/Test/V07pcre.ztst
+++ b/Test/V07pcre.ztst
@@ -162,3 +162,14 @@
echo $match[2] )
0:regression for segmentation fault, workers/38307
>test
+
+ LANG_SAVE=$LANG
+ [[ é =~ '^.\z' ]]; echo $?
+ LANG=C
+ [[ é =~ '^..\z' ]]; echo $?
+ LANG=$LANG_SAVE
+ [[ é =~ '^.\z' ]]; echo $?
+0:swich between C/UTF-8 locales
+>0
+>0
+>0
--
2.41.0

View file

@ -0,0 +1,641 @@
From b62e911341c8ec7446378b477c47da4256053dc0 Mon Sep 17 00:00:00 2001
From: Oliver Kiddle <opk@zsh.org>
Date: Sat, 13 May 2023 00:53:32 +0200
Subject: [PATCH] 51723: migrate pcre module to pcre2
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
---
Src/Modules/pcre.c | 223 ++++++++++++++++++---------------------------
Test/V07pcre.ztst | 13 ++-
configure.ac | 20 ++--
3 files changed, 109 insertions(+), 149 deletions(-)
diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c
index 46875a59b..079ecc2c5 100644
--- a/Src/Modules/pcre.c
+++ b/Src/Modules/pcre.c
@@ -34,11 +34,11 @@
#define CPCRE_PLAIN 0
/**/
-#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC)
-#include <pcre.h>
+#if defined(HAVE_PCRE2_COMPILE_8) && defined(HAVE_PCRE2_H)
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
-static pcre *pcre_pattern;
-static pcre_extra *pcre_hints;
+static pcre2_code *pcre_pattern;
/**/
static int
@@ -54,8 +54,8 @@ zpcre_utf8_enabled(void)
return 0;
if ((have_utf8_pcre == -1) &&
- (pcre_config(PCRE_CONFIG_UTF8, &have_utf8_pcre))) {
- have_utf8_pcre = -2; /* erk, failed to ask */
+ (pcre2_config(PCRE2_CONFIG_UNICODE, &have_utf8_pcre))) {
+ have_utf8_pcre = -2; /* erk, failed to ask */
}
return (have_utf8_pcre == 1) && (!strcmp(nl_langinfo(CODESET), "UTF-8"));
@@ -69,115 +69,87 @@ zpcre_utf8_enabled(void)
static int
bin_pcre_compile(char *nam, char **args, Options ops, UNUSED(int func))
{
- int pcre_opts = 0, pcre_errptr, target_len;
- const char *pcre_error;
+ uint32_t pcre_opts = 0;
+ int target_len;
+ int pcre_error;
+ PCRE2_SIZE pcre_offset;
char *target;
- if(OPT_ISSET(ops,'a')) pcre_opts |= PCRE_ANCHORED;
- if(OPT_ISSET(ops,'i')) pcre_opts |= PCRE_CASELESS;
- if(OPT_ISSET(ops,'m')) pcre_opts |= PCRE_MULTILINE;
- if(OPT_ISSET(ops,'x')) pcre_opts |= PCRE_EXTENDED;
- if(OPT_ISSET(ops,'s')) pcre_opts |= PCRE_DOTALL;
+ if (OPT_ISSET(ops, 'a')) pcre_opts |= PCRE2_ANCHORED;
+ if (OPT_ISSET(ops, 'i')) pcre_opts |= PCRE2_CASELESS;
+ if (OPT_ISSET(ops, 'm')) pcre_opts |= PCRE2_MULTILINE;
+ if (OPT_ISSET(ops, 'x')) pcre_opts |= PCRE2_EXTENDED;
+ if (OPT_ISSET(ops, 's')) pcre_opts |= PCRE2_DOTALL;
if (zpcre_utf8_enabled())
- pcre_opts |= PCRE_UTF8;
-
-#ifdef HAVE_PCRE_STUDY
- if (pcre_hints)
-#ifdef PCRE_CONFIG_JIT
- pcre_free_study(pcre_hints);
-#else
- pcre_free(pcre_hints);
-#endif
- pcre_hints = NULL;
-#endif
+ pcre_opts |= PCRE2_UTF;
if (pcre_pattern)
- pcre_free(pcre_pattern);
+ pcre2_code_free(pcre_pattern);
pcre_pattern = NULL;
target = ztrdup(*args);
unmetafy(target, &target_len);
- if ((int)strlen(target) != target_len) {
- zwarnnam(nam, "embedded NULs in PCRE pattern terminate pattern");
- }
-
- pcre_pattern = pcre_compile(target, pcre_opts, &pcre_error, &pcre_errptr, NULL);
+ pcre_pattern = pcre2_compile((PCRE2_SPTR) target, (PCRE2_SIZE) target_len,
+ pcre_opts, &pcre_error, &pcre_offset, NULL);
free(target);
if (pcre_pattern == NULL)
{
- zwarnnam(nam, "error in regex: %s", pcre_error);
+ PCRE2_UCHAR buffer[256];
+ pcre2_get_error_message(pcre_error, buffer, sizeof(buffer));
+ zwarnnam(nam, "error in regex: %s", buffer);
return 1;
}
return 0;
}
-/**/
-#ifdef HAVE_PCRE_STUDY
-
/**/
static int
bin_pcre_study(char *nam, UNUSED(char **args), UNUSED(Options ops), UNUSED(int func))
{
- const char *pcre_error;
-
if (pcre_pattern == NULL)
{
zwarnnam(nam, "no pattern has been compiled for study");
return 1;
}
-
- if (pcre_hints)
-#ifdef PCRE_CONFIG_JIT
- pcre_free_study(pcre_hints);
-#else
- pcre_free(pcre_hints);
-#endif
- pcre_hints = NULL;
- pcre_hints = pcre_study(pcre_pattern, 0, &pcre_error);
- if (pcre_error != NULL)
- {
- zwarnnam(nam, "error while studying regex: %s", pcre_error);
- return 1;
+ int jit = 0;
+ if (!pcre2_config(PCRE2_CONFIG_JIT, &jit) && jit) {
+ if (pcre2_jit_compile(pcre_pattern, PCRE2_JIT_COMPLETE) < 0) {
+ zwarnnam(nam, "error while studying regex");
+ return 1;
+ }
}
return 0;
}
-/**/
-#else /* !HAVE_PCRE_STUDY */
-
-# define bin_pcre_study bin_notavail
-
-/**/
-#endif /* !HAVE_PCRE_STUDY */
-
-/**/
static int
-zpcre_get_substrings(char *arg, int *ovec, int captured_count, char *matchvar,
- char *substravar, int want_offset_pair, int matchedinarr,
- int want_begin_end)
+zpcre_get_substrings(char *arg, pcre2_match_data *mdata, int captured_count,
+ char *matchvar, char *substravar, int want_offset_pair,
+ int matchedinarr, int want_begin_end)
{
- char **captures, *match_all, **matches;
+ PCRE2_SIZE *ovec;
+ char *match_all, **matches;
char offset_all[50];
int capture_start = 1;
if (matchedinarr) {
- /* bash-style captures[0] entire-matched string in the array */
+ /* bash-style ovec[0] entire-matched string in the array */
capture_start = 0;
}
- /* captures[0] will be entire matched string, [1] first substring */
- if (!pcre_get_substring_list(arg, ovec, captured_count, (const char ***)&captures)) {
- int nelem = arrlen(captures)-1;
+ /* ovec[0] will be entire matched string, [1] first substring */
+ ovec = pcre2_get_ovector_pointer(mdata);
+ if (ovec) {
+ int nelem = captured_count - 1;
/* Set to the offsets of the complete match */
if (want_offset_pair) {
- sprintf(offset_all, "%d %d", ovec[0], ovec[1]);
+ sprintf(offset_all, "%ld %ld", ovec[0], ovec[1]);
setsparam("ZPCRE_OP", ztrdup(offset_all));
}
/*
@@ -186,7 +158,7 @@ zpcre_get_substrings(char *arg, int *ovec, int captured_count, char *matchvar,
* ovec is length 2*(1+capture_list_length)
*/
if (matchvar) {
- match_all = metafy(captures[0], ovec[1] - ovec[0], META_DUP);
+ match_all = metafy(arg + ovec[0], ovec[1] - ovec[0], META_DUP);
setsparam(matchvar, match_all);
}
/*
@@ -201,16 +173,12 @@ zpcre_get_substrings(char *arg, int *ovec, int captured_count, char *matchvar,
*/
if (substravar &&
(!want_begin_end || nelem)) {
- char **x, **y;
+ char **x;
int vec_off, i;
- y = &captures[capture_start];
matches = x = (char **) zalloc(sizeof(char *) * (captured_count+1-capture_start));
- for (i = capture_start; i < captured_count; i++, y++) {
+ for (i = capture_start; i < captured_count; i++) {
vec_off = 2*i;
- if (*y)
- *x++ = metafy(*y, ovec[vec_off+1]-ovec[vec_off], META_DUP);
- else
- *x++ = NULL;
+ *x++ = metafy(arg + ovec[vec_off], ovec[vec_off+1]-ovec[vec_off], META_DUP);
}
*x = NULL;
setaparam(substravar, matches);
@@ -247,7 +215,8 @@ zpcre_get_substrings(char *arg, int *ovec, int captured_count, char *matchvar,
setiparam("MEND", offs + !isset(KSHARRAYS) - 1);
if (nelem) {
char **mbegin, **mend, **bptr, **eptr;
- int i, *ipair;
+ int i;
+ size_t *ipair;
bptr = mbegin = zalloc(sizeof(char*)*(nelem+1));
eptr = mend = zalloc(sizeof(char*)*(nelem+1));
@@ -287,8 +256,6 @@ zpcre_get_substrings(char *arg, int *ovec, int captured_count, char *matchvar,
setaparam("mend", mend);
}
}
-
- pcre_free_substring_list((const char **)captures);
}
return 0;
@@ -314,7 +281,8 @@ getposint(char *instr, char *nam)
static int
bin_pcre_match(char *nam, char **args, Options ops, UNUSED(int func))
{
- int ret, capcount, *ovec, ovecsize, c;
+ int ret, c;
+ pcre2_match_data *pcre_mdata = NULL;
char *matched_portion = NULL;
char *plaintext = NULL;
char *receptacle = NULL;
@@ -344,36 +312,30 @@ bin_pcre_match(char *nam, char **args, Options ops, UNUSED(int func))
/* For the entire match, 'Return' the offset byte positions instead of the matched string */
if(OPT_ISSET(ops,'b')) want_offset_pair = 1;
- if ((ret = pcre_fullinfo(pcre_pattern, pcre_hints, PCRE_INFO_CAPTURECOUNT, &capcount)))
- {
- zwarnnam(nam, "error %d in fullinfo", ret);
- return 1;
- }
-
- ovecsize = (capcount+1)*3;
- ovec = zalloc(ovecsize*sizeof(int));
-
plaintext = ztrdup(*args);
unmetafy(plaintext, &subject_len);
if (offset_start > 0 && offset_start >= subject_len)
- ret = PCRE_ERROR_NOMATCH;
- else
- ret = pcre_exec(pcre_pattern, pcre_hints, plaintext, subject_len, offset_start, 0, ovec, ovecsize);
+ ret = PCRE2_ERROR_NOMATCH;
+ else {
+ pcre_mdata = pcre2_match_data_create_from_pattern(pcre_pattern, NULL);
+ ret = pcre2_match(pcre_pattern, (PCRE2_SPTR) plaintext, subject_len,
+ offset_start, 0, pcre_mdata, NULL);
+ }
if (ret==0) return_value = 0;
- else if (ret==PCRE_ERROR_NOMATCH) /* no match */;
+ else if (ret == PCRE2_ERROR_NOMATCH) /* no match */;
else if (ret>0) {
- zpcre_get_substrings(plaintext, ovec, ret, matched_portion, receptacle,
+ zpcre_get_substrings(plaintext, pcre_mdata, ret, matched_portion, receptacle,
want_offset_pair, 0, 0);
return_value = 0;
}
else {
- zwarnnam(nam, "error in pcre_exec [%d]", ret);
+ zwarnnam(nam, "error in pcre2_match [%d]", ret);
}
- if (ovec)
- zfree(ovec, ovecsize*sizeof(int));
+ if (pcre_mdata)
+ pcre2_match_data_free(pcre_mdata);
zsfree(plaintext);
return return_value;
@@ -383,17 +345,19 @@ bin_pcre_match(char *nam, char **args, Options ops, UNUSED(int func))
static int
cond_pcre_match(char **a, int id)
{
- pcre *pcre_pat;
- const char *pcre_err;
+ pcre2_code *pcre_pat = NULL;
+ int pcre_err;
+ PCRE2_SIZE pcre_erroff;
char *lhstr, *rhre, *lhstr_plain, *rhre_plain, *avar, *svar;
- int r = 0, pcre_opts = 0, pcre_errptr, capcnt, *ov, ovsize;
+ int r = 0, pcre_opts = 0;
+ pcre2_match_data *pcre_mdata = NULL;
int lhstr_plain_len, rhre_plain_len;
int return_value = 0;
if (zpcre_utf8_enabled())
- pcre_opts |= PCRE_UTF8;
+ pcre_opts |= PCRE2_UTF;
if (isset(REMATCHPCRE) && !isset(CASEMATCH))
- pcre_opts |= PCRE_CASELESS;
+ pcre_opts |= PCRE2_CASELESS;
lhstr = cond_str(a,0,0);
rhre = cond_str(a,1,0);
@@ -401,9 +365,6 @@ cond_pcre_match(char **a, int id)
rhre_plain = ztrdup(rhre);
unmetafy(lhstr_plain, &lhstr_plain_len);
unmetafy(rhre_plain, &rhre_plain_len);
- pcre_pat = NULL;
- ov = NULL;
- ovsize = 0;
if (isset(BASHREMATCH)) {
svar = NULL;
@@ -415,27 +376,27 @@ cond_pcre_match(char **a, int id)
switch(id) {
case CPCRE_PLAIN:
- if ((int)strlen(rhre_plain) != rhre_plain_len) {
- zwarn("embedded NULs in PCRE pattern terminate pattern");
- }
- pcre_pat = pcre_compile(rhre_plain, pcre_opts, &pcre_err, &pcre_errptr, NULL);
- if (pcre_pat == NULL) {
- zwarn("failed to compile regexp /%s/: %s", rhre, pcre_err);
+ if (!(pcre_pat = pcre2_compile((PCRE2_SPTR) rhre_plain,
+ (PCRE2_SIZE) rhre_plain_len, pcre_opts,
+ &pcre_err, &pcre_erroff, NULL)))
+ {
+ PCRE2_UCHAR buffer[256];
+ pcre2_get_error_message(pcre_err, buffer, sizeof(buffer));
+ zwarn("failed to compile regexp /%s/: %s", rhre, buffer);
break;
}
- pcre_fullinfo(pcre_pat, NULL, PCRE_INFO_CAPTURECOUNT, &capcnt);
- ovsize = (capcnt+1)*3;
- ov = zalloc(ovsize*sizeof(int));
- r = pcre_exec(pcre_pat, NULL, lhstr_plain, lhstr_plain_len, 0, 0, ov, ovsize);
- /* r < 0 => error; r==0 match but not enough size in ov
+ pcre_mdata = pcre2_match_data_create_from_pattern(pcre_pat, NULL);
+ r = pcre2_match(pcre_pat, (PCRE2_SPTR8) lhstr_plain, lhstr_plain_len,
+ 0, 0, pcre_mdata, NULL);
+ /* r < 0 => error; r==0 match but not enough size in match data
* r > 0 => (r-1) substrings found; r==1 => no substrings
*/
if (r==0) {
- zwarn("reportable zsh problem: pcre_exec() returned 0");
+ zwarn("reportable zsh problem: pcre2_match() returned 0");
return_value = 1;
break;
}
- else if (r==PCRE_ERROR_NOMATCH) {
+ else if (r == PCRE2_ERROR_NOMATCH) {
return_value = 0; /* no match */
break;
}
@@ -444,7 +405,7 @@ cond_pcre_match(char **a, int id)
break;
}
else if (r>0) {
- zpcre_get_substrings(lhstr_plain, ov, r, svar, avar, 0,
+ zpcre_get_substrings(lhstr_plain, pcre_mdata, r, svar, avar, 0,
isset(BASHREMATCH),
!isset(BASHREMATCH));
return_value = 1;
@@ -457,10 +418,10 @@ cond_pcre_match(char **a, int id)
free(lhstr_plain);
if(rhre_plain)
free(rhre_plain);
+ if (pcre_mdata)
+ pcre2_match_data_free(pcre_mdata);
if (pcre_pat)
- pcre_free(pcre_pat);
- if (ov)
- zfree(ov, ovsize*sizeof(int));
+ pcre2_code_free(pcre_pat);
return return_value;
}
@@ -489,11 +450,11 @@ static struct builtin bintab[] = {
static struct features module_features = {
bintab, sizeof(bintab)/sizeof(*bintab),
-#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC)
+#if defined(HAVE_PCRE2_COMPILE_8) && defined(HAVE_PCRE2_H)
cotab, sizeof(cotab)/sizeof(*cotab),
-#else /* !(HAVE_PCRE_COMPILE && HAVE_PCRE_EXEC) */
+#else /* !(HAVE_PCRE2_COMPILE_8 && HAVE_PCRE2_H) */
NULL, 0,
-#endif /* !(HAVE_PCRE_COMPILE && HAVE_PCRE_EXEC) */
+#endif /* !(HAVE_PCRE2_COMPILE_8 && HAVE_PCRE2_H) */
NULL, 0,
NULL, 0,
0
@@ -540,19 +501,9 @@ cleanup_(Module m)
int
finish_(UNUSED(Module m))
{
-#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC)
-#ifdef HAVE_PCRE_STUDY
- if (pcre_hints)
-#ifdef PCRE_CONFIG_JIT
- pcre_free_study(pcre_hints);
-#else
- pcre_free(pcre_hints);
-#endif
- pcre_hints = NULL;
-#endif
-
+#if defined(HAVE_PCRE2_COMPILE_8) && defined(HAVE_PCRE2_H)
if (pcre_pattern)
- pcre_free(pcre_pattern);
+ pcre2_code_free(pcre_pattern);
pcre_pattern = NULL;
#endif
diff --git a/Test/V07pcre.ztst b/Test/V07pcre.ztst
index 22a0b64c7..6eb366964 100644
--- a/Test/V07pcre.ztst
+++ b/Test/V07pcre.ztst
@@ -117,12 +117,17 @@
>78884; ZPCRE_OP: 25 30
>90210; ZPCRE_OP: 31 36
-# Embedded NULs allowed in plaintext, but not in RE (although \0 as two-chars allowed)
+# Embedded NULs allowed in plaintext, in RE, pcre supports \0 as two-chars
[[ $'a\0bc\0d' =~ '^(a\0.)(.+)$' ]]
print "${#MATCH}; ${#match[1]}; ${#match[2]}"
0:ensure ASCII NUL passes in and out of matched plaintext
>6; 3; 3
+# PCRE2 supports NULs also in the RE
+ [[ $'a\0b\0c' =~ $'^(.\0)+' ]] && print "${#MATCH}; ${#match[1]}"
+0:ensure ASCII NUL works also in the regex
+>4; 2
+
# Ensure the long-form infix operator works
[[ foo -pcre-match ^f..$ ]]
print $?
@@ -169,7 +174,11 @@
[[ é =~ '^..\z' ]]; echo $?
LANG=$LANG_SAVE
[[ é =~ '^.\z' ]]; echo $?
-0:swich between C/UTF-8 locales
+0:switch between C/UTF-8 locales
>0
>0
>0
+
+ [[ abc =~ 'a(d*)bc' ]] && print "$#MATCH; $#match; ${#match[1]}"
+0:empty capture
+>3; 1; 0
diff --git a/configure.ac b/configure.ac
index d8a17791a..4710d1659 100644
--- a/configure.ac
+++ b/configure.ac
@@ -438,7 +438,7 @@ fi],
dnl Do you want to look for pcre support?
AC_ARG_ENABLE(pcre,
-AS_HELP_STRING([--enable-pcre],[enable the search for the pcre library (may create run-time library dependencies)]))
+AS_HELP_STRING([--enable-pcre],[enable the search for the pcre2 library (may create run-time library dependencies)]))
dnl Do you want to look for capability support?
AC_ARG_ENABLE(cap,
@@ -652,13 +652,12 @@ AC_HEADER_SYS_WAIT
oldcflags="$CFLAGS"
if test x$enable_pcre = xyes; then
-AC_CHECK_PROG([PCRECONF], pcre-config, pcre-config)
-dnl Typically (meaning on this single RedHat 9 box in front of me)
-dnl pcre-config --cflags produces a -I output which needs to go into
+AC_CHECK_PROG([PCRECONF], pcre2-config, pcre2-config)
+dnl pcre2-config --cflags may produce a -I output which needs to go into
dnl CPPFLAGS else configure's preprocessor tests don't pick it up,
dnl producing a warning.
-if test "x$ac_cv_prog_PCRECONF" = xpcre-config; then
- CPPFLAGS="$CPPFLAGS `pcre-config --cflags`"
+if test "x$ac_cv_prog_PCRECONF" = xpcre2-config; then
+ CPPFLAGS="$CPPFLAGS `pcre2-config --cflags`"
fi
fi
@@ -668,9 +667,10 @@ AC_CHECK_HEADERS(sys/time.h sys/times.h sys/select.h termcap.h termio.h \
locale.h errno.h stdio.h stdarg.h varargs.h stdlib.h \
unistd.h sys/capability.h \
utmp.h utmpx.h sys/types.h pwd.h grp.h poll.h sys/mman.h \
- netinet/in_systm.h pcre.h langinfo.h wchar.h stddef.h \
+ netinet/in_systm.h langinfo.h wchar.h stddef.h \
sys/stropts.h iconv.h ncurses.h ncursesw/ncurses.h \
ncurses/ncurses.h)
+AC_CHECK_HEADERS([pcre2.h],,,[#define PCRE2_CODE_UNIT_WIDTH 8])
if test x$dynamic = xyes; then
AC_CHECK_HEADERS(dlfcn.h)
AC_CHECK_HEADERS(dl.h)
@@ -948,9 +948,7 @@ if test "x$ac_found_iconv" = "xyes"; then
fi
if test x$enable_pcre = xyes; then
-dnl pcre-config should probably be employed here
-dnl AC_SEARCH_LIBS(pcre_compile, pcre)
- LIBS="`$ac_cv_prog_PCRECONF --libs` $LIBS"
+ LIBS="`$ac_cv_prog_PCRECONF --libs8` $LIBS"
fi
dnl ---------------------
@@ -1313,7 +1311,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
pathconf sysconf \
tgetent tigetflag tigetnum tigetstr setupterm initscr resize_term \
getcchar setcchar waddwstr wget_wch win_wch use_default_colors \
- pcre_compile pcre_study pcre_exec \
+ pcre2_compile_8 \
nl_langinfo \
erand48 open_memstream \
posix_openpt \
--
2.41.0
From 10bdbd8b5b0b43445aff23dcd412f25cf6aa328a Mon Sep 17 00:00:00 2001
From: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Tue, 20 Jun 2023 18:14:27 +0900
Subject: [PATCH] 51877: do not build pcre module if pcre2-config is not found
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
---
Src/Modules/pcre.mdd | 2 +-
configure.ac | 31 +++++++++++++++++++------------
2 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/Src/Modules/pcre.mdd b/Src/Modules/pcre.mdd
index 6eb3c691b..3e1579117 100644
--- a/Src/Modules/pcre.mdd
+++ b/Src/Modules/pcre.mdd
@@ -1,5 +1,5 @@
name=zsh/pcre
-link=`if test x$enable_pcre = xyes && (pcre-config --version >/dev/null 2>/dev/null); then echo dynamic; else echo no; fi`
+link=`if test x$enable_pcre = xyes; then echo dynamic; else echo no; fi`
load=no
autofeatures="b:pcre_compile b:pcre_study b:pcre_match"
diff --git a/configure.ac b/configure.ac
index ba76f9a60..c5263035e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -440,6 +440,17 @@ dnl Do you want to look for pcre support?
AC_ARG_ENABLE(pcre,
AS_HELP_STRING([--enable-pcre],[enable the search for the pcre2 library (may create run-time library dependencies)]))
+AC_ARG_VAR(PCRE_CONFIG, [pathname of pcre2-config if it is not in PATH])
+if test "x$enable_pcre" = xyes; then
+ AC_CHECK_PROG([PCRE_CONFIG], pcre2-config, pcre2-config)
+ if test "x$PCRE_CONFIG" = x; then
+ enable_pcre=no
+ AC_MSG_WARN([pcre2-config not found: pcre module is disabled.])
+ AC_MSG_NOTICE(
+ [Set PCRE_CONFIG to pathname of pcre2-config if it is not in PATH.])
+ fi
+fi
+
dnl Do you want to look for capability support?
AC_ARG_ENABLE(cap,
AS_HELP_STRING([--enable-cap],[enable the search for POSIX capabilities (may require additional headers to be added by hand)]))
@@ -655,15 +666,12 @@ AC_HEADER_DIRENT
AC_HEADER_STAT
AC_HEADER_SYS_WAIT
-oldcflags="$CFLAGS"
-if test x$enable_pcre = xyes; then
-AC_CHECK_PROG([PCRECONF], pcre2-config, pcre2-config)
dnl pcre2-config --cflags may produce a -I output which needs to go into
dnl CPPFLAGS else configure's preprocessor tests don't pick it up,
dnl producing a warning.
-if test "x$ac_cv_prog_PCRECONF" = xpcre2-config; then
- CPPFLAGS="$CPPFLAGS `pcre2-config --cflags`"
-fi
+if test "x$enable_pcre" = xyes; then
+ CPPFLAGS="`$PCRE_CONFIG --cflags` $CPPFLAGS"
+ AC_CHECK_HEADERS([pcre2.h],,,[#define PCRE2_CODE_UNIT_WIDTH 8])
fi
AC_CHECK_HEADERS(sys/time.h sys/times.h sys/select.h termcap.h termio.h \
@@ -675,7 +683,6 @@ AC_CHECK_HEADERS(sys/time.h sys/times.h sys/select.h termcap.h termio.h \
netinet/in_systm.h langinfo.h wchar.h stddef.h \
sys/stropts.h iconv.h ncurses.h ncursesw/ncurses.h \
ncurses/ncurses.h)
-AC_CHECK_HEADERS([pcre2.h],,,[#define PCRE2_CODE_UNIT_WIDTH 8])
if test x$dynamic = xyes; then
AC_CHECK_HEADERS(dlfcn.h)
AC_CHECK_HEADERS(dl.h)
@@ -952,10 +959,6 @@ if test "x$ac_found_iconv" = "xyes"; then
[Define as const if the declaration of iconv() needs const.])
fi
-if test x$enable_pcre = xyes; then
- LIBS="`$ac_cv_prog_PCRECONF --libs8` $LIBS"
-fi
-
dnl ---------------------
dnl CHECK TERMCAP LIBRARY
dnl ---------------------
@@ -1316,7 +1319,6 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
pathconf sysconf \
tgetent tigetflag tigetnum tigetstr setupterm initscr resize_term \
getcchar setcchar waddwstr wget_wch win_wch use_default_colors \
- pcre2_compile_8 \
nl_langinfo \
erand48 open_memstream \
posix_openpt \
@@ -1371,6 +1373,11 @@ if test x$zsh_cv_func_realpath_accepts_null = xyes; then
AC_DEFINE(REALPATH_ACCEPTS_NULL)
fi
+if test x$enable_pcre = xyes; then
+ LIBS="`$PCRE_CONFIG --libs8` $LIBS"
+ AC_CHECK_FUNCS(pcre2_compile_8)
+fi
+
if test x$enable_cap = xyes; then
AC_CHECK_FUNCS(cap_get_proc)
fi
--
2.42.0

View file

@ -0,0 +1,53 @@
From ecd3f9c9506c7720dc6c0833dc5d5eb00e4459c4 Mon Sep 17 00:00:00 2001
From: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Mon, 19 Jun 2023 11:19:25 +0900
Subject: [PATCH] 51862: support texinfo-7.0
Upstream-commit: ecd3f9c9506c7720dc6c0833dc5d5eb00e4459c4
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
---
Doc/Makefile.in | 3 ++-
configure.ac | 5 +++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/Doc/Makefile.in b/Doc/Makefile.in
index 136b080d6..dabe11fe3 100644
--- a/Doc/Makefile.in
+++ b/Doc/Makefile.in
@@ -43,6 +43,7 @@ TEXI2DVI = @TEXI2DVI@
DVIPS = dvips
TEXI2PDF = @TEXI2PDF@
TEXI2HTML = @TEXI2HTML@
+SET_TEXI2ANY_VAR = @SET_TEXI2ANY_VAR@
PAPERSIZE = @PAPERSIZE@
.SUFFIXES: .yo .1
@@ -266,7 +267,7 @@ texi2html.conf: $(sdir_top)/Config/version.mk
d=`echo $(VERSION_DATE)`; \
v="<font size=\"-1\">Zsh version $(VERSION), released on $$d.</font>"; \
case '$(TEXI2HTML)' in \
- *texi2any*) echo "set_from_init_file('PRE_BODY_CLOSE','$$v');" ;; \
+ *texi2any*) echo "$(SET_TEXI2ANY_VAR)('PRE_BODY_CLOSE','$$v');" ;; \
*) echo "\$$PRE_BODY_CLOSE = '$$v';" ;; \
esac > $@
diff --git a/configure.ac b/configure.ac
index 4710d1659..ba76f9a60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -623,7 +623,12 @@ fi
if test x"$TEXI2HTML" = xtexi2any; then
TEXI2HTML='texi2any -c TEXI2HTML=1'
+ case `texi2any --version 2>/dev/null | sed -e 's/^.*) *//' -e 1q` in
+ [[1-6]].*) SET_TEXI2ANY_VAR=set_from_init_file ;;
+ *) SET_TEXI2ANY_VAR=texinfo_set_from_init_file ;;
+ esac
fi
+AC_SUBST(SET_TEXI2ANY_VAR)
case "$LC_PAPER" in
??_US*) PAPERSIZE=us ;;
--
2.42.0

View file

@ -0,0 +1,44 @@
Avoid incompatible pointer types in terminfo global variable checks.
Some compilers reject these incompatible pointer types, causing the
checks to always fail, when these variables are in fact available.
Submitted upstream: <https://www.zsh.org/mla/workers/2023/msg01112.html>
diff --git a/configure.ac b/configure.ac
index a58242f453b4a8f3..5534f42df14eb28c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1769,27 +1769,27 @@ if test x$zsh_cv_path_term_header != xnone; then
fi
AC_MSG_CHECKING(if boolcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = boolcodes; puts(*test);]])],[AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes],[boolcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)boolcodes; puts(*test);]])],[AC_DEFINE(HAVE_BOOLCODES) boolcodes=yes],[boolcodes=no])
AC_MSG_RESULT($boolcodes)
AC_MSG_CHECKING(if numcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = numcodes; puts(*test);]])],[AC_DEFINE(HAVE_NUMCODES) numcodes=yes],[numcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)numcodes; puts(*test);]])],[AC_DEFINE(HAVE_NUMCODES) numcodes=yes],[numcodes=no])
AC_MSG_RESULT($numcodes)
AC_MSG_CHECKING(if strcodes is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = strcodes; puts(*test);]])],[AC_DEFINE(HAVE_STRCODES) strcodes=yes],[strcodes=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)strcodes; puts(*test);]])],[AC_DEFINE(HAVE_STRCODES) strcodes=yes],[strcodes=no])
AC_MSG_RESULT($strcodes)
AC_MSG_CHECKING(if boolnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = boolnames; puts(*test);]])],[AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes],[boolnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)boolnames; puts(*test);]])],[AC_DEFINE(HAVE_BOOLNAMES) boolnames=yes],[boolnames=no])
AC_MSG_RESULT($boolnames)
AC_MSG_CHECKING(if numnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = numnames; puts(*test);]])],[AC_DEFINE(HAVE_NUMNAMES) numnames=yes],[numnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)numnames; puts(*test);]])],[AC_DEFINE(HAVE_NUMNAMES) numnames=yes],[numnames=no])
AC_MSG_RESULT($numnames)
AC_MSG_CHECKING(if strnames is available)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = strnames; puts(*test);]])],[AC_DEFINE(HAVE_STRNAMES) strnames=yes],[strnames=no])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[$term_includes]], [[char **test = (char **)strnames; puts(*test);]])],[AC_DEFINE(HAVE_STRNAMES) strnames=yes],[strnames=no])
AC_MSG_RESULT($strnames)
dnl There are apparently defective terminal library headers on some

View file

@ -0,0 +1,42 @@
From d3edf318306e37d2d96c4e4ea442d10207722e94 Mon Sep 17 00:00:00 2001
From: Bart Schaefer <schaefer@zsh.org>
Date: Sun, 12 Feb 2023 09:52:39 -0800
Subject: [PATCH] 51404: Nullify filelist after deleting (fix segfault)
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
Upstream-commit: d3edf318306e37d2d96c4e4ea442d10207722e94
---
Src/jobs.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/Src/jobs.c b/Src/jobs.c
index 4863962b9..59ddd952e 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1372,8 +1372,10 @@ cleanfilelists(void)
DPUTS(shell_exiting >= 0, "BUG: cleanfilelists() before exit");
- for (i = 1; i <= maxjob; i++)
+ for (i = 1; i <= maxjob; i++) {
deletefilelist(jobtab[i].filelist, 0);
+ jobtab[i].filelist = 0;
+ }
}
/**/
@@ -1531,8 +1533,10 @@ havefiles(void)
int i;
for (i = 1; i <= maxjob; i++)
- if (jobtab[i].stat && jobtab[i].filelist)
+ if (jobtab[i].stat && jobtab[i].filelist &&
+ peekfirst(jobtab[i].filelist)) {
return 1;
+ }
return 0;
}
--
2.43.0

846
0009-zsh-support-dnf5.patch Normal file
View file

@ -0,0 +1,846 @@
commit b70b241cc5ca88cc129ff9ba14f8af2e889b90e6
Author: Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
Date: Thu Nov 21 12:26:51 2024 +0900
53238 (+53239 Mikael): support dnf5
some options etc for dnf4 are also updated
diff --git a/Completion/Redhat/Command/_dnf b/Completion/Redhat/Command/_dnf
index a5edf8564..c41795adf 100644
--- a/Completion/Redhat/Command/_dnf
+++ b/Completion/Redhat/Command/_dnf
@@ -1,7 +1,11 @@
-#compdef dnf dnf-2 dnf-3
-#
-# based on dnf-4.2.18
-#
+#compdef dnf dnf-2 dnf-3 dnf4
+# based on dnf-4.21.1
+
+# avoid 'dnf --version' since it's rather slow for dnf4
+if [[ $service = dnf && $commands[dnf]:P = */dnf5 ]]; then
+ _dnf5 "$@" && return 0
+ return 1
+fi
_dnf_helper() {
# Get the pathname of the python executable from the 1st line of dnf-2/dnf-3.
@@ -68,25 +72,23 @@ _dnf_packages_or_rpms() {
fi
}
-_dnf_groups_caching_policy() {
- # TODO: Are there any reliable ways to validate the cache?
- local -a newer=( "$1"(Nmw-1) ) # rebuild if more than a week old
- return $#newer
-}
-
_dnf_groups() {
- local package_groups update_policy expl
- zstyle -s ":completion:${curcontext}:" cache-policy update_policy
- if [[ -z "$update_policy" ]]; then
- zstyle ":completion:${curcontext}:" cache-policy _dnf_groups_caching_policy
- fi
- if _cache_invalid dnf-groups || ! _retrieve_cache dnf-groups; then
- # this can be very slow
- package_groups=( ${${${(M)${(f)"$(_call_program package-groups \
- $service group list -v 2>/dev/null)"}:# *}#*\(}%\)*} )
- _store_cache dnf-groups package_groups
- fi
- _wanted package-groups expl 'package group' compadd "$@" -a package_groups
+ # optional option: -T (available|installed)
+ local selected line groups section=none
+ zparseopts -D -E - T:=selected
+ selected=$selected[2]
+ [[ -z $selected ]] && selected=all
+ # XXX hidden groups are not included.
+ # --installed and --available can't be specified with --hidden
+ for line in ${(f)"$(_call_program package-groups
+ $service group list --$selected -qCv 2>/dev/null)"}; do
+ # a line for each group is of the following form:
+ # ' description of the group (group-id)'
+ if [[ $line = \ ##(#b)(*)\(([-_[:alnum:]]#)\) ]]; then
+ groups+=( "${match[2]}:${match[1]}" )
+ fi
+ done
+ _describe -t groups "$selected group" groups
}
_dnf_repoquery() {
@@ -194,7 +196,7 @@ _dnf_repository_packages() {
fi
}
-_dnf() {
+_dnf4() {
local cache_file="/var/cache/dnf/packages.db"
local -a opts=(
'(-6)-4[resolve to IPv4 addresses only]'
@@ -226,7 +228,7 @@ _dnf() {
'*'{-x+,--exclude=}'[exclude specified packages]: : _sequence _dnf_packages -T all'
'--forcearch=[force the use of the specified arch]:arch: '
'(-)'{-h,--help}'[show the help message]'
- '--installroot=[set install root]:directory:_files -/'
+ '--installroot=[set install root]:directory:_files -/ -g "/*"'
'--newpackage[include newpackage relevant packages]'
'--noautoremove[disable removal of dependencies that are no longer used]'
'--nobest[do not limit transactions to best candidates]'
@@ -289,18 +291,21 @@ _dnf_command() {
if (( CURRENT == 1 )); then
_describe -t dnf-commands 'dnf command' dnf_cmds
else
- local curcontext=$curcontext cur=$words[CURRENT] cmd tmp expl ret=1
+ local cur=$words[CURRENT] cmd=$words[1] tmp expl ret=1
# Deal with aliases (not comprehensive)
- case $words[1] in
+ case $cmd in
check-updgrade) cmd=check-update;;
distrosync|dsync) cmd=distro-sync;;
dg) cmd=downgrade;;
+ dsync) cmd=distro-sync;;
erase|rm) cmd=remove;;
groups|grp) cmd=group;;
hist) cmd=history;;
in) cmd=install;;
+ if) cmd=info;;
+ ls) cmd=list;;
mc) cmd=makecache;;
- prov|whatprovides) cmd=provides;;
+ prov|whatprovides|wp) cmd=provides;;
rei) cmd=reinstall;;
repoinfo) cmd=repolist;;
rq) cmd=repoquery;;
@@ -308,9 +313,9 @@ _dnf_command() {
sh) cmd=shell;;
update|up) cmd=upgrade;;
update-minimal|up-min) cmd=upgrade-minimal;;
- *) cmd="${${dnf_cmds[(r)$words[1]:*]%%:*}}";;
+ upif) cmd=updateinfo;;
esac
- (( $#cmd )) && curcontext="${curcontext%:*:*}:dnf-${cmd}:"
+ local curcontext="${curcontext%:*:*}:dnf-${cmd}:"
case $cmd in
alias)
@@ -337,11 +342,9 @@ _dnf_command() {
_describe -t options 'option' tmp && ret=0
;;
check-update)
- if [[ $cur = -* ]]; then
- _wanted options expl 'option' compadd - --changelogs && ret=0
- else
- _dnf_packages -T installed && ret=0
- fi
+ _arguments : \
+ '--changelogs[also print changelog delta of packages]' \
+ '*: :_dnf_packages -T installed' && ret=0
;;
clean)
tmp=(
@@ -368,23 +371,38 @@ _dnf_command() {
"mark:mark a group for installation or removal"
)
_describe -t subcommands 'subcommand' tmp && ret=0
- elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then
- if [[ $words[2] == install ]]; then
- _wanted options expl 'option' compadd - --with-optional && ret=0
- elif [[ $words[2] == list ]]; then
- tmp=(
- '--available:show only available groups'
- '--installed:show only installed groups'
- '--hidden:show also hidden groups'
- '--ids:show also ID of groups'
- )
- _describe -t options 'option' tmp && ret=0
- fi
- elif (( CURRENT == 3 )) && [[ $words[2] == mark ]]; then
- _wanted subcommands expl 'subcommand' \
- compadd - install remove && ret=0
else
- _dnf_groups && ret=0
+ case $words[2] in
+ summary)
+ _arguments : '--hidden' '2: :_dnf_groups' && ret=0
+ ;;
+ info)
+ _dnf_groups && ret=0
+ ;;
+ install)
+ _arguments : '--with-optional[also include optional packages]' \
+ '*: :_dnf_groups -T available' && ret=0
+ ;;
+ list)
+ _arguments : \
+ '(--installed)--available[show only available groups]' \
+ '(--available)--installed[show only installed groups]' \
+ '--hidden[show also hidden groups]' \
+ {--ids,-v}'[show also ID of groups]' \
+ '*: :_dnf_groups' && ret=0
+ ;;
+ remove|upgrade)
+ _dnf_groups -T installed && ret=0
+ ;;
+ mark)
+ if (( CURRENT == 3 )); then
+ _wanted subcommands expl 'subcommand' \
+ compadd - install remove && ret=0
+ else
+ _dnf_groups && ret=0
+ fi
+ ;;
+ esac
fi
;;
help)
@@ -399,13 +417,32 @@ _dnf_command() {
"list:list transactions"
"info:describe the given transactions"
"redo:repeat the specified transaction"
+ "replay:replay transaction stored in the specified file"
"rollback:undo all since the given transaction"
+ "store:store the specified transaction in file"
"undo:undo transactions"
"userinstalled:list all packages installed by users"
)
_describe -t subcommands 'subcommand' tmp && ret=0
- elif [[ $words[2] != userinstalled ]]; then
- _message 'transaction' && ret=0
+ else
+ case $words[2] in
+ list)
+ _arguments : '--reverse[output history in reverse order]' \
+ '*:transaction ID or ID..ID: ' && ret=0 ;;
+ info)
+ _message 'transaction ID or ID..ID' && ret=0 ;;
+ redo|rollback|undo)
+ _message 'transaction or package' && ret=0 ;;
+ replay)
+ _arguments : \
+ "--ignore-installed[don't check for installed packages being in the same state as recorded in transaction]" \
+ "--ignore-extras[don't check for extra packages pulled into the transaction on the target system]" \
+ '--skip-unavailable[skip packages that are in transaction but not in target system]' \
+ '2:transaction file:_files' && ret=0 ;;
+ store)
+ _arguments : {-o+,--output=}'[store in specified file]: :_files' \
+ '2:transaction: ' && ret=0 ;;
+ esac
fi
;;
info|list)
@@ -413,7 +450,7 @@ _dnf_command() {
if [[ $cur = -* ]]; then
tmp=( --all --available --installed --extras
--obsoletes --upgrades --autoremove --recent )
- _wanted options expl 'option' compadd -a tmp
+ _wanted options expl 'option' compadd -a tmp && ret=0
else
_dnf_packages -T all && ret=0
fi
@@ -449,6 +486,7 @@ _dnf_command() {
tmp=(
'install:install a module profile including its packages'
'update:update packages associated with an active module stream'
+ 'switch-to:switch to a module stream and change versions of installed packages'
'remove:remove installed module profiles and their packages'
'enable:enable a module stream'
'disable:disable a module with all its streams'
@@ -502,7 +540,7 @@ _dnf_command() {
_dnf_repoquery && ret=0
;;
repository-packages)
- _dnf_repository_packages
+ _dnf_repository_packages && ret=0
;;
search)
if [[ $cur = -* ]]; then
@@ -531,6 +569,7 @@ _dnf_command() {
'--list[display list of advisories]'
'--info[display detailed information of advisories]'
+ '(availability)'
+ '-all[include advisories about any versions of installed packages]'
'--available[limit to advisories about newer versions of installed packages]'
'--installed[limit to advisories about equal or older versions of installed packages]'
'--updates[limit to advisories about newer and available versions of installed packages]'
@@ -548,4 +587,4 @@ _dnf_command() {
fi
}
-_dnf "$@"
+_dnf4 "$@"
diff --git a/Completion/Redhat/Command/_dnf5 b/Completion/Redhat/Command/_dnf5
new file mode 100644
index 000000000..e194dd5a7
--- /dev/null
+++ b/Completion/Redhat/Command/_dnf5
@@ -0,0 +1,570 @@
+#compdef dnf5
+# based on dnf-5.2.6.2
+
+# utility functions
+
+_dnf5_helper() {
+ _call_program specs $service "${(q-)@}" "${(q-)PREFIX}\*" \
+ -qC --assumeno --nogpgcheck 2>/dev/null </dev/null
+}
+
+_dnf5_repositories() {
+ # required option: -T (all|disabled|enabled)
+ local selected expl
+ zparseopts -D -E - T:=selected
+ selected=$selected[2]
+ _wanted $selected-repositories expl "$selected repository" \
+ compadd "$@" - "${(@)${(f)$(_dnf5_helper repo list --$selected)}[2,-1]%% *}"
+}
+
+_dnf5_packages() {
+ # required option: -T (all|available|installed|upgradable)
+ local selected opt expl
+ zparseopts -D -E - T:=selected
+ selected=$selected[2]
+ case $selected in
+ all) opt='' ;; # option --all does not exist
+ upgradable) opt='--upgrades' ;;
+ *) opt="--$selected" ;;
+ esac
+ _wanted $selected-packages expl "$selected package" \
+ compadd "$@" - $(_dnf5_helper repoquery $opt --qf='%{name} ')
+}
+
+_dnf5_rpm_files() {
+ local expl
+ _wanted rpm-files expl 'rpm file' _files -g '(#i)*.rpm(-.)'
+}
+
+_dnf5_packages_or_rpms() {
+ if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
+ _dnf_rpm_files
+ else
+ _dnf5_packages "$@"
+ fi
+}
+
+_dnf5_groups() {
+ # optional option: -T (available|installed)
+ local update_policy selected line pat groups
+ zparseopts -D -E - T:=selected
+ selected=$selected[2]
+ if [[ -z $selected ]]; then
+ selected=all
+ opt= # option --all does not exist
+ else
+ opt=--$selected
+ fi
+ # XXX hidden groups are not included
+ for line in ${${(f)"$(_dnf5_helper group list $opt)"}[2,-1]}; do
+ line=( ${(z)line} )
+ groups+=( "$line[1]:$line[2,-2]" )
+ done
+ _describe -t $selected-groups "$selected group" groups
+}
+
+_dnf5_environments() {
+ local line envs
+ for line in ${${(f)"$(_dnf5_helper environment list)"}[2,-1]}; do
+ line=( ${(z)line} )
+ envs+=( "$line[1]:$line[2,-2]" )
+ done
+ _describe -t environments 'environment' envs
+}
+
+# completers for (several) dnf commands
+
+_dnf5-advisory () {
+ _arguments : \
+ $advisory_opts \
+ '--contains-pkgs=[only show advisories containing specified packages]: : _sequence _dnf5_packages -T installed' \
+ + '(with)' \
+ '--with-cve[show only advisories referencing CVE ticket]' \
+ '--with-bz[show only advisories referencing Bugzilla ticket]' \
+ + '(type)' \
+ '--all[show all advisories]' \
+ '--available[show advisories containing newer versions of installed packages (default)]' \
+ '--installed[show advisories containing equal and older version of installed packages]' \
+ '--updates[show advisories containing upgradable packages]' \
+ + args \
+ ':subcommand:(list info summary)' '*:advisory spec:'
+}
+
+_dnf5-group() {
+ local -a tmp
+ if (( CURRENT == 2 )); then
+ tmp=(
+ 'list:list all matching groups'
+ 'info:print detailed information about groups'
+ 'install:install packages from specified groups'
+ 'remove:remove removable packages in specified groups'
+ 'upgrade:upgrade specified groups and packages in them'
+ )
+ _describe -t subcommands 'subcommand' tmp
+ else
+ case $words[2] in
+ list|info)
+ tmp=(
+ '(--installed)--available[show only available groups]'
+ '(--available)--installed[show only installed groups]'
+ '--hidden[show also hidden groups]'
+ '--contains-pkgs=[show only groups containing specified packages]: : _sequence _dnf5_packages -T all'
+ '*: : _dnf5_groups'
+ )
+ ;;
+ install)
+ tmp=( $common_opts
+ '--with-optional[include optional packages from the groups]'
+ '*: : _dnf5_groups -T available' )
+ ;|
+ upgrade)
+ tmp=( ${common_opts:#--skip-broken*}
+ '*: : _dnf5_groups -T installed' )
+ ;|
+ remove)
+ tmp=( $offline_opts
+ '*: : _dnf5_groups -T installed' )
+ ;|
+ install|remove)
+ tmp+=( '--no-packages[operate on groups only, not manipulate any packages]' )
+ ;|
+ install|upgrade)
+ tmp+=( $downgrade_opts )
+ ;;
+ esac
+ _arguments : $tmp
+ fi
+}
+
+_dnf5-history() {
+ local -a tmp
+ if (( CURRENT == 2 )); then
+ tmp=(
+ 'list:list info about recorded transactions'
+ 'info:print detailed about specific transactions'
+ 'undo:revert all actions from the specified transaction'
+ 'redo:repeat the specified transaction'
+ 'rollback:undo all transactions performed after the specified transaction'
+ 'store:store the transaction into a directory'
+ )
+ _describe -t subcommands 'subcommand' tmp
+ else
+ case $words[2] in
+ list|info)
+ tmp=( '--reverse[reverse the order of transactions in output]' )
+ ;;
+ undo|rollback|redo)
+ tmp=( '--skip-unavailable[allow skipping impossible actions]' )
+ ;|
+ undo|rollback)
+ tmp+=( $replay_opts )
+ ;;
+ store)
+ tmp=( {-o,--output=}'[directory for storing the transaction (default ./transaction)]: : _directories')
+ esac
+ _arguments : $tmp '2:transaction:( )'
+ fi
+}
+
+_dnf5-mark() {
+ local -a tmp
+ if (( CURRENT == 2 )); then
+ tmp=(
+ 'user:mark the package as user-installed'
+ 'dependency:mark the package as a dependency'
+ 'weak:mark the package as a weak dependency'
+ 'group:mark the package as installed by the specified group'
+ )
+ _describe -t subcommands 'subcommand' tmp
+ else
+ tmp=(
+ '--skip-unavailable[skip packages not installed on the system]'
+ '--store=[store the transaction in specified directory]: : _directories'
+ )
+ if [[ $words[2] = group ]]; then
+ tmp+=( '2:group-id: _dnf5_groups -T installed' )
+ fi
+ _arguments : $tmp '*: : _dnf5_packages -T installed'
+ fi
+}
+
+_dnf5-module() {
+ local -a tmp
+ if (( CURRENT == 2 )); then
+ tmp=(
+ 'list:list module streams'
+ 'info:print details about module streams'
+ 'enable:enable module streams'
+ 'disable:disable modules including all their streams'
+ "reset:reset module state so it's no longer enabled or disabled"
+ )
+ _describe -t subcommands 'subcommand' tmp
+ elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then
+ case $words[2] in
+ list|info) tmp=( --enabled --disabled ) ;;
+ enable) tmp=( --skip-broken --skip-unavailable ) ;;
+ *) tmp=( --skip-unavailable ) ;;
+ esac
+ _wanted options expl 'option' compadd -a tmp
+ else
+ _message 'module spec'
+ fi
+}
+
+_dnf5-offline() { # also used by the 'system-upgrade' command
+ local -a tmp
+ if (( CURRENT == 2 )); then
+ tmp=(
+ 'clean:remove any stored offline transactions and cached packages'
+ 'log:list boots during which offline transaction was attempted'
+ 'reboot:prepare the system for offline transaction and reboot'
+ )
+ if [[ $cmd = offline ]]; then
+ tmp+=( 'status:show status of the current offline transaction' )
+ else
+ tmp+=( 'download:download all packages needed for upgrade' )
+ fi
+ _describe -t subcommands 'subcommand' tmp && ret=0
+ else
+ case $words[2] in
+ download)
+ _arguments : \
+ '--releasever=[the version to upgrade to]:version number:' \
+ '--no-downgrade:do not install packages older than currently installed' '*: :' && ret=0
+ ;;
+ log)
+ _arguments : \
+ '--number=[show log of transaction specified by number]:transaction number:' '*: :' && ret=0
+ ;;
+ reboot)
+ _wanted options expl 'option' compadd -- --poweroff && ret=0
+ ;;
+ esac
+ fi
+}
+
+_dnf5-repoquery() {
+ local v
+ local -a opts=(
+ $advisory_opts
+ '--arch=[limit results to specified architectures]:list of archs: '
+ '--available[limit results to available packages]'
+ '--disable-modular-filtering[include packages of inactive module streams]'
+ '--duplicates[limit to installed duplicate packages]'
+ '--exactdeps[limit to packages that require capability specified by ==what{requires,depends}]'
+ '--extras[limit to installed packages that are not present in any available repository]'
+ '--file=[limit results to packages which own specified file]:list of files: _sequence _files'
+ '--installed[query installed packages]'
+ '--installonly[limit to installed installonly packages]'
+ '--latest-limit=[limit to latest packages of specified number]:number:'
+ '--leaves[limit to groups of installed packages not required by other installed packages]'
+ '--providers-of=[select packages that provide specified attribute]:attribute:(conflicts depends enhances obsoletes provides recommends requires requires_pre suggests supplement)'
+ '--recent[limit to only recently changed packages]'
+ '--recursive[make --whatrequires/--providers-of work recursively]'
+ '--security[limit to packages in security advisories]'
+ '--srpm[use the corresponding source RPM]'
+ '--unneeded[limit to unneeded installed packages]'
+ '--upgrades[limit to available packages that provide upgrade for installed packages]'
+ '--userinstalled[limit to packages that are not installed as dependencies]'
+ '--whatdepends=[limit to packages that require, enhance, recommend, suggest of supplement specified capability]:list of capability:'
+ '--whatconflicts=[limit to packages that conflicts with specified capabilities]:list of capability: '
+ )
+ for v in enhance obsolete provide recommend require suggest supplement; do
+ opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ")
+ done
+ # mutually exclusive formating options
+ opts+=(
+ + '(format)'
+ '--conflicts[display capabilities that the package conflicts with]'
+ '--depends[display capabilities that the package depends on, enables, recommends, suggests or supplements]'
+ '--files[show files in the package]'
+ '--requires-pre[display capabilities required to run pre/post scripts of the package]'
+ '--sourcerpm[display source RPM of the package]'
+ '--location[display location of the package]'
+ '--info[show detailed information about the package]'
+ '--changelogs[print the package changelogs]'
+ '(- *)--querytags[list tags recognized by --queryformat]'
+ '--queryformat=[specify output format]:format:'
+ )
+ for v in enhance obsolete provide recommend require suggest supplement; do
+ opts+=( "--${v}s[display capabilities ${v}ed by the package]" )
+ done
+
+ _arguments : '*: : _dnf5_packages -T all' $opts
+}
+
+# dnf commands
+
+_dnf5_commands() {
+ local -a dnf_cmds=(
+ 'advisory:manage advisories'
+ 'autoremove:remove unneeded packages'
+ 'check:check for problems in package database'
+ 'check-upgrade:check for available package upgrades'
+ 'clean:remove or invalidate cached data'
+ 'distro-sync:up/downgrade installed packages to the latest available'
+ 'downgrade:downgrade packages'
+ 'download:download packages'
+ 'environment:manage comps environments'
+ 'group:manage comps groups'
+ 'history:manage transaction history'
+ 'info:provide detailed information about packages'
+ 'install:install packages'
+ 'leaves:list groups of leaf packages'
+ 'list:list installed or available packages'
+ 'makecache:generate the metadata cache'
+ 'mark:change the reason of an installed package'
+ 'module:manage modules'
+ 'offline:manage offline transactions'
+ 'provides:find what package provides the given value'
+ 'reinstall:reinstall packages'
+ 'remove:remove packages'
+ 'replay:replay stored transactions'
+ 'repo:manage repositories'
+ 'repoquery:search for packages in repositories'
+ 'search:search for packages using keywords'
+ 'swap:remove software and install another in the single transaction'
+ 'system-upgrade:upgrade the system to a new major release'
+ 'upgrade:upgrade packages'
+ 'versionlock:protect packages from updates to newer versions'
+ )
+ _describe -t dnf-commands 'dnf command' dnf_cmds
+}
+
+# subcommands and options
+
+_dnf5_subcmds_opts() {
+ local cur=$words[CURRENT] cmd=$words[1] expl ret=1
+ local -a tmp
+ # common options
+ local -a offline_opts=(
+ '(--store)--offline[store the transaction to be performed offline]'
+ '(--offline)--store=[store the transaction in specified directory]: : _directories'
+ )
+ local -a common_opts=(
+ $offline_opts
+ '--allowerasing[allow erasing of installed packages]'
+ '--skip-broken[resolve dependency problems by skipping problematic packages]'
+ "--skip-unavailable[skip packages that can't be synchronized]"
+ '--downloadonly[download packages without executing transaction]'
+ )
+ local -a advisory_opts=(
+ '--advisories=[consider only specified advisories]:list of advisories:'
+ '--advisory-severities=[limit to advisories with specified severity]:severity:_sequence compadd - critical important moderate low none'
+ '--bzs=[limit to advisories that fix specified Bugzilla ID]:list of Bugzilla ID:'
+ '--cves=[limit to advisories that fix specified CVE ID]:list of CVD ID]:'
+ '--security[limit to security advisories]'
+ '--bugfix[limit to bugfix advisories]'
+ '--enhancement[limit to enhancement advisories]'
+ '--newpackage[limit to newpackage advisories]'
+ )
+ local -a downgrade_opts=(
+ '(--no-allow-downgrade)--allow-downgrade[enable downgrade of dependencies]'
+ '(--allow-downgrade)--no-allow-downgrade[disable downgrade of dependencies]'
+ )
+ local -a replay_opts=(
+ '--ignore-extras[not consider extra packages]'
+ '--ignore-installed[mismatches between installed and stored transaction are not errors]'
+ )
+ # Deal with some aliases (not comprehensive)
+ case $cmd in
+ check-updgrade) cmd=check-update;;
+ dg) cmd=downgrade;;
+ dsync) cmd=distro-sync;;
+ grp) cmd=group;;
+ if) cmd=info;;
+ in) cmd=install;;
+ ls) cmd=list;;
+ mc) cmd=makecache;;
+ rei) cmd=reinstall;;
+ rm) cmd=remove ;;
+ rq) cmd=repoquery;;
+ se) cmd=search;;
+ update|up) cmd=upgrade;;
+ esac
+ local curcontext="${curcontext%:*:*}:dnf-${cmd}:"
+
+ case $cmd in
+ advisory|group|history|mark|module|offline|repoquery)
+ _dnf5-$cmd && ret=0
+ ;;
+ system-upgrade)
+ _dnf5-offline && ret=0
+ ;;
+ autoremove)
+ _arguments : $offline_opts && ret=0
+ ;;
+ check)
+ _arguments : \
+ '--dependencies[show missing dependencies and conflicts]' \
+ '--duplicates[show duplicated packages]' \
+ '--obsoleted[show obsoleted packages]' && ret=0
+ ;;
+ check-upgrade)
+ _arguments : \
+ $advisory_opts \
+ '--changelogs[print package changelogs]' \
+ '--minimal[reports the lowest versions of packages that fix advisories]' \
+ '*: : _dnf5_packages -T installed' && ret=0
+ ;;
+ clean)
+ tmp=(
+ 'dbcache:remove cache files generated from the repository metadata'
+ 'expire-cache:mark the repository metadata expired'
+ 'metadata:remove the repository metadata'
+ 'packages:remove any cached packages'
+ 'all:clean all'
+ )
+ _describe -t cache-types 'cache type' tmp && ret=0
+ ;;
+ distro-sync)
+ _arguments : $common_opts '*: : _dnf5_packages -T installed' && ret=0
+ ;;
+ downgrade)
+ _arguments : \
+ $common_opts $downgrade_opts \
+ '*: : _dnf5_packages -T installed' && ret=0
+ ;;
+ download)
+ _arguments : \
+ '--arch=[limit to packages of specified architecture]:list of architectures:' \
+ '--resolve[resolve and download needed dependencies]' \
+ '--alldeps[with --resolve, also download already installed dependencies]' \
+ '--destdir=[download to the specified directory]: : _directories' \
+ '--srpm[download the source rpm]' \
+ '--url[print the list of URLs where the rpms can be downloaded]' \
+ '*--urlprotocol=[with --url, limit to specified protocols]:protocol:_sequence compadd - http https ftp file' \
+ '*: : _dnf5_packages -T all' && ret=0
+ ;;
+ environment)
+ _arguments : \
+ '--available[show only available environments]' \
+ '--installed[show only installed environments]' \
+ ':subcommand:(list info)' \
+ '*: : _dnf5_environments' && ret=0
+ ;;
+ info|list)
+ _arguments : \
+ '--showduplicates[show all versions of the packages]' \
+ '*: : _dnf5_packages -T all' \
+ + '(type)' \
+ '--installed[list only installed packages]:*: : _dnf5_packages -T installed' \
+ '--available[list only available packages]:*: : _dnf5_packages -T available' \
+ '--extras[list only extras]' \
+ '--obsoletes[list only installed but obsoleted packages]:*: : _dnf5_packages -T installed' \
+ '--recent[list only recently added packages]' \
+ '--upgrades[list only available upgrades of installed packages]:*: : _dnf5_packages -T upgradable' \
+ '--autoremove[list only packages that will be autoremoved]:*: : _dnf5_packages -T installed' &&ret=0
+ ;;
+ install)
+ _arguments : \
+ $common_opts $downgrade_opts $advisory_opts \
+ '*: : _dnf5_packages_or_rpms -T available' && ret=0
+ ;;
+ leaves|makecache)
+ # nothing to complete
+ ;;
+ provides)
+ _files && ret=0
+ ;;
+ reinstall)
+ _arguments : \
+ $common_opts $downgrade_opts \
+ '*: : _dnf5_packages_or_rpms -T installed' && ret=0
+ ;;
+ remove)
+ _arguments : \
+ $offline_opts \
+ '--no-autoremove[not remove dependencies that are no longer used]' \
+ '*: : _dnf5_packages -T installed' && ret=0
+ ;;
+ replay)
+ _arguments : \
+ $replay_opts \
+ ':transaction path:_directories' && ret=0
+ ;;
+ repo)
+ _arguments : \
+ '--all[show info about all repositories]' \
+ '--enabled[show info only about enabled repositories]' \
+ '--disabled[show info only about disabled repositories]' \
+ ':subcommand:(list info)' && ret=0
+ ;;
+ search)
+ _arguments : \
+ '--all[search patterns also inside description and URL fields]' \
+ '--showduplicates[show all versions of packages, not only the latest ones]' \
+ '*:search pattern:' && ret=0
+ ;;
+ swap)
+ _arguments : \
+ $offline_opts \
+ '--allowerasing[allow erasing of installed packages]' \
+ ': : _dnf5_packages -T installed' \
+ ': : _dnf5_packages -T available' && ret=0
+ ;;
+ upgrade)
+ _arguments : \
+ ${common_opts:#--skip-broken*} $downgrade_opts $advisory_opts \
+ '--minimal[upgrade only to the lowest available versions that fix advisories]' \
+ '--destdir=[specify directory into which downloading packages]: : _directories' \
+ '*: : _dnf5_packages_or_rpms -T upgradable' && ret=0
+ ;;
+ versionlock)
+ _arguments : \
+ ':subcommand:(add exclude clear delete list)' \
+ '*: : _dnf5_packages -T all' && ret=0
+ ;;
+ esac
+ return ret
+}
+
+# main completer
+
+_dnf5() {
+ local curcontext="$curcontext" state state_descr line ret=1
+ typeset -A opt_args
+ local -a opts=(
+ '(-y --assumeyes)--assumeno[answer no for all questions]'
+ '--best[try the best available package version]'
+ '(-C --cacheonly)'{-C,--cacheonly}"[run entirely from system cache, don't update cache]"
+ '--comment=[add comment to transaction history]:comment:'
+ '(-c --config)'{-c+,--config=}'[specify configuration file]:config file:_files'
+ '--debugsolver[dump detailed solving results in file ./debugdata]'
+ '*--disable-plugin=[disable specified plugins]:list of plugin names:'
+ '(--repo)*--disable-repo=[disable specified repos]: : _sequence _dnf5_repositories -T enabled'
+ '--dump-main-config[print main configuration values to stdout]'
+ '*--dump-repo-config=[print repository configuration values to stdout]:repi id'
+ '--dump-variables[print variable values to stdout]'
+ '*--enable-plugin=[enable specified plugins]:list of plugin names:'
+ '*--enable-repo=[enable additional repos]: : _sequence _dnf5_repositories -T disabled'
+ '--forcearch=[force the use of the specified arch]:arch:'
+ '(-)'{-h,--help}'[show the help message]'
+ '--installroot=[set install root]: : _directories'
+ '--no-best[do not limit transactions to best candidates]'
+ '--no-docs[do not install documentation]'
+ '--no-gpgcheck[skip checking GPG signatures on packages]'
+ '--no-plugins[disable all plugins]'
+ '(-q --quiet)'{-q,--quiet}'[show just the relevant content]'
+ '--refresh[force refreshing metadata before running the command]'
+ '--releasever=[override distribution release in config files]:release ver:'
+ '(--disablerepo)*--repo=[enable just the specified repo]: : _sequence _dnf5_repositories -T all'
+ '*--repofrompath=[specify additional repos]:repository_label,path_or_url: '
+ '*--setopt=[override option in config file]:repoid.option=value:'
+ '*--setvar=[override DNF5 variable value]'
+ '--show-new-leaves[show newly installed leaf packages]'
+ '--use-host-config[use config files and variables from host system]'
+ '(- *)--version[show dnf version]'
+ '(-y --assumeyes --assumeno)'{-y,--assumeyes}'[answer yes for all questions]'
+ '*'{-x+,--exclude=}'[exclude specified packages from transaction]: : _sequence _dnf5_packages -T all'
+ )
+ _arguments -C -s : $opts ': :->command' '*:: :->cmd_args' && ret=0
+
+ case $state in
+ command) _dnf5_commands && ret=0 ;;
+ cmd_args) _dnf5_subcmds_opts && ret=0 ;;
+ esac
+ return ret
+}
+
+_dnf5 "$@"

View file

@ -0,0 +1,19 @@
commit 071e325c826a89b792056c3faf0c400b8c0c5738
Author: Christoph Erhardt <christoph.erhardt@sicherha.de>
Date: Tue Sep 30 08:47:15 2025 +0900
53981: _dnf5: fix completion of local rpm files
diff --git a/Completion/Redhat/Command/_dnf5 b/Completion/Redhat/Command/_dnf5
index e194dd5a7..9cbf451a8 100644
--- a/Completion/Redhat/Command/_dnf5
+++ b/Completion/Redhat/Command/_dnf5
@@ -38,7 +38,7 @@ _dnf5_rpm_files() {
_dnf5_packages_or_rpms() {
if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
- _dnf_rpm_files
+ _dnf5_rpm_files
else
_dnf5_packages "$@"
fi

View file

@ -0,0 +1,25 @@
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 8f32c68e3..bd4a67cee 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -2490,15 +2490,17 @@ printfmt(char *fmt, int n, int dopr, int doesc)
p--;
} else
atr = match_colour(NULL, is_fg, arg);
- if (atr != TXT_ERROR)
+ if (atr != TXT_ERROR && dopr)
set_colour_attribute(atr, is_fg ? COL_SEQ_FG :
COL_SEQ_BG, 0);
break;
case 'f':
- set_colour_attribute(TXTNOFGCOLOUR, COL_SEQ_FG, 0);
+ if (dopr)
+ set_colour_attribute(TXTNOFGCOLOUR, COL_SEQ_FG, 0);
break;
case 'k':
- set_colour_attribute(TXTNOBGCOLOUR, COL_SEQ_BG, 0);
+ if (dopr)
+ set_colour_attribute(TXTNOBGCOLOUR, COL_SEQ_BG, 0);
break;
case '{':
if (arg)

View file

@ -1,2 +1,2 @@
SHA512 (zsh-5.9.2.tar.xz) = 40bb5eb2cf217e6bcff342fcc9314f082a5d8975abcb56897e86eba5839ddf0ec1ac3feed1e797d4c68cea22228197342916f14bb87309bbcc026a87622bc015
SHA512 (zsh-5.9.2.tar.xz.asc) = 9657c8fef30124e4ea1b4ab41c80b471990c52c362e53f40c9bcca1be1b48af5d19437ecf6a645dbe9ea328d82cc43f9d88ad3835d23d76e482969017a956bf6
SHA512 (zsh-5.9.tar.xz) = d9138b7f379ad942a5f46819d2dd52d31f3a1129f2a0d1b53d4c5cd43c318b60396da6d37c57c477b8e958fb750209aca0ae93f8c9dd42ac958de006a0ff067e
SHA512 (zsh-5.9.tar.xz.asc) = b6a72f8dfd2ed9c25e4afa5b3d13b23c1bf0bceacfce3ad0fadf24a9df91382914f7322ef4ed8bfb4b68818fb18fe3973d22154a6cc638b46f02e30bafd93fcb

View file

@ -1,269 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFwswugBCADdkzua9HwC8Ip5zh7Z0/nJGKbMyq+cobXArhHos40taeidn0+v
HRES5y6PHR+h56c9TpmJEp/bLCHP5pLvcSz/ETz7+Kk82pld63pOHejSxAQCu7Wv
1NwrTu6TyKlZsNG1oZBxx2LkEN6k8Wy+88DlQqZoXOXafmhF+Sms6gv9DXa029sv
B07EehAx02T+b02QwVVG/Pq9austmsTd9EcNcVNRDneD2LcdxCllbS5IamjVa+NW
oeKZVqbsO71uUolwBvshFSBLPsSY8EZdGApjazQcY0lgkaRA/QlMOisyq2mjV6FY
JXHrlI3WWWK2vROjb35AHiHEE/EVgb5RVpxxABEBAAG0E2RhbmEgPGRhbmFAZGFu
YS5pcz6JAU4EEwEIADgWIQR8p+yq8GIWuQ+JQUas+BRsroy7xAUCXCzC6AIbAwUL
CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCs+BRsroy7xA5XB/93EQqzs0as07U+
gmPDpvE7JwIY4TrcvAS7RHgJ4sE+arR5uTziHixiHBQQMedbfV51Jxgws6WL0Ko8
7K8h9sN2UGnXIc1lWuQ2FDshrcpSHZvLxL4Z7WC3Rj/Dq3/nuZZyljWQNHxg4BlO
EJqe67F5kT2OI591oxB6L1E6F8sVsgxD7gBCPVl/8CsyZ7wkyW/gMRqrlYolJhpS
B5C1zKJzvULQJKXDCh9DUyi7cKFtPyYfYtRWfWhKGz5Dhtt9qvBlxJzZufZ9QNQt
oPhNGF34QaLWTCLRbtoVbNq2NlxalZ5Byhg/0pBcQc2w4C70jSxF3c+2oMEGQIbc
5GJFgLpZuQENBFwswugBCAD5rIYdlLWHOMw+stWTRNquu3SZr+v7RRzreV9fOKN+
lUiqwicU2uCX39s/q+2wtF536r+IS/53DrMAW8sxf8eroK+MBnJYtP3U8BnB3mag
bTJXMjng2ZqZXvxzetXLyXR+38f+6WbJtV0ByDeFQQJYsFxOag3r6etxrzpwRFm0
PL440fc0nxOxhxWWJcR0RKTMX87ymipi9mETYeZi7h9B3cDw8aIUz2O3s45TtNlA
NI1MNMU4sAsc5i+w0zJON9gT+rWDYFj6BiEqnRoSK2XDm+WaJa3FwgW1WnHPTe+E
RJFGT58DICU3ta6cCQPavZz/KALyj8GBJ+PydelIAv2rABEBAAGJATYEGAEIACAW
IQR8p+yq8GIWuQ+JQUas+BRsroy7xAUCXCzC6AIbDAAKCRCs+BRsroy7xOgxB/40
sp9xFq8L/59yRTeXSskOsGk3aUlSnACofcRCGgDSXV5GwWJ/G0O8krhHOISJKuxc
vA0wLFq0WB/EafrKAPTSkrnxmq8noT3c8MpnFRSXHq3sOXkB4nqVEmUu/AAA0TbC
HcwhFQExvK7O+funxIGU5vqHFeQGJ0VcgC/KZUEMNtVV8aZGvn7JzSxEIwHVXGLu
5H7TnNWzLzkzIDVY9IJpTutsc6RMvv6BV8ooWBHSgzmh0MTqEjwNarHAMuffrAjE
zIO3qi0YCaxSDVf2jrWyYpB2QntplmUoubB9s/ngCqVb4A3B7JxPmJuL/0XMUThn
WZLWFpbLimyoUCfHoehZ
=dR/Y
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=KiyE
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
Qg719Q==
=+Fbc
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFZWC4cBCADgb7/oPoCs9SE+/jrzmDT7L+PbYLCygCExxp4mt3CsSzn5xefq
NGU+aBJnvyongcsYrW173GumDjXCG3GBtnmqs3dFeoqnEsSZFMYiQ4ctmWh48P+W
uQVQOWuh0CVS2OCFn37b5F9dy3oF6gJFdqbwOXJSgWMA/+StMGSkslTYFlG/JwZ1
csk9jSwQw/yKDlTiFaqMwIwSXTK5fItSn3F0R+usgMhwRPu8gvK23tmEhnnwgmlR
xfEwJCLqGnvlW74dRkCjY349GAG1IN2felFfHn0ok/Lbx7coKRoEvHaCVbmtPSmX
Ps9axAV97wk37wS1dhEXcjxLb9GIZgptgo7DABEBAAG0LlBldGVyIFN0ZXBoZW5z
b24gPHAudy5zdGVwaGVuc29uQG50bHdvcmxkLmNvbT6JATcEEwEIACEFAlZWC4cC
GwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQpx2anUvbJ7NtaQf/RQ/RLvOG
iI4XJp/C9JIVHfHL7I801uT8V3y/d2+DehFasR9T+6B/Mf5y22NI31i5XBQuK0Wo
Zsi7F3bhNHyeVgO/p5JLBmxohByjL9f7B+k9Tt/DyWh66AVaCoam4ACR8TBOlNkD
p/8U0zzrxE9fQrjjK/PzhpVe97LKScEAu2Zc/qUFp4eTAnlqyosTqvU64+n1PrNC
CtZVYPnL17GCC4+S7yrh34Kllx+fkoHimTL/cUG+6+7sbmpUImpP+pgNEnL1IzBB
ajZRl1581McMGhIH1TBYrEVnIhononoOO7qr1eahUCEhVvanyVTnSeTTVR0VgK4s
joYLwDLM4XidgrkBDQRWVguHAQgA7JTI0botnBMfTAGff4Duoor5m0PuExQFCHcJ
/df5SyUUskycMlGR73+IbcT2D/zBIFDv5ZhCdOdmIW3CHICK+Ws7N5+KSzlzC+Vf
2LMmXuyJLhXeTqXI1ta6bIGjXeh5VA9Jd7B8dRQhCn1OrGbFhwtJSGejTmcWiLJW
+2GV9s44e9MlscMHvAk9QAvqrSUJoAkN3OCdgjcpDNVT8ek3NnjCD4xrBTxCcI1n
KsJeOgNHPkbou9+eHY80amkAkRn2ZSI9n25WjhKAp9QGDNL5wqHLjgHP6WiEwumN
DWPnPd+5FQHQXy1GHgH2BozfT1KZJ012T0Keuk/hnZJ/TVe4gwARAQABiQEfBBgB
CAAJBQJWVguHAhsMAAoJEKcdmp1L2yez1T0H/jitvgACci+5PQG1djYwioQIui4J
1nSg4HxW+4SCpSwlmH2LkKaF3WbjpPTRhYeMZ5zdOvGnjPUZCjGtWkWx0p+Jrpe/
QIC3CNXerX9fpkr0K7+knqkb1RsjHU/YSsYTDDVJpL3BQOZzVocOjPa1YPTfTBU5
tsQdA4RORi15LyAWcEAmR+X3qH2JM5pGP23hhOKnrFSSnfBP6ef1/jjRbfK5yItZ
5DOf6i3WS40zxB67dlBlHZwOQuYA3Sr01hEz4CeAkpV7lQ1gKelm1ZmcFQI6yqcR
PmVjIuxE1A/gTFe6LaAfCGA6/H1H6LLwWQ/rnUi/seMJ6aRkz/05dg7j5+E=
=wOVS
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -1,33 +1,52 @@
Summary: Powerful interactive shell
Name: zsh
Version: 5.9.2
Release: 3%{?dist}
Version: 5.9
Release: 21%{?dist}
License: MIT-Modern-Variant AND ISC AND GPL-2.0-only
URL: http://zsh.sourceforge.net/
Source0: https://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz
Source1: https://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.xz.asc
Source2: zsh-keyring.asc
Source1: zlogin.rhs
Source2: zlogout.rhs
Source3: zprofile.rhs
Source4: zshrc.rhs
Source5: zshenv.rhs
Source6: dotzshrc
Source7: dotzprofile
Source3: zlogin.rhs
Source4: zlogout.rhs
Source5: zprofile.rhs
Source6: zshrc.rhs
Source7: zshenv.rhs
Source8: dotzshrc
Source9: dotzprofile
# https://sourceforge.net/p/zsh/code/ci/7708d466dfab8dd29f9ae5de12c74af37bf99a4d/
# do not use egrep in tests to make them pass again
Patch1: 0001-zsh-5.9-do-not-use-egrep-in-tests.patch
# Upstream commit ab4d62eb975a4c4c51dd35822665050e2ddc6918
Patch2: 0002-zsh-Use-int-main-in-test-c-codes.patch
# upstream commit a84fdd7c8f77935ecce99ff2b0bdba738821ed79
Patch3: 0003-zsh-fix-module-loading-problem-with-full-RELRO.patch
# upstream commit 1b421e4978440234fb73117c8505dad1ccc68d46
Patch4: 0004-zsh-enable-PCRE-locale-switching.patch
# upstream commit b62e911341c8ec7446378b477c47da4256053dc0 and 10bdbd8b5b0b43445aff23dcd412f25cf6aa328a
Patch5: 0005-zsh-port-to-pcre2.patch
# upstream commit ecd3f9c9506c7720dc6c0833dc5d5eb00e4459c4
Patch6: 0006-zsh-support-texinfo-7.0.patch
# upstream commit 4c89849c98172c951a9def3690e8647dae76308f
Patch7: 0007-zsh-configure-c99.patch
# upstream commit d3edf318306e37d2d96c4e4ea442d10207722e94
Patch8: 0008-zsh-deletefilelist-segfault.patch
# upstream commit b70b241cc5ca88cc129ff9ba14f8af2e889b90e6
Patch9: 0009-zsh-support-dnf5.patch
# upstream commit 071e325c826a89b792056c3faf0c400b8c0c5738
Patch10: 0010-zsh-fix-dnf5-completion-with-rpm-files.patch
# upstream commit 7708d466dfab8dd29f9ae5de12c74af37bf99a4d
# fix crash with bracketed-paste-magic and undo (rhbz#2484692)
Patch: zsh-memcpy-sigsegv-bracketed-paste.patch
Patch11: 0011-zsh-memcpy-sigsegv-bracketed-paste.patch
# downstream patch for rhbz#2449939
# already fixed upstream in a major refactor of term color attribute handling
Patch100: 0100-zsh-_IO_putc-SIGSEGV.patch
BuildRequires: autoconf
BuildRequires: coreutils
BuildRequires: gawk
BuildRequires: gcc
BuildRequires: gdbm-devel
BuildRequires: glibc-langpack-ja
BuildRequires: gpgverify
BuildRequires: groff
BuildRequires: hostname
BuildRequires: libcap-devel
BuildRequires: make
BuildRequires: ncurses-devel
@ -38,6 +57,14 @@ BuildRequires: texinfo
Requires(post): grep
Requires(postun): coreutils grep
# the hostname package is not available on RHEL-6
%if 12 < 0%{?fedora} || 6 < 0%{?rhel}
BuildRequires: hostname
%else
# /bin and /usr/bin are separate directories on RHEL-6
%define _bindir /bin
%endif
Provides: /bin/zsh
%description
@ -50,7 +77,7 @@ mechanism, and more.
%package html
Summary: Zsh shell manual in html format
BuildArch: noarch
BuildArch: noarch
%description html
The zsh shell is a command interpreter usable as an interactive login
@ -63,8 +90,8 @@ mechanism, and more.
This package contains the Zsh manual in html format.
%prep
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
%autosetup -p1
autoreconf -fiv
# enable parallel build
sed -e 's|^\.NOTPARALLEL|#.NOTPARALLEL|' -i 'Config/defs.mk.in'
@ -107,13 +134,13 @@ rm -f $RPM_BUILD_ROOT%{_bindir}/zsh-%{version}
rm -f $RPM_BUILD_ROOT%{_infodir}/dir
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}
for i in %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6} %{SOURCE7}; do
for i in %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5}; do
install -m 644 $i $RPM_BUILD_ROOT%{_sysconfdir}/"$(basename $i .rhs)"
done
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/skel
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/skel/.zshrc
install -m 644 %{SOURCE9} $RPM_BUILD_ROOT%{_sysconfdir}/skel/.zprofile
install -m 644 %{SOURCE6} $RPM_BUILD_ROOT%{_sysconfdir}/skel/.zshrc
install -m 644 %{SOURCE7} $RPM_BUILD_ROOT%{_sysconfdir}/skel/.zprofile
# This is just here to shut up rpmlint, and is very annoying.
# Note that we can't chmod everything as then rpmlint will complain about
@ -158,18 +185,9 @@ fi
%doc Doc/*.html
%changelog
* Wed Jul 22 2026 Lukáš Zaoral <lzaoral@redhat.com> - 5.9.2-3
* Wed Jul 22 2026 Lukáš Zaoral <lzaoral@redhat.com> - 5.9-21
- fix crash with bracketed-paste-magic and undo (rhbz#2484692)
* Fri Jul 17 2026 Fedora Release Engineering <releng@fedoraproject.org> - 5.9.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild
* Mon Jul 13 2026 Lukáš Zaoral <lzaoral@redhat.com> - 5.9.2-1
- rebase to the latest upstream release (rhbz#2499540)
* Thu Jun 04 2026 Lukáš Zaoral <lzaoral@redhat.com> - 5.9.1-1
- rebase to the latest upstream release (rhbz#2483668)
* Tue Mar 24 2026 Lukáš Zaoral <lzaoral@redhat.com> - 5.9-20
- fix segfault in _IO_putc (rhbz#2449939)
@ -195,7 +213,7 @@ fi
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Wed Jan 17 2024 Lukáš Zaoral <lzaoral@redhat.com> - 5.9-12
- fix segfault in deletefilelist (rhbz#2245462)
- fix segfault in delerefilelist (rhbz#2245462)
* Fri Dec 8 2023 Florian Weimer <fweimer@redhat.com> - 5.9-11
- Fix C compatibility issue in the configure script