From debbugs-submit-bounces@debbugs.gnu.org Thu Jul 08 14:26:15 2010 Received: (at submit) by debbugs.gnu.org; 8 Jul 2010 18:26:15 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWvna-0001i6-QX for submit@debbugs.gnu.org; Thu, 08 Jul 2010 14:26:15 -0400 Received: from mx10.gnu.org ([199.232.76.166]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWvnY-0001i1-7q for submit@debbugs.gnu.org; Thu, 08 Jul 2010 14:26:13 -0400 Received: from lists.gnu.org ([199.232.76.165]:36005) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1OWvnT-0000qU-Qu for submit@debbugs.gnu.org; Thu, 08 Jul 2010 14:26:07 -0400 Received: from [140.186.70.92] (port=53985 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OWvnO-00067V-Gs for bug-coreutils@gnu.org; Thu, 08 Jul 2010 14:26:07 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=unavailable version=3.3.1 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OWvnM-0006aV-9z for bug-coreutils@gnu.org; Thu, 08 Jul 2010 14:26:02 -0400 Received: from kiwi.cs.ucla.edu ([131.179.128.19]:44315) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWvnL-0006a3-Ty for bug-coreutils@gnu.org; Thu, 08 Jul 2010 14:26:00 -0400 Received: from [131.179.64.200] (Penguin.CS.UCLA.EDU [131.179.64.200]) by kiwi.cs.ucla.edu (8.13.8+Sun/8.13.8/UCLACS-6.0) with ESMTP id o68IPvg6017229 for ; Thu, 8 Jul 2010 11:25:57 -0700 (PDT) Message-ID: <4C361834.4080306@cs.ucla.edu> Date: Thu, 08 Jul 2010 11:25:56 -0700 From: Paul Eggert Organization: UCLA Computer Science Department User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.10) Gecko/20100527 Thunderbird/3.0.5 MIME-Version: 1.0 To: bug-coreutils@gnu.org Subject: [PATCH] du: tune, and fix some -L bugs with dangling or cyclic symlinks Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-detected-operating-system: by eggs.gnu.org: Solaris 10 (beta) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Spam-Score: -3.5 (---) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.8 (----) I noticed some performance problems in du in some weird cases: when running commands like "du X X" it descended through X twice, even though it output the information only once (and obviously needs to descend only once). While looking into the matter I found some weird code in du. For example: if (ent->fts_info == FTS_D || skip) return ok; /* If the file is being excluded or if it has already been counted via a hard link, then don't let it contribute to the sums. */ if (skip || (!opt_count_all && (hash_all || (! S_ISDIR (sb->st_mode) && 1 < sb->st_nlink)) && ! hash_ins (sb->st_ino, sb->st_dev))) ... Obviously the second use of "skip" is entirely redundant, since when "skip" is true the first "if" always returns. And the "skip" isn't done quite right, as errors can be reported even for skipped files. And while fixing _this_, I discovered that "du -L" sometimes screws up, in that it doesn't report dangling symlinks, or it mistakenly counts the disk space for a symlink instead of for the pointed-to file, or it omits a directory entirely. Most of these bugs with "du -L" have been present for some time, but one (the omission) is something I introduced with my previous patch. Fixing all this required rethinking how du's process_file function works. I can't easily untangle the bug fixes from the performance improvements, so I'm taking the liberty of shipping out one patch for both. I must say that the code in fts.c is surely the worst in coreutils! It's very hard to figure out under what cases FTS_DC can be returned (is it always after FTS_D, or can it occur without a FTS_D, for example), and similarly for FTS_DNR and FTS_ERR. Perhaps at some point we can find a cheerful contributor who can clean up the stables in the fts code; or at least document it. Anyway, I eventually gave up, and wrote du.c so as to not assume properties of fts when I couldn't be sure of them. >From 3e68ecc62ea435459f99bd8feff883f88f9a3823 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 8 Jul 2010 10:34:40 -0700 Subject: [PATCH] du: tune, and fix some -L bugs with dangling or cyclic symlinks * src/du.c (process_file): Avoid recalculation of hashes and of file-exclusion for directories. Do not descend into the same directory more than once, unless -l is given; this is faster. Calculate stat buffer lazily, since it need not be computed at all for excluded files. Count space if FTS_ERR, since stat buffer is always valid then. No need for 'print' local variable. (main): Use FTS_NOSTAT. Use FTS_TIGHT_CYCLE_CHECK only when not hashing everything, since process_file finds cycles on its own when hashing everything. * tests/du/deref: Add test cases for -L bugs. --- src/du.c | 144 +++++++++++++++++++++++++++++--------------------------- tests/du/deref | 16 ++++++ 2 files changed, 91 insertions(+), 69 deletions(-) diff --git a/src/du.c b/src/du.c index 739be73..d8c7e00 100644 --- a/src/du.c +++ b/src/du.c @@ -392,7 +392,7 @@ print_size (const struct duinfo *pdui, const char *string) static bool process_file (FTS *fts, FTSENT *ent) { - bool ok; + bool ok = true; struct duinfo dui; struct duinfo dui_to_print; size_t level; @@ -407,79 +407,86 @@ process_file (FTS *fts, FTSENT *ent) The sum of the sizes of all entries in the hierarchy at or below the directory at the specified level. */ static struct dulevel *dulvl; - bool print = true; const char *file = ent->fts_path; const struct stat *sb = ent->fts_statp; - bool skip; - - /* If necessary, set FTS_SKIP before returning. */ - skip = excluded_file_name (exclude, file); - if (skip) - fts_set (fts, ent, FTS_SKIP); + int info = ent->fts_info; - switch (ent->fts_info) + if (info == FTS_DNR) { - case FTS_NS: - error (0, ent->fts_errno, _("cannot access %s"), quote (file)); - return false; - - case FTS_ERR: - /* if (S_ISDIR (ent->fts_statp->st_mode) && FIXME */ - error (0, ent->fts_errno, _("%s"), quote (file)); - return false; - - case FTS_DNR: - /* Don't return just yet, since although the directory is not readable, - we were able to stat it, so we do have a size. */ + /* An error occurred, but the size is known, so count it. */ error (0, ent->fts_errno, _("cannot read directory %s"), quote (file)); ok = false; - break; + } + else if (info != FTS_DP) + { + bool excluded = excluded_file_name (exclude, file); + if (! excluded) + { + /* Make the stat buffer *SB valid, or fail noisily. */ + + if (info == FTS_NSOK) + { + fts_set (fts, ent, FTS_AGAIN); + FTSENT const *e = fts_read (fts); + assert (e == ent); + info = ent->fts_info; + } - case FTS_DC: /* directory that causes cycles */ - if (cycle_warning_required (fts, ent)) + if (info == FTS_NS || info == FTS_SLNONE) + { + error (0, ent->fts_errno, _("cannot access %s"), quote (file)); + return false; + } + } + + if (excluded + || (! opt_count_all + && (hash_all || (! S_ISDIR (sb->st_mode) && 1 < sb->st_nlink)) + && ! hash_ins (sb->st_ino, sb->st_dev))) { - emit_cycle_warning (file); - return false; + /* If ignoring a directory in preorder, skip its children. + Ignore the next fts_read output too, as it's a postorder + visit to the same directory. */ + if (info == FTS_D) + { + fts_set (fts, ent, FTS_SKIP); + FTSENT const *e = fts_read (fts); + assert (e == ent); + } + + return true; } - ok = true; - break; - default: - ok = true; - break; - } + switch (info) + { + case FTS_D: + return true; - /* If this is the first (pre-order) encounter with a directory, - or if it's the second encounter for a skipped directory, then - return right away. */ - if (ent->fts_info == FTS_D || skip) - return ok; - - /* If the file is being excluded or if it has already been counted - via a hard link, then don't let it contribute to the sums. */ - if (skip - || (!opt_count_all - && (hash_all || (! S_ISDIR (sb->st_mode) && 1 < sb->st_nlink)) - && ! hash_ins (sb->st_ino, sb->st_dev))) - { - /* Note that we must not simply return here. - We still have to update prev_level and maybe propagate - some sums up the hierarchy. */ - duinfo_init (&dui); - print = false; - } - else - { - duinfo_set (&dui, - (apparent_size - ? sb->st_size - : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE), - (time_type == time_mtime ? get_stat_mtime (sb) - : time_type == time_atime ? get_stat_atime (sb) - : get_stat_ctime (sb))); + case FTS_ERR: + /* An error occurred, but the size is known, so count it. */ + error (0, ent->fts_errno, _("%s"), quote (file)); + ok = false; + break; + + case FTS_DC: + if (cycle_warning_required (fts, ent)) + { + emit_cycle_warning (file); + return false; + } + return true; + } } + duinfo_set (&dui, + (apparent_size + ? sb->st_size + : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE), + (time_type == time_mtime ? get_stat_mtime (sb) + : time_type == time_atime ? get_stat_atime (sb) + : get_stat_ctime (sb))); + level = ent->fts_level; dui_to_print = dui; @@ -535,20 +542,14 @@ process_file (FTS *fts, FTSENT *ent) /* Let the size of a directory entry contribute to the total for the containing directory, unless --separate-dirs (-S) is specified. */ - if ( ! (opt_separate_dirs && IS_DIR_TYPE (ent->fts_info))) + if (! (opt_separate_dirs && IS_DIR_TYPE (info))) duinfo_add (&dulvl[level].ent, &dui); /* Even if this directory is unreadable or we can't chdir into it, do let its size contribute to the total. */ duinfo_add (&tot_dui, &dui); - /* If we're not counting an entry, e.g., because it's a hard link - to a file we've already counted (and --count-links), then don't - print a line for it. */ - if (!print) - return ok; - - if ((IS_DIR_TYPE (ent->fts_info) && level <= max_depth) + if ((IS_DIR_TYPE (info) && level <= max_depth) || ((opt_all && level <= max_depth) || level == 0)) print_size (&dui_to_print, file); @@ -608,7 +609,7 @@ main (int argc, char **argv) char *files_from = NULL; /* Bit flags that control how fts works. */ - int bit_flags = FTS_TIGHT_CYCLE_CHECK | FTS_DEFER_STAT; + int bit_flags = FTS_NOSTAT; /* Select one of the three FTS_ options that control if/when to follow a symlink. */ @@ -902,6 +903,11 @@ main (int argc, char **argv) if (!di_set) xalloc_die (); + /* If not hashing everything, process_file won't find cycles on its + own, so ask fts_read to check for them accurately. */ + if (opt_count_all || ! hash_all) + bit_flags |= FTS_TIGHT_CYCLE_CHECK; + bit_flags |= symlink_deref_bits; static char *temp_argv[] = { NULL, NULL }; diff --git a/tests/du/deref b/tests/du/deref index 79737a6..8e4feac 100755 --- a/tests/du/deref +++ b/tests/du/deref @@ -1,6 +1,8 @@ #!/bin/sh # prior to coreutils-4.5.3, du -D didn't work in some cases # Based on an example from Andreas Schwab and/or Michal Svec. +# Also, up to coreutils-8.5, du -L sometimes incorrectly +# counted the space of the followed symlinks. # Copyright (C) 2002, 2006-2010 Free Software Foundation, Inc. @@ -27,10 +29,24 @@ fi mkdir -p a/sub || framework_failure ln -s a/sub slink || framework_failure touch b || framework_failure +ln -s .. a/sub/dotdot || framework_failure +ln -s nowhere dangle || framework_failure # This used to fail with the following diagnostic: # du: `b': No such file or directory du -sD slink b > /dev/null 2>&1 || fail=1 +# This used to fail to report the dangling symlink. +du -L dangle > /dev/null 2>&1 && fail=1 + +# du -L used to mess up, either by counting the symlink's disk space itself +# (-L should follow symlinks, not count their space) +# or (briefly in July 2010) by omitting the entry for "a". +du_L_output=`du -L a` || fail=1 +du_lL_output=`du -lL a` || fail=1 +du_x_output=`du --exclude=dotdot a` || fail=1 +test "X$du_L_output" = "X$du_x_output" || fail=1 +test "X$du_lL_output" = "X$du_x_output" || fail=1 + Exit $fail -- 1.7.0.4 From debbugs-submit-bounces@debbugs.gnu.org Sat Jul 24 03:24:23 2010 Received: (at submit) by debbugs.gnu.org; 24 Jul 2010 07:24:24 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OcZ5q-00038f-Us for submit@debbugs.gnu.org; Sat, 24 Jul 2010 03:24:23 -0400 Received: from mail.gnu.org ([199.232.76.166] helo=mx10.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OcZ5p-00038Z-Dt for submit@debbugs.gnu.org; Sat, 24 Jul 2010 03:24:21 -0400 Received: from lists.gnu.org ([199.232.76.165]:52824) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1OcZ5o-0000qz-Oz for submit@debbugs.gnu.org; Sat, 24 Jul 2010 03:24:20 -0400 Received: from [140.186.70.92] (port=46924 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OcZ5n-0001VT-AN for bug-coreutils@gnu.org; Sat, 24 Jul 2010 03:24:20 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=unavailable version=3.3.1 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OcZ5m-0007be-Hd for bug-coreutils@gnu.org; Sat, 24 Jul 2010 03:24:19 -0400 Received: from kiwi.cs.ucla.edu ([131.179.128.19]:64160) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OcZ5m-0007bR-7z for bug-coreutils@gnu.org; Sat, 24 Jul 2010 03:24:18 -0400 Received: from [131.179.64.200] (Penguin.CS.UCLA.EDU [131.179.64.200]) by kiwi.cs.ucla.edu (8.13.8+Sun/8.13.8/UCLACS-6.0) with ESMTP id o6O7O7Dk006685; Sat, 24 Jul 2010 00:24:09 -0700 (PDT) Message-ID: <4C4A9517.9060708@cs.ucla.edu> Date: Sat, 24 Jul 2010 00:24:07 -0700 From: Paul Eggert Organization: UCLA Computer Science Department User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.10) Gecko/20100527 Thunderbird/3.0.5 MIME-Version: 1.0 To: Bug Coreutils Subject: Re: [PATCH] du: tune, and fix some -L bugs with dangling or cyclic symlinks References: <4C361834.4080306@cs.ucla.edu> In-Reply-To: <4C361834.4080306@cs.ucla.edu> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-detected-operating-system: by eggs.gnu.org: Solaris 10 (beta) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit Cc: 6655@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -5.0 (-----) No further comment, and that patch does fix some real bugs and seems to be pretty safe, so I took the liberty of pushing it. From debbugs-submit-bounces@debbugs.gnu.org Sun Jul 25 13:55:56 2010 Received: (at submit) by debbugs.gnu.org; 25 Jul 2010 17:55:56 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Od5Qa-0002CB-1w for submit@debbugs.gnu.org; Sun, 25 Jul 2010 13:55:56 -0400 Received: from mx10.gnu.org ([199.232.76.166]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Od5QY-0002C6-5p for submit@debbugs.gnu.org; Sun, 25 Jul 2010 13:55:55 -0400 Received: from lists.gnu.org ([199.232.76.165]:59528) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Od5Qb-0006uk-A2 for submit@debbugs.gnu.org; Sun, 25 Jul 2010 13:55:57 -0400 Received: from [140.186.70.92] (port=59743 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Od5Qa-00047a-5a for bug-coreutils@gnu.org; Sun, 25 Jul 2010 13:55:56 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=unavailable version=3.3.1 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Od5QY-0006vY-Pk for bug-coreutils@gnu.org; Sun, 25 Jul 2010 13:55:56 -0400 Received: from kiwi.cs.ucla.edu ([131.179.128.19]:37170) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Od5QY-0006vH-Gt for bug-coreutils@gnu.org; Sun, 25 Jul 2010 13:55:54 -0400 Received: from [131.179.64.200] (Penguin.CS.UCLA.EDU [131.179.64.200]) by kiwi.cs.ucla.edu (8.13.8+Sun/8.13.8/UCLACS-6.0) with ESMTP id o6PHtkkl020777; Sun, 25 Jul 2010 10:55:46 -0700 (PDT) Message-ID: <4C4C7AA1.3020508@cs.ucla.edu> Date: Sun, 25 Jul 2010 10:55:45 -0700 From: Paul Eggert Organization: UCLA Computer Science Department User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.10) Gecko/20100527 Thunderbird/3.0.5 MIME-Version: 1.0 To: =?ISO-8859-1?Q?P=E1draig_Brady?= , Bug Coreutils Subject: Re: bug#6586: [PATCH] du: tune, and fix some -L bugs with dangling or cyclic symlinks References: <4C361834.4080306@cs.ucla.edu> <4C4B8FC7.7000000@draigBrady.com> In-Reply-To: <4C4B8FC7.7000000@draigBrady.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by kiwi.cs.ucla.edu id o6PHtkkl020777 X-detected-operating-system: by eggs.gnu.org: Solaris 10 (beta) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -5.0 (-----) On 07/24/10 18:13, P=E1draig Brady wrote: > That probably deserves a NEWS entry Thanks, I pushed this: >From 01ca128807be89f7a2709e7a12e2cd1498f3d96b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 25 Jul 2010 10:53:42 -0700 Subject: [PATCH] du: add NEWS entry for recent du -L fixes --- NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/NEWS b/NEWS index 124ca5a..b19294b 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ GNU coreutils NEWS -*-= outline -*- link count is 1, even if the file is reached multiple times by following symlinks or via multiple arguments. + du -H and -L now consistently count pointed-to files instead of + symbolic links, and correctly diagnose dangling symlinks. + ** New features cp now accepts the --attributes-only option to not copy file data, -- 1.7.1 From debbugs-submit-bounces@debbugs.gnu.org Sun Apr 17 05:11:46 2011 Received: (at 6586-done) by debbugs.gnu.org; 17 Apr 2011 09:11:46 +0000 Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1QBO1B-0001Tc-TV for submit@debbugs.gnu.org; Sun, 17 Apr 2011 05:11:46 -0400 Received: from mx.meyering.net ([82.230.74.64]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1QBO19-0001TR-TU for 6586-done@debbugs.gnu.org; Sun, 17 Apr 2011 05:11:44 -0400 Received: by rho.meyering.net (Acme Bit-Twister, from userid 1000) id 3B29D6012A; Sun, 17 Apr 2011 11:11:37 +0200 (CEST) From: Jim Meyering To: 6586-done@debbugs.gnu.org Subject: Re: bug#6586: [PATCH] du: tune, and fix some -L bugs with dangling or cyclic symlinks In-Reply-To: <4C4C7AA1.3020508@cs.ucla.edu> (Paul Eggert's message of "Sun, 25 Jul 2010 10:55:45 -0700") References: <4C361834.4080306@cs.ucla.edu> <4C4B8FC7.7000000@draigBrady.com> <4C4C7AA1.3020508@cs.ucla.edu> Date: Sun, 17 Apr 2011 11:11:37 +0200 Message-ID: <87writb5ti.fsf@rho.meyering.net> Lines: 5 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -5.9 (-----) X-Debbugs-Envelope-To: 6586-done X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -5.9 (-----) Paul Eggert wrote: >> That probably deserves a NEWS entry > Thanks, I pushed this: Thanks. Closing. From unknown Wed Jun 18 23:04:43 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sun, 15 May 2011 11:24:05 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator