On 09/30/2012 05:43 PM, Bernhard Voelker wrote:
On 09/29/2012 11:29 PM, Bernhard Voelker wrote:
Here you are (see attached):

[PATCH 20/20] df: print "total" in grand total's target field if no source
[PATCH 19/20] df: cleanup comments regarding double blank after
[PATCH 18/20] df: add a test for the --output option
[PATCH 17/20] df: document the new --output option
[PATCH 16/20] df: plug two minor memory holes detected by valgrind
[PATCH 15/20] df: add new --output option
[PATCH 14/20] df: enhance comment describing history
[PATCH 13/20] df: give posix_format variable a better scope
[PATCH 12/20] df: cleanup header_mode handling regarding --inodes
[PATCH 11/20] df: minor cleanup to improve readability
[PATCH 10/20] df: remove remainder of pre-mixed fields support
[PATCH 09/20] df: add basic support for mixed block and inode fields
[PATCH 08/20] df: print '-' into the target column of the total line
[PATCH 07/20] df: only sum up grand total if required
[PATCH 06/20] df: remove now-obsolescent condition
[PATCH 05/20] df: use enum value for long option --total
[PATCH 04/20] df: apply ambsalign to the last field with
[PATCH 03/20] df: rework internal processing of output columns
[PATCH 02/20] df: rename some displayable fields
[PATCH 01/20] df: move the call of get_header from get_dev to main

The bigger/important changes are in the patches 03, 09, and 15.

Example:

   $ src/df -h --tot --o=target,pcent,ipcent / /home
   Mounted on Use% IUse%
   /           65%   32%
   /home       65%    2%
   total       65%    5%

Have a nice day,
Berny

I have added another patch at the end:

   [PATCH 21/21] df: ensure that the mount list contains a valid
   fstype with --output

   The function read_file_system_list only ensures a valid file
   system type if the calling parameter is true. With the new
   option --output, there is an additional condition needed:
   when the FSTYPE_FIELD is used.

I didn't notice a problem on GNU/Linux, but the documentation of
read_file_system_list() leads to the conclusion that df needs to
pass true also for 'df --o=fstype,...'.

The new, additional condition may also have replaced the one before
     || print_type
because
     || field_data[FSTYPE_FIELD].used
also leads to true with 'df -T'; I just left it there for now.

Have a nice day,
Berny



I've finished my review. Sorry for the delay.
I've made a couple of adjustments in the attached df--output-adjustments.patch

The first is to rename --output=total to --output=size
I think having `df --total --output=total` is a bit confusing?

Also I've changed df --output to show the block size in the "size" header,
unless -h (human) is being used.  I.E. behave with this header
more like the traditional df output.  I think this is needed
as important info is lost about the units otherwise?

I've put the full rebased 24 item patch set here:
http://www.pixelbeat.org/patches/coreutils/df--output.patch.bz2

Before merging I'll probably reorder/squash to 3 patches;
logic, docs and test

thanks,
Pádraig.
>From d34ae68693ebdb1b049479ad50c3ce2c8b823aa7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Wed, 7 Nov 2012 00:45:07 +0000
Subject: [PATCH 1/3] df: change --output=total to --output=size

To avoid confusion with --total

* src/df.c: Rename the argument.
* doc/coreutils.texi (df invocation): Likewise.
* test/df/df-output.sh: Likewise.
---
 doc/coreutils.texi    |    4 ++--
 src/df.c              |    6 +++---
 tests/df/df-output.sh |    2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 8027c78..b251b3d 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -10702,14 +10702,14 @@ The source of the mount point, usually a device.
 @item fstype
 File system type.
 
-@item total
+@item size
 Total number of blocks.
 @item used
 Number of used blocks.
 @item avail
 Number of available blocks.
 @item pcent
-Percentage of @var{used} divided by @var{total}.
+Percentage of @var{used} divided by @var{size}.
 
 @item itotal
 Total number of inodes.
diff --git a/src/df.c b/src/df.c
index 079fa02..bdeaf03 100644
--- a/src/df.c
+++ b/src/df.c
@@ -166,7 +166,7 @@ static struct field_data_t field_data[] = {
     "fstype", OTHER_FLD, N_("Type"),        4, MBS_ALIGN_LEFT,  false },
 
   [TOTAL_FIELD] = { TOTAL_FIELD,
-    "total",  BLOCK_FLD, N_("blocks"),      5, MBS_ALIGN_RIGHT, false },
+    "size",   BLOCK_FLD, N_("blocks"),      5, MBS_ALIGN_RIGHT, false },
 
   [USED_FIELD] = { USED_FIELD,
     "used",   BLOCK_FLD, N_("Used"),        5, MBS_ALIGN_RIGHT, false },
@@ -193,7 +193,7 @@ static struct field_data_t field_data[] = {
     "target", OTHER_FLD, N_("Mounted on"),  0, MBS_ALIGN_LEFT,  false }
 };
 
