Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[staging] coreutils: 8.32 -> 9.0 #139541

Merged
merged 2 commits into from
Oct 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions pkgs/tools/misc/coreutils/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ with lib;

stdenv.mkDerivation (rec {
pname = "coreutils";
version = "8.32";
version = "9.0";

src = fetchurl {
url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz";
sha256 = "sha256-RFjY3nhJ30TMqxXhaxVIsoUiTbul8I+sBwwcDgvMTPo=";
sha256 = "sha256-zjCs30pBvFuzDdlV6eqnX6IWtOPesIiJ7TJDPHs7l84=";
};

patches = [ ./sys-getdents-undeclared.patch ]
patches = [ ./fix-chmod-exit-code.patch ]
++ optional stdenv.hostPlatform.isCygwin ./coreutils-8.23-4.cygwin.patch
# fix gnulib tests on 32-bit ARM. Included on coreutils master.
# https://lists.gnu.org/r/bug-gnulib/2020-08/msg00225.html
Expand Down Expand Up @@ -74,23 +74,26 @@ stdenv.mkDerivation (rec {
sed '2i print "Skipping id zero test"; exit 77' -i ./tests/id/zero.sh
sed '2i print "Skipping misc help-versiob test"; exit 77' -i ./tests/misc/help-version.sh
sed '2i print "Skipping chown separator test"; exit 77' -i ./tests/chown/separator.sh
'' + optionalString (stdenv.hostPlatform.libc == "musl") (lib.concatStringsSep "\n" [
'' + (optionalString (stdenv.hostPlatform.libc == "musl") (lib.concatStringsSep "\n" [
''
echo "int main() { return 77; }" > gnulib-tests/test-parse-datetime.c
echo "int main() { return 77; }" > gnulib-tests/test-getlogin.c
''
]);
])) + (optionalString stdenv.isAarch64 ''
sed '2i print "Skipping tail assert test"; exit 77' -i ./tests/tail-2/assert.sh
'');

outputs = [ "out" "info" ];

nativeBuildInputs = [ perl xz.bin ]
++ optionals stdenv.hostPlatform.isCygwin [ autoreconfHook texinfo ]; # due to patch
nativeBuildInputs = [ perl xz.bin autoreconfHook ] # autoreconfHook is due to patch, normally only needed for cygwin
++ optionals stdenv.hostPlatform.isCygwin [ texinfo ]; # due to patch
configureFlags = [ "--with-packager=https://NixOS.org" ]
++ optional (singleBinary != false)
("--enable-single-binary" + optionalString (isString singleBinary) "=${singleBinary}")
++ optional withOpenssl "--with-openssl"
++ optional stdenv.hostPlatform.isSunOS "ac_cv_func_inotify_init=no"
++ optional withPrefix "--program-prefix=g"
++ optional stdenv.isDarwin "--disable-nls" # the shipped configure script doesn't enable nls, but using autoreconfHook does so which breaks the build
++ optionals (stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.libc == "glibc") [
# TODO(19b98110126fde7cbb1127af7e3fe1568eacad3d): Needed for fstatfs() I
# don't know why it is not properly detected cross building with glibc.
Expand Down Expand Up @@ -152,7 +155,7 @@ stdenv.mkDerivation (rec {
license = licenses.gpl3Plus;
platforms = platforms.unix ++ platforms.windows;
priority = 10;
maintainers = [ maintainers.eelco ];
maintainers = [ maintainers.eelco maintainers.das_j ];
};
} // optionalAttrs stdenv.hostPlatform.isMusl {
# Work around a bogus warning in conjunction with musl.
Expand Down
108 changes: 108 additions & 0 deletions pkgs/tools/misc/coreutils/fix-chmod-exit-code.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
From e8b56ebd536e82b15542a00c888109471936bfda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Fri, 24 Sep 2021 20:57:41 +0100
Subject: [PATCH] chmod: fix exit status when ignoring symlinks

* src/chmod.c: Reorder enum so CH_NOT_APPLIED
can be treated as a non error.
* tests/chmod/ignore-symlink.sh: A new test.
* tests/local.mk: Reference the new test.
* NEWS: Mention the bug fix.
Fixes https://bugs.gnu.org/50784
---
NEWS | 6 ++++++
src/chmod.c | 4 ++--
tests/chmod/ignore-symlink.sh | 31 +++++++++++++++++++++++++++++++
tests/local.mk | 1 +
4 files changed, 40 insertions(+), 2 deletions(-)
create mode 100755 tests/chmod/ignore-symlink.sh

diff --git a/NEWS b/NEWS
index a1470a7d7..1cb3c28a1 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,12 @@ GNU coreutils NEWS -*- outline -*-

* Noteworthy changes in release ?.? (????-??-??) [?]

+** Bug fixes
+
+ chmod -R no longer exits with error status when encountering symlinks.
+ All files would be processed correctly, but the exit status was incorrect.
+ [bug introduced in coreutils-9.0]
+

* Noteworthy changes in release 9.0 (2021-09-24) [stable]

diff --git a/src/chmod.c b/src/chmod.c
index 37b04f500..57ac47f33 100644
--- a/src/chmod.c
+++ b/src/chmod.c
@@ -44,8 +44,8 @@ struct change_status
enum
{
CH_NO_STAT,
- CH_NOT_APPLIED,
CH_FAILED,
+ CH_NOT_APPLIED,
CH_NO_CHANGE_REQUESTED,
CH_SUCCEEDED
}
@@ -322,7 +322,7 @@ process_file (FTS *fts, FTSENT *ent)
if ( ! recurse)
fts_set (fts, ent, FTS_SKIP);

- return CH_NO_CHANGE_REQUESTED <= ch.status;
+ return CH_NOT_APPLIED <= ch.status;
}

/* Recursively change the modes of the specified FILES (the last entry
diff --git a/tests/chmod/ignore-symlink.sh b/tests/chmod/ignore-symlink.sh
new file mode 100755
index 000000000..5ce3de816
--- /dev/null
+++ b/tests/chmod/ignore-symlink.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Test for proper exit code of chmod on a processed symlink.
+
+# Copyright (C) 2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ chmod
+
+mkdir dir || framework_failure_
+touch dir/f || framework_failure_
+ln -s f dir/l || framework_failure_
+
+# This operation ignores symlinks but should succeed.
+chmod u+w -R dir 2> out || fail=1
+
+compare /dev/null out || fail=1
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index 228d0e368..b5b893fb7 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -456,6 +456,7 @@ all_tests = \
tests/chmod/c-option.sh \
tests/chmod/equal-x.sh \
tests/chmod/equals.sh \
+ tests/chmod/ignore-symlink.sh \
tests/chmod/inaccessible.sh \
tests/chmod/octal.sh \
tests/chmod/setgid.sh \
100 changes: 0 additions & 100 deletions pkgs/tools/misc/coreutils/sys-getdents-undeclared.patch

This file was deleted.