Hi Victor-Philipp. Victor-Philipp Busch, 13.07.2007 11:31: > It seems your patch have an error with coreutils 5.97-5.3: > > if > colorgcc -std=gnu99 -DHAVE_CONFIG_H -DLIBDIR=\"/usr/lib\" -I. -I. -I.. -I.. > -I. -g -DSYSLOG_SUCCESS -DSYSLOG_FAILURE -DSYSLOG_NON_ROOT -O2 -MT > utimecmp.o -MD -MP -MF ".deps/utimecmp.Tpo" -c -o utimecmp.o utimecmp.c; \ > then mv -f ".deps/utimecmp.Tpo" ".deps/utimecmp.Po"; else > rm -f ".deps/utimecmp.Tpo"; exit 1; fi > In file included from utimecmp.c:41: > utimens.h:2: error: conflicting types for 'futimens' > /usr/include/sys/stat.h:370: error: previous declaration of 'futimens' was > here
No, that’s a bug in coreutils. However, I don’t know why it doesn’t work for you where it did for me. See #433394 for a fix. (Might still require backporting since the patch over there is for version 6.0.) I updated the patch to work with coreutils 6.0-1 from Experimental. As ususal, use at your own risk; it works fine here, though. Regards, Mathias -- debian/rules
--- coreutils-6.0.orig/src/copy.c 2007-07-16 22:02:18.000000000 +0200
+++ coreutils-6.0/src/copy.c 2007-07-16 22:21:56.000000000 +0200
@@ -17,6 +17,8 @@
/* Extracted from cp.c and librarified by Jim Meyering. */
+/* Progress bar support added by Miika Pekkarinen. [EMAIL PROTECTED] */
+
#include <config.h>
#include <stdio.h>
#include <assert.h>
@@ -29,6 +31,10 @@
# include <priv.h>
#endif
+#ifdef GWINSZ_IN_SYS_IOCTL
+# include <sys/ioctl.h>
+#endif
+
#include "system.h"
#include "acl.h"
#include "backupfile.h"
@@ -53,6 +59,9 @@
#include "utimens.h"
#include "xreadlink.h"
#include "yesno.h"
+#include "xstrtol.h"
+#include "human.h"
+#include "quotearg.h"
#ifndef HAVE_FCHOWN
# define HAVE_FCHOWN false
@@ -86,6 +95,8 @@
/* Initial size of the above hash table. */
#define DEST_INFO_INITIAL_CAPACITY 61
+#define SAMPLE_MAX 10
+
static bool copy_internal (char const *src_name, char const *dst_name,
bool new_dst, dev_t device,
struct dir_list *ancestors,
@@ -172,6 +183,31 @@
return ok;
}
+/* Shorten a string '/long path/long file' to 'long fi...'
+ Also adds padding bytes to end of the string if necessary */
+char *shorten_name(const char *str, size_t max_width)
+{
+ char *shortname;
+ const char *filename;
+ size_t len;
+
+ filename = base_name (str);
+ len = strlen(filename);
+ shortname = (char *) xmalloc (max_width + 1);
+ strncpy (shortname, filename, max_width);
+ shortname[max_width] = '\0';
+ if (len > max_width)
+ {
+ memset(shortname + max_width - 3, '.', 3);
+ }
+ else
+ {
+ memset(shortname + len, ' ', max_width - len);
+ }
+
+ return shortname;
+}
+
/* Set the owner and owning group of DEST_DESC to the st_uid and
st_gid fields of SRC_SB. If DEST_DESC is undefined (-1), set
the owner and owning group of DST_NAME instead. DEST_DESC must
@@ -254,6 +290,20 @@
struct stat src_open_sb;
bool return_val = true;
+ time_t t_start;
+ time_t t_last;
+ time_t t_now;
+ off_t last_bytes = 0;
+ int progress_bar_printed = 0;
+ char *shortname = NULL;
+ off_t sample_window[SAMPLE_MAX];
+ off_t sample_sum = 0;
+ int sample_count = 0;
+ long int line_length = 0;
+#ifdef TIOCGWINSZ
+ struct winsize ws;
+#endif
+
source_desc = open (src_name, O_RDONLY | O_BINARY);
if (source_desc < 0)
{
@@ -389,6 +439,9 @@
buf_alloc = xmalloc (buf_size + buf_alignment_slop);
buf = ptr_align (buf_alloc, buf_alignment);
+ time (&t_start);
+ t_last = t_start;
+
for (;;)
{
word *wp = NULL;
@@ -459,7 +512,111 @@
if (n_read != buf_size && S_ISREG (src_open_sb.st_mode))
break;
}
- }
+
+ time (&t_now);
+
+ /* Progress bar stuff */
+ if (! x->pbar_show || t_now - t_start < x->pbar_delay)
+ {
+ continue;
+ }
+
+ if (! progress_bar_printed)
+ {
+ /* Column width check code copied from ls.c */
+ char const *p = getenv ("COLUMNS");
+ if (p && *p)
+ {
+ long int tmp_long;
+ if (xstrtol (p, NULL, 0, &tmp_long, NULL) == LONGINT_OK
+ && 0 < tmp_long && tmp_long <= INT_MAX)
+ {
+ line_length = tmp_long;
+ }
+ else
+ {
+ error (0, 0,
+ _("ignoring invalid width in environment \
+ variable COLUMNS: %s"),
+ quotearg (p));
+ }
+ }
+
+#ifdef TIOCGWINSZ
+ if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 && ws.ws_col != 0)
+ {
+ line_length = ws.ws_col;
+ }
+#endif
+ if (line_length < 50)
+ {
+ continue;
+ }
+
+ /* Take a short filename for progress bar */
+ shortname = shorten_name(src_name, line_length - 48);
+ progress_bar_printed = 1;
+ }
+
+ if (t_now == t_last)
+ {
+ continue;
+ }
+
+ if (sample_count == SAMPLE_MAX)
+ {
+ int i;
+
+ sample_sum -= sample_window[0];
+ for (i = 0; i < SAMPLE_MAX - 1; i++)
+ {
+ sample_window[i] = sample_window[i + 1];
+ }
+ }
+ else
+ {
+ sample_count++;
+ }
+
+ {
+ char str_size[LONGEST_HUMAN_READABLE + 1];
+ char str_speed[LONGEST_HUMAN_READABLE + 1];
+ char etabuf[64];
+ time_t t_temp;
+
+ sample_window[sample_count - 1] = (n_read_total - last_bytes) /
+ (t_now - t_last);
+ sample_sum += sample_window[sample_count - 1];
+
+ /* Calculate the remaining time */
+ t_temp = (src_open_sb.st_size - n_read_total) / (sample_sum / sample_count);
+
+ /* Don't print the progress bar if the estimated remaining
+ time is low. */
+ if (progress_bar_printed == 1 && t_temp < x->pbar_min_est)
+ {
+ continue;
+ }
+ progress_bar_printed = 2;
+
+ strftime(etabuf, sizeof etabuf, "%H:%M.%S",
+ gmtime(&t_temp));
+ printf (_("%s | %3lu%% | %9s | %9s/s | ETA %s\r"), shortname,
+ (unsigned long)(n_read_total * 100 / src_open_sb.st_size),
+ human_readable(src_open_sb.st_size, str_size, human_autoscale|human_base_1024|human_space_before_unit|human_SI|human_B, 1, 1),
+ human_readable(sample_sum / sample_count, str_speed, human_autoscale|human_base_1024|human_space_before_unit|human_SI|human_B, 1, 1),
+ etabuf);
+ fflush (stdout);
+ t_last = t_now;
+ last_bytes = n_read_total;
+ }
+ }
+
+ /* Print a newline if progress bar is enabled and has been shown */
+ if (progress_bar_printed == 2)
+ {
+ printf ("%s | 100%%\n", shortname);
+ }
/* If the file ends with a `hole', something needs to be written at
the end. Otherwise the kernel would truncate the file at the end
@@ -537,6 +695,11 @@
return_val = false;
}
+ if (shortname != NULL)
+ {
+ free (shortname);
+ }
+
free (buf_alloc);
return return_val;
}
--- coreutils-6.0.orig/src/copy.h 2005-12-17 11:48:59.000000000 +0100
+++ coreutils-6.0/src/copy.h 2007-07-16 22:02:42.000000000 +0200
@@ -172,6 +172,16 @@
/* If true, display the names of the files before copying them. */
bool verbose;
+ /* If true, display a progress bar when the following conditions are
+ * met:
+ - pbar_delay defines how many seconds to wait before considering to
+ display the progress bar
+ - pbar_min_est defines how many seconds estimated operation complete
+ time should be at least to show the progress bar. */
+ bool pbar_show;
+ int pbar_delay;
+ int pbar_min_est;
+
/* If true, stdin is a tty. */
bool stdin_tty;
--- coreutils-6.0.orig/src/cp.c 2006-05-15 22:17:14.000000000 +0200
+++ coreutils-6.0/src/cp.c 2007-07-16 22:07:53.000000000 +0200
@@ -83,6 +83,14 @@
/* Initial number of entries in the inode hash table. */
#define INITIAL_ENTRY_TAB_SIZE 70
+/* Initial settings for progress bar when it's enabled.
+ PROGRESS_DELAY defines how many seconds to wait before even
+ considering to display a proggress bar.
+ PROGRESS_MIN_EST defines how many seconds estimated operation
+ complete time should be at least to show the progress bar. */
+#define PROGRESS_DELAY 5
+#define PROGRESS_MIN_EST 5
+
/* The invocation name of this program. */
char *program_name;
@@ -122,6 +130,7 @@
{"copy-contents", no_argument, NULL, COPY_CONTENTS_OPTION},
{"dereference", no_argument, NULL, 'L'},
{"force", no_argument, NULL, 'f'},
+ {"progress", no_argument, NULL, 'g'},
{"interactive", no_argument, NULL, 'i'},
{"link", no_argument, NULL, 'l'},
{"no-dereference", no_argument, NULL, 'P'},
@@ -178,6 +187,8 @@
fputs (_("\
-f, --force if an existing destination file cannot be\n\
opened, remove it and try again\n\
+ -g, --progress show a progress bar if operation is going to\n\
+ take a long time\n\
-i, --interactive prompt before overwrite\n\
-H follow command-line symbolic links\n\
"), stdout);
@@ -743,6 +754,11 @@
x->update = false;
x->verbose = false;
+
+ x->pbar_show = false;
+ x->pbar_delay = PROGRESS_DELAY;
+ x->pbar_min_est = PROGRESS_MIN_EST;
+
x->dest_info = NULL;
x->src_info = NULL;
}
@@ -849,7 +865,7 @@
we'll actually use backup_suffix_string. */
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
- while ((c = getopt_long (argc, argv, "abdfHilLprst:uvxPRS:T",
+ while ((c = getopt_long (argc, argv, "abdfgHilLprst:uvxPRS:T",
long_opts, NULL))
!= -1)
{
@@ -909,6 +925,10 @@
x.dereference = DEREF_NEVER;
break;
+ case 'g':
+ x.pbar_show = true;
+ break;
+
case NO_PRESERVE_ATTRIBUTES_OPTION:
decode_preserve_arg (optarg, &x, false);
break;
--- coreutils-6.0.orig/src/mv.c 2006-08-15 12:35:09.000000000 +0200
+++ coreutils-6.0/src/mv.c 2007-07-16 22:11:29.000000000 +0200
@@ -45,6 +45,14 @@
/* Initial number of entries in the inode hash table. */
#define INITIAL_ENTRY_TAB_SIZE 70
+/* Initial settings for progress bar when it's enabled.
+ PROGRESS_DELAY defines how many seconds to wait before even
+ considering to display a proggress bar.
+ PROGRESS_MIN_EST defines how many seconds estimated operation
+ complete time should be at least to show the progress bar. */
+#define PROGRESS_DELAY 5
+#define PROGRESS_MIN_EST 5
+
/* For long options that have no equivalent short option, use a
non-character as a pseudo short option, starting with CHAR_MAX + 1. */
enum
@@ -75,6 +83,7 @@
{
{"backup", optional_argument, NULL, 'b'},
{"force", no_argument, NULL, 'f'},
+ {"progress", no_argument, NULL, 'g'},
{"interactive", no_argument, NULL, 'i'},
{"no-target-directory", no_argument, NULL, 'T'},
{"reply", required_argument, NULL, REPLY_OPTION}, /* Deprecated 2005-07-03,
@@ -103,6 +112,10 @@
x->verbose = false;
+ x->pbar_show = false;
+ x->pbar_delay = PROGRESS_DELAY;
+ x->pbar_min_est = PROGRESS_MIN_EST;
+
/* Since this program may well have to process additional command
line arguments after any call to `rm', that function must preserve
the initial working directory, in case one of those is a
@@ -138,6 +151,10 @@
x->verbose = false;
x->dest_info = NULL;
x->src_info = NULL;
+
+ x->pbar_show = false;
+ x->pbar_delay = PROGRESS_DELAY;
+ x->pbar_min_est = PROGRESS_MIN_EST;
}
/* FILE is the last operand of this command. Return true if FILE is a
@@ -305,6 +322,8 @@
--backup[=CONTROL] make a backup of each existing destination file\n\
-b like --backup but does not accept an argument\n\
-f, --force do not prompt before overwriting\n\
+ -g, --progress show a progress bar if operation is going to\n\
+ take a long time\n\
-i, --interactive prompt before overwrite\n\
"), stdout);
fputs (_("\
@@ -368,7 +387,7 @@
we'll actually use backup_suffix_string. */
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
- while ((c = getopt_long (argc, argv, "bfit:uvS:T", long_options, NULL))
+ while ((c = getopt_long (argc, argv, "bfgit:uvS:T", long_options, NULL))
!= -1)
{
switch (c)
@@ -381,6 +400,9 @@
case 'f':
x.interactive = I_ALWAYS_YES;
break;
+ case 'g':
+ x.pbar_show = true;
+ break;
case 'i':
x.interactive = I_ASK_USER;
break;
--- coreutils-6.0.orig/src/remove.h 2005-11-04 11:14:14.000000000 +0100
+++ coreutils-6.0/src/remove.h 2007-07-16 22:12:36.000000000 +0200
@@ -43,6 +43,16 @@
/* If true, display the name of each file removed. */
bool verbose;
+ /* If true, display a progress bar when the following conditions are
+ * met:
+ - pbar_delay defines how many seconds to wait before considering to
+ display the progress bar
+ - pbar_min_est defines how many seconds estimated operation complete
+ time should be at least to show the progress bar. */
+ bool pbar_show;
+ int pbar_delay;
+ int pbar_min_est;
+
/* If true, treat the failure by the rm function to restore the
current working directory as a fatal error. I.e., if this field
is true and the rm function cannot restore cwd, it must exit with
signature.asc
Description: OpenPGP digital signature