-static char const *all_args_string = "source,fstype,total,used,avail,pcent,"
+static char const *all_args_string = "source,fstype,size,used,avail,pcent,"
   "itotal,iused,iavail,ipcent,target";
 
 /* Storage for the definition of output columns.  */
@@ -1158,7 +1158,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
       emit_size_note ();
   fputs (_("\n\
 FIELD_LIST is a comma-separated list of columns to be included.  Valid\n\
-field names are: 'source', 'fstype', 'total', 'used', 'avail', 'pcent',\n\
+field names are: 'source', 'fstype', 'size', 'used', 'avail', 'pcent',\n\
 'itotal', 'iused', 'iavail', 'ipcent' and 'target' (see info page).\n\
 "), stdout);
       emit_ancillary_info ();
diff --git a/tests/df/df-output.sh b/tests/df/df-output.sh
index 210cce3..34c4049 100644
--- a/tests/df/df-output.sh
+++ b/tests/df/df-output.sh
@@ -70,7 +70,7 @@ cat <<\EOF > exp || framework_failure_
 Filesystem Type Size Used Avail Use% Inodes IUsed IFree IUse% Mounted on
 EOF
 
-df --o=source,fstype,total,used,avail,pcent \
+df --o=source,fstype,size,used,avail,pcent \
  --o=itotal,iused,iavail,ipcent,target '.' >out || fail=1
 sed -e '1 {s/ [ ]*/ /g;q}' out > out2
 compare exp out2 || fail=1
-- 
1.7.6.4


>From c8ae726034d22b7fc8015134587c6dd6df6222ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Wed, 7 Nov 2012 00:52:44 +0000
Subject: [PATCH 2/3] df: with --output but without -h, show the block size

* src/df.c (get_header): Indicate the block size used,
in the "size" header, when using --output without -h.
* tests/df/df-output.sh: Adjust for, and add an extra test for,
the new behavior.
---
 src/df.c              |    8 +++++++-
 tests/df/df-output.sh |   14 ++++++++++++--
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/df.c b/src/df.c
index bdeaf03..751740c 100644
--- a/src/df.c
+++ b/src/df.c
@@ -493,7 +493,10 @@ get_header (void)
       char *cell = NULL;
       char const *header = _(columns[col]->caption);
 
-      if (header_mode == DEFAULT_MODE && columns[col]->field == TOTAL_FIELD)
+      if (columns[col]->field == TOTAL_FIELD
+          && (header_mode == DEFAULT_MODE
+              || (header_mode == OUTPUT_MODE
+                  && !(human_output_opts & human_autoscale))))
         {
           char buf[LONGEST_HUMAN_READABLE + 1];
 
@@ -526,6 +529,9 @@ get_header (void)
 
           char *num = human_readable (output_block_size, buf, opts, 1, 1);
 
+          /* Reset the header back to the default in OUTPUT_MODE.  */
+          header = N_("blocks");
+
           /* TRANSLATORS: this is the "1K-blocks" header in "df" output.  */
           if (asprintf (&cell, _("%s-%s"), num, header) == -1)
             cell = NULL;
diff --git a/tests/df/df-output.sh b/tests/df/df-output.sh
index 34c4049..0b40b28 100644
--- a/tests/df/df-output.sh
+++ b/tests/df/df-output.sh
@@ -70,12 +70,22 @@ cat <<\EOF > exp || framework_failure_
 Filesystem Type Size Used Avail Use% Inodes IUsed IFree IUse% Mounted on
 EOF
 
-df --o=source,fstype,size,used,avail,pcent \
+df -h --o=source,fstype,size,used,avail,pcent \
  --o=itotal,iused,iavail,ipcent,target '.' >out || fail=1
 sed -e '1 {s/ [ ]*/ /g;q}' out > out2
 compare exp out2 || fail=1
 
-df --output '.' >out || fail=1
+df -h --output '.' >out || fail=1
+sed -e '1 {s/ [ ]*/ /g;q}' out > out2
+compare exp out2 || fail=1
+
+# Ensure that --output indicates the block size
+# when not using --human-readable
+cat <<\EOF > exp || framework_failure_
+1K-blocks
+EOF
+
+df -B1K --output=size '.' >out || fail=1
 sed -e '1 {s/ [ ]*/ /g;q}' out > out2
 compare exp out2 || fail=1
 
-- 
1.7.6.4


>From a1d60dee50a7d75065e35e6ba74ab7412055a3ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Wed, 7 Nov 2012 02:35:51 +0000
Subject: [PATCH 3/3] maint: df: whitespace cleanups

Minor tweaks for squashing.
---
 src/df.c |   36 ++++++++++++++++++------------------
 1 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/df.c b/src/df.c
index 751740c..7f418c4 100644
--- a/src/df.c
+++ b/src/df.c
@@ -279,7 +279,7 @@ alloc_table_row (void)
 {
   nrows++;
   table = xnrealloc (table, nrows, sizeof (char *));
-  table[nrows-1] = xnmalloc (ncolumns, sizeof (char *));
+  table[nrows - 1] = xnmalloc (ncolumns, sizeof (char *));
 }
 
 /* Output each cell in the table, accounting for the
@@ -290,7 +290,7 @@ print_table (void)
 {
   size_t row;
 
-  for (row = 0; row < nrows; row ++)
+  for (row = 0; row < nrows; row++)
     {
       size_t col;
       for (col = 0; col < ncolumns; col++)
@@ -331,9 +331,9 @@ alloc_field (int f, const char *c)
 {
   ncolumns++;
   columns = xnrealloc (columns, ncolumns, sizeof (struct field_data_t *));
-  columns[ncolumns-1] = &field_data[f];
+  columns[ncolumns - 1] = &field_data[f];
   if (c != NULL)
-    columns[ncolumns-1]->caption = c;
+    columns[ncolumns - 1]->caption = c;
 
   if (field_data[f].used)
     assert (!"field used");
@@ -363,7 +363,7 @@ decode_output_arg (char const *arg)
       display_field_t field = -1;
       for (unsigned int i = 0; i < ARRAY_CARDINALITY (field_data); i++)
         {
-          if (STREQ (field_data[i].arg , s))
+          if (STREQ (field_data[i].arg, s))
             {
               field = i;
               break;
@@ -379,7 +379,7 @@ decode_output_arg (char const *arg)
         {
           /* Prevent the fields from being used more than once.  */
           error (0, 0, _("option --output: field '%s' used more than once"),
-            field_data[field].arg);
+                 field_data[field].arg);
           usage (EXIT_FAILURE);
         }
 
