From 1965574eedd3284037fcf9ebedbc77b60781881b Mon Sep 17 00:00:00 2001 From: dkwo Date: Mon, 5 Dec 2022 20:16:46 -0500 Subject: [PATCH] coreutils: update to 9.1 skip test-getcwd.sh test-getlogin Add [.1 man page symlink so "man [" works. backport two bugfixes --- ...8.31-behavior-on-removed-directories.patch | 120 ----------- .../patches/01-gnulib-simple-backup-fix.patch | 36 ++++ srcpkgs/coreutils/patches/02-fixcp.patch | 197 ++++++++++++++++++ srcpkgs/coreutils/template | 12 +- 4 files changed, 242 insertions(+), 123 deletions(-) delete mode 100644 srcpkgs/coreutils/patches/0001-ls-restore-8.31-behavior-on-removed-directories.patch create mode 100644 srcpkgs/coreutils/patches/01-gnulib-simple-backup-fix.patch create mode 100644 srcpkgs/coreutils/patches/02-fixcp.patch diff --git a/srcpkgs/coreutils/patches/0001-ls-restore-8.31-behavior-on-removed-directories.patch b/srcpkgs/coreutils/patches/0001-ls-restore-8.31-behavior-on-removed-directories.patch deleted file mode 100644 index 93ec0fd84c74..000000000000 --- a/srcpkgs/coreutils/patches/0001-ls-restore-8.31-behavior-on-removed-directories.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 10fcb97bd728f09d4a027eddf8ad2900f0819b0a Mon Sep 17 00:00:00 2001 -From: Paul Eggert -Date: Thu, 5 Mar 2020 17:25:29 -0800 -Subject: [PATCH] ls: restore 8.31 behavior on removed directories -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -* NEWS: Mention this. -* src/ls.c: Do not include -(print_dir): Don't worry about whether the directory is removed. -* tests/ls/removed-directory.sh: Adjust to match new (i.e., old) -behavior. ---- - NEWS | 6 ++++++ - src/ls.c | 22 ---------------------- - tests/ls/removed-directory.sh | 10 ++-------- - 3 files changed, 8 insertions(+), 30 deletions(-) - -diff --git NEWS NEWS -index fdc8bf5db..653e7178b 100644 ---- a/NEWS -+++ b/NEWS -@@ -2,6 +2,12 @@ GNU coreutils NEWS -*- outline -*- - - * Noteworthy changes in release ?.? (????-??-??) [?] - -+** Changes in behavior -+ -+ On GNU/Linux systems, ls no longer issues an error message on -+ directory merely because it was removed. This reverts a change -+ that was made in release 8.32. -+ - - * Noteworthy changes in release 8.32 (2020-03-05) [stable] - -diff --git src/ls.c src/ls.c -index 24b983287..4acf5f44d 100644 ---- a/src/ls.c -+++ b/src/ls.c -@@ -49,10 +49,6 @@ - # include - #endif - --#ifdef __linux__ --# include --#endif -- - #include - #include - #include -@@ -2896,7 +2892,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) - struct dirent *next; - uintmax_t total_blocks = 0; - static bool first = true; -- bool found_any_entries = false; - - errno = 0; - dirp = opendir (name); -@@ -2972,7 +2967,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) - next = readdir (dirp); - if (next) - { -- found_any_entries = true; - if (! file_ignored (next->d_name)) - { - enum filetype type = unknown; -@@ -3018,22 +3012,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) - if (errno != EOVERFLOW) - break; - } --#ifdef __linux__ -- else if (! found_any_entries) -- { -- /* If readdir finds no directory entries at all, not even "." or -- "..", then double check that the directory exists. */ -- if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1 -- && errno != EINVAL) -- { -- /* We exclude EINVAL as that pertains to buffer handling, -- and we've passed NULL as the buffer for simplicity. -- ENOENT is returned if appropriate before buffer handling. */ -- file_failure (command_line_arg, _("reading directory %s"), name); -- } -- break; -- } --#endif - else - break; - -diff --git tests/ls/removed-directory.sh tests/ls/removed-directory.sh -index e8c835dab..fe8f929a1 100755 ---- a/tests/ls/removed-directory.sh -+++ b/tests/ls/removed-directory.sh -@@ -26,20 +26,14 @@ case $host_triplet in - *) skip_ 'non linux kernel' ;; - esac - --LS_FAILURE=2 -- --cat <<\EOF >exp-err || framework_failure_ --ls: reading directory '.': No such file or directory --EOF -- - cwd=$(pwd) - mkdir d || framework_failure_ - cd d || framework_failure_ - rmdir ../d || framework_failure_ - --returns_ $LS_FAILURE ls >../out 2>../err || fail=1 -+ls >../out 2>../err || fail=1 - cd "$cwd" || framework_failure_ - compare /dev/null out || fail=1 --compare exp-err err || fail=1 -+compare /dev/null err || fail=1 - - Exit $fail --- -2.24.0.375.geb5ae68d41 - diff --git a/srcpkgs/coreutils/patches/01-gnulib-simple-backup-fix.patch b/srcpkgs/coreutils/patches/01-gnulib-simple-backup-fix.patch new file mode 100644 index 000000000000..9c2d8a7cc0fc --- /dev/null +++ b/srcpkgs/coreutils/patches/01-gnulib-simple-backup-fix.patch @@ -0,0 +1,36 @@ +commit 7347caeb9d902d3fca2c11f69a55a3e578d93bfe +Author: Paul Eggert +Date: Wed Apr 20 19:34:57 2022 -0700 + + backupfile: fix bug when renaming simple backups + + * lib/backupfile.c (backupfile_internal): Fix bug when RENAME + and when doing simple backups. Problem reported by Steve Ward in: + https://bugs.gnu.org/55029 + +diff --git a/lib/backupfile.c b/lib/backupfile.c +index 1e9290a187..d9f465a3e0 100644 +--- a/lib/backupfile.c ++++ b/lib/backupfile.c +@@ -332,7 +332,7 @@ backupfile_internal (int dir_fd, char const *file, + return s; + + DIR *dirp = NULL; +- int sdir = AT_FDCWD; ++ int sdir = dir_fd; + idx_t base_max = 0; + while (true) + { +@@ -371,10 +371,9 @@ backupfile_internal (int dir_fd, char const *file, + if (! rename) + break; + +- int olddirfd = sdir < 0 ? dir_fd : sdir; +- idx_t offset = sdir < 0 ? 0 : base_offset; ++ idx_t offset = backup_type == simple_backups ? 0 : base_offset; + unsigned flags = backup_type == simple_backups ? 0 : RENAME_NOREPLACE; +- if (renameatu (olddirfd, file + offset, sdir, s + offset, flags) == 0) ++ if (renameatu (sdir, file + offset, sdir, s + offset, flags) == 0) + break; + int e = errno; + if (! (e == EEXIST && extended)) diff --git a/srcpkgs/coreutils/patches/02-fixcp.patch b/srcpkgs/coreutils/patches/02-fixcp.patch new file mode 100644 index 000000000000..1d89d3a5fc60 --- /dev/null +++ b/srcpkgs/coreutils/patches/02-fixcp.patch @@ -0,0 +1,197 @@ +From b54da709a1f3a6f10ed3150b0ae5269002a1053c Mon Sep 17 00:00:00 2001 +From: Paul Eggert +Date: Sat, 11 Jun 2022 10:49:18 -0700 +Subject: =?UTF-8?q?cp:=20fix=20=E2=80=98cp=20-rx=20/=20/mnt=E2=80=99?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Problem reported by pkoraou@gmail.com (Bug#55910). +* src/copy.c (copy_internal): Treat a relative destination name "" +as if it were "." for the purpose of directory-relative syscalls +like fstatat that might might refer to the destination directory. + +diff --git a/src/copy.c b/src/copy.c +index b15d919..edc8221 100644 +--- a/src/copy.c ++++ b/src/copy.c +@@ -1954,6 +1954,7 @@ copy_internal (char const *src_name, char const *dst_name, + bool restore_dst_mode = false; + char *earlier_file = NULL; + char *dst_backup = NULL; ++ char const *drelname = *dst_relname ? dst_relname : "."; + bool delayed_ok; + bool copied_as_regular = false; + bool dest_is_symlink = false; +@@ -1971,7 +1972,7 @@ copy_internal (char const *src_name, char const *dst_name, + if (x->move_mode) + { + if (rename_errno < 0) +- rename_errno = (renameatu (AT_FDCWD, src_name, dst_dirfd, dst_relname, ++ rename_errno = (renameatu (AT_FDCWD, src_name, dst_dirfd, drelname, + RENAME_NOREPLACE) + ? errno : 0); + nonexistent_dst = *rename_succeeded = new_dst = rename_errno == 0; +@@ -1983,7 +1984,7 @@ copy_internal (char const *src_name, char const *dst_name, + { + char const *name = rename_errno == 0 ? dst_name : src_name; + int dirfd = rename_errno == 0 ? dst_dirfd : AT_FDCWD; +- char const *relname = rename_errno == 0 ? dst_relname : src_name; ++ char const *relname = rename_errno == 0 ? drelname : src_name; + int fstatat_flags + = x->dereference == DEREF_NEVER ? AT_SYMLINK_NOFOLLOW : 0; + if (follow_fstatat (dirfd, relname, &src_sb, fstatat_flags) != 0) +@@ -2051,8 +2052,7 @@ copy_internal (char const *src_name, char const *dst_name, + int fstatat_flags = use_lstat ? AT_SYMLINK_NOFOLLOW : 0; + if (!use_lstat && nonexistent_dst < 0) + new_dst = true; +- else if (follow_fstatat (dst_dirfd, dst_relname, &dst_sb, +- fstatat_flags) ++ else if (follow_fstatat (dst_dirfd, drelname, &dst_sb, fstatat_flags) + == 0) + { + have_dst_lstat = use_lstat; +@@ -2077,7 +2077,7 @@ copy_internal (char const *src_name, char const *dst_name, + bool return_now = false; + + if (x->interactive != I_ALWAYS_NO +- && ! same_file_ok (src_name, &src_sb, dst_dirfd, dst_relname, ++ && ! same_file_ok (src_name, &src_sb, dst_dirfd, drelname, + &dst_sb, x, &return_now)) + { + error (0, 0, _("%s and %s are the same file"), +@@ -2140,7 +2140,7 @@ copy_internal (char const *src_name, char const *dst_name, + cp and mv treat -i and -f differently. */ + if (x->move_mode) + { +- if (abandon_move (x, dst_name, dst_dirfd, dst_relname, &dst_sb)) ++ if (abandon_move (x, dst_name, dst_dirfd, drelname, &dst_sb)) + { + /* Pretend the rename succeeded, so the caller (mv) + doesn't end up removing the source file. */ +@@ -2321,14 +2321,11 @@ copy_internal (char const *src_name, char const *dst_name, + Otherwise, use AT_SYMLINK_NOFOLLOW, in case dst_name is a symlink. */ + if (have_dst_lstat) + dst_lstat_sb = &dst_sb; ++ else if (fstatat (dst_dirfd, drelname, &tmp_buf, AT_SYMLINK_NOFOLLOW) ++ == 0) ++ dst_lstat_sb = &tmp_buf; + else +- { +- if (fstatat (dst_dirfd, dst_relname, &tmp_buf, +- AT_SYMLINK_NOFOLLOW) == 0) +- dst_lstat_sb = &tmp_buf; +- else +- lstat_ok = false; +- } ++ lstat_ok = false; + + /* Never copy through a symlink we've just created. */ + if (lstat_ok +@@ -2475,8 +2472,7 @@ copy_internal (char const *src_name, char const *dst_name, + if (x->move_mode) + { + if (rename_errno == EEXIST) +- rename_errno = ((renameat (AT_FDCWD, src_name, dst_dirfd, dst_relname) +- == 0) ++ rename_errno = (renameat (AT_FDCWD, src_name, dst_dirfd, drelname) == 0 + ? 0 : errno); + + if (rename_errno == 0) +@@ -2576,7 +2572,7 @@ copy_internal (char const *src_name, char const *dst_name, + or not, and this is enforced above. Therefore we check the src_mode + and operate on dst_name here as a tighter constraint and also because + src_mode is readily available here. */ +- if ((unlinkat (dst_dirfd, dst_relname, ++ if ((unlinkat (dst_dirfd, drelname, + S_ISDIR (src_mode) ? AT_REMOVEDIR : 0) + != 0) + && errno != ENOENT) +@@ -2646,7 +2642,7 @@ copy_internal (char const *src_name, char const *dst_name, + to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir + decide what to do with S_ISUID | S_ISGID | S_ISVTX. */ + mode_t mode = dst_mode_bits & ~omitted_permissions; +- if (mkdirat (dst_dirfd, dst_relname, mode) != 0) ++ if (mkdirat (dst_dirfd, drelname, mode) != 0) + { + error (0, errno, _("cannot create directory %s"), + quoteaf (dst_name)); +@@ -2657,8 +2653,7 @@ copy_internal (char const *src_name, char const *dst_name, + for writing the directory's contents. Check if these + permissions are there. */ + +- if (fstatat (dst_dirfd, dst_relname, &dst_sb, +- AT_SYMLINK_NOFOLLOW) != 0) ++ if (fstatat (dst_dirfd, drelname, &dst_sb, AT_SYMLINK_NOFOLLOW) != 0) + { + error (0, errno, _("cannot stat %s"), quoteaf (dst_name)); + goto un_backup; +@@ -2670,7 +2665,7 @@ copy_internal (char const *src_name, char const *dst_name, + dst_mode = dst_sb.st_mode; + restore_dst_mode = true; + +- if (lchmodat (dst_dirfd, dst_relname, dst_mode | S_IRWXU) != 0) ++ if (lchmodat (dst_dirfd, drelname, dst_mode | S_IRWXU) != 0) + { + error (0, errno, _("setting permissions for %s"), + quoteaf (dst_name)); +@@ -2924,7 +2919,7 @@ copy_internal (char const *src_name, char const *dst_name, + /* Now that the destination file is very likely to exist, + add its info to the set. */ + struct stat sb; +- if (fstatat (dst_dirfd, dst_relname, &sb, AT_SYMLINK_NOFOLLOW) == 0) ++ if (fstatat (dst_dirfd, drelname, &sb, AT_SYMLINK_NOFOLLOW) == 0) + record_file (x->dest_info, dst_relname, &sb); + } + +@@ -2957,7 +2952,7 @@ copy_internal (char const *src_name, char const *dst_name, + timespec[1] = get_stat_mtime (&src_sb); + + int utimensat_flags = dest_is_symlink ? AT_SYMLINK_NOFOLLOW : 0; +- if (utimensat (dst_dirfd, dst_relname, timespec, utimensat_flags) != 0) ++ if (utimensat (dst_dirfd, drelname, timespec, utimensat_flags) != 0) + { + error (0, errno, _("preserving times for %s"), quoteaf (dst_name)); + if (x->require_preserve) +@@ -2969,7 +2964,7 @@ copy_internal (char const *src_name, char const *dst_name, + if (!dest_is_symlink && x->preserve_ownership + && (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb))) + { +- switch (set_owner (x, dst_name, dst_dirfd, dst_relname, -1, ++ switch (set_owner (x, dst_name, dst_dirfd, drelname, -1, + &src_sb, new_dst, &dst_sb)) + { + case -1: +@@ -3024,8 +3019,9 @@ copy_internal (char const *src_name, char const *dst_name, + the lstat, but deducing the current destination mode + is tricky in the presence of implementation-defined + rules for special mode bits. */ +- if (new_dst && fstatat (dst_dirfd, dst_relname, &dst_sb, +- AT_SYMLINK_NOFOLLOW) != 0) ++ if (new_dst && (fstatat (dst_dirfd, drelname, &dst_sb, ++ AT_SYMLINK_NOFOLLOW) ++ != 0)) + { + error (0, errno, _("cannot stat %s"), quoteaf (dst_name)); + return false; +@@ -3038,7 +3034,7 @@ copy_internal (char const *src_name, char const *dst_name, + + if (restore_dst_mode) + { +- if (lchmodat (dst_dirfd, dst_relname, dst_mode | omitted_permissions) ++ if (lchmodat (dst_dirfd, drelname, dst_mode | omitted_permissions) + != 0) + { + error (0, errno, _("preserving permissions for %s"), +@@ -3068,7 +3064,7 @@ un_backup: + if (dst_backup) + { + char const *dst_relbackup = &dst_backup[dst_relname - dst_name]; +- if (renameat (dst_dirfd, dst_relbackup, dst_dirfd, dst_relname) != 0) ++ if (renameat (dst_dirfd, dst_relbackup, dst_dirfd, drelname) != 0) + error (0, errno, _("cannot un-backup %s"), quoteaf (dst_name)); + else + { +-- +cgit v1.1 + diff --git a/srcpkgs/coreutils/template b/srcpkgs/coreutils/template index b9148c854960..420206e7451f 100644 --- a/srcpkgs/coreutils/template +++ b/srcpkgs/coreutils/template @@ -1,7 +1,7 @@ # Template file for 'coreutils' pkgname=coreutils -version=8.32 -revision=4 +version=9.1 +revision=1 bootstrap=yes makedepends="gmp-devel acl-devel libcap-devel" short_desc="GNU core utilities" @@ -10,7 +10,7 @@ license="GPL-3.0-or-later" homepage="https://www.gnu.org/software/coreutils" changelog="https://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=blob_plain;f=NEWS;hb=HEAD" distfiles="${GNU_SITE}/coreutils/coreutils-${version}.tar.xz" -checksum=4458d8de7849df44ccab15e16b1548b285224dbba5f08fac070c1c0e0bcc4cfa +checksum=61a1f410d78ba7e7f37a5a4f50e6d1320aca33375484a3255eddf17a38580423 replaces="chroot-coreutils>=0 coreutils-doc>=0 b2sum>=0" @@ -104,6 +104,10 @@ do_check() { # Tests that depend on the tests removed exeext_tests+=" fchmodat fchdir" + # temporarily disable two tests (coreutils9.1) + vsed -i "s/test-getcwd.sh //" gnulib-tests/Makefile + exeext_tests+=" getlogin" + for test in $exeext_tests ; do vsed -i "s/test-$test\$(EXEEXT) //" gnulib-tests/Makefile done @@ -121,4 +125,6 @@ do_install() { fi mv ${DESTDIR}/usr/bin/hostname ${DESTDIR}/usr/bin/hostname-coreutils mv ${DESTDIR}/usr/share/man/man1/hostname.1 ${DESTDIR}/usr/share/man/man1/hostname-coreutils.1 + + ln -s test.1 "${DESTDIR}/usr/share/man/man1/[.1" }