@@ -420,7 +420,7 @@ static void
 get_field_list (void)
 {
   switch (header_mode)
-  {
+    {
     case DEFAULT_MODE:
       alloc_field (SOURCE_FIELD, NULL);
       if (print_type)
@@ -468,15 +468,15 @@ get_field_list (void)
 
     case OUTPUT_MODE:
       if (!ncolumns)
-      {
-        /* Add all fields if --output was given without a field list.  */
-        decode_output_arg (all_args_string);
-      }
+        {
+          /* Add all fields if --output was given without a field list.  */
+          decode_output_arg (all_args_string);
+        }
       break;
 
     default:
       assert (!"invalid header_mode");
-  }
+    }
 }
 
 /* Obtain the appropriate header entries.  */
@@ -553,7 +553,7 @@ get_header (void)
 
       hide_problematic_chars (cell);
 
-      table[nrows-1][col] = cell;
+      table[nrows - 1][col] = cell;
 
       columns[col]->width = MAX (columns[col]->width, mbswidth (cell, 0));
     }
@@ -719,7 +719,7 @@ add_to_grand_total (struct field_values_t *bv, struct field_values_t *iv)
   if (known_value (bv->total))
     grand_fsu.fsu_blocks += bv->input_units * bv->total;
   if (known_value (bv->available_to_root))
-    grand_fsu.fsu_bfree  += bv->input_units * bv->available_to_root;
+    grand_fsu.fsu_bfree += bv->input_units * bv->available_to_root;
   if (known_value (bv->available))
     add_uint_with_neg_flag (&grand_fsu.fsu_bavail,
                             &grand_fsu.fsu_bavail_top_bit_set,
@@ -874,7 +874,7 @@ get_dev (char const *disk, char const *mount_point,
                      && v->used <= TYPE_MAXIMUM (uintmax_t) / 100
                      && v->used + v->available != 0
                      && (v->used + v->available < v->used)
-                         == v->negate_available)
+                     == v->negate_available)
               {
                 uintmax_t u100 = v->used * 100;
                 uintmax_t nonroot_total = v->used + v->available;
@@ -939,7 +939,7 @@ get_dev (char const *disk, char const *mount_point,
 
       hide_problematic_chars (cell);
       columns[col]->width = MAX (columns[col]->width, mbswidth (cell, 0));
-      table[nrows-1][col] = cell;
+      table[nrows - 1][col] = cell;
     }
   free (dev_name);
 }
@@ -1162,7 +1162,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
       fputs (VERSION_OPTION_DESCRIPTION, stdout);
       emit_blocksize_note ("DF");
       emit_size_note ();
-  fputs (_("\n\
+      fputs (_("\n\
 FIELD_LIST is a comma-separated list of columns to be included.  Valid\n\
 field names are: 'source', 'fstype', 'size', 'used', 'avail', 'pcent',\n\
 'itotal', 'iused', 'iavail', 'ipcent' and 'target' (see info page).\n\
@@ -1456,7 +1456,7 @@ main (int argc, char **argv)
         error (EXIT_FAILURE, 0, _("no file systems processed"));
     }
 
-  IF_LINT ( free (columns));
+  IF_LINT (free (columns));
 
   exit (exit_status);
 }
-- 
1.7.6.4

Reply via email to