]> Dogcows Code - chaz/tar/commitdiff
* src/tar.c (NS_PRECISION_FORMAT_MASK): New macro.
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 8 Nov 2005 07:20:02 +0000 (07:20 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 8 Nov 2005 07:20:02 +0000 (07:20 +0000)
(tar_timespec_cmp): New function. Wrapper over
timespec_cmp using the timespec precision provided by the
current archive format.
* src/common.h (tar_timespec_cmp): New declaration.
* src/compare.c (diff_file): Use tar_timespec_cmp.
* src/extract.c (file_newer_p): Likewise.
* src/update.c (update_archive): Likewise.
* tests/truncate.at: Reverted changes
* tests/update.at: Reverted changes

ChangeLog
src/common.h
src/compare.c
src/extract.c
src/tar.c
src/update.c
tests/truncate.at
tests/update.at

index 9666868a042d177ac11f790f913f764457cadf64..088f85acccdad1df34e17967742e470dbd2ce1f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,22 @@
+2005-11-07  Sergey Poznyakoff  <gray@gnu.org.ua>
+       and  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * src/tar.c (NS_PRECISION_FORMAT_MASK): New macro.
+       (tar_timespec_cmp): New function. Wrapper over
+       timespec_cmp using the timespec precision provided by the
+       current archive format.
+       * src/common.h (tar_timespec_cmp): New declaration.
+       * src/compare.c (diff_file): Use tar_timespec_cmp.
+       * src/extract.c (file_newer_p): Likewise.
+       * src/update.c (update_archive): Likewise.
+       * tests/truncate.at: Reverted changes
+       * tests/update.at: Reverted changes
+
 2005-11-07  Sergey Poznyakoff  <gray@gnu.org.ua>
 
        Support for incremental formats in pax archives.
        Fixed POSIX compatibility of `sparse' extended header keywords.
-       
+
        * src/common.h (dumpdir_size,get_gnu_dumpdir)
        (xheader_string_begin,xheader_string_add)
        (xheader_string_end): New functions.
        (xheader_finish): Do not rely om strlen to compute the length of
        the collected string: it can contain embedded nulls
        (xheader_string_begin,xheader_string_add,xheader_string_end): New
-       functions. 
+       functions.
        (sparse_map_decoder,dumpdir_coder,dumpdir_decoder): New
        functions. Handle GNU.sparse.map and GNU.dumpdir variables.
        (xhdr_tab): Add new variables.
 
        * tests/incr01.at: Test gnu, oldgnu, and posix formats
        * tests/incremental.at: Likewise
-       
+
 2005-11-06  Paul Eggert  <eggert@cs.ucla.edu>
 
        * src/xheader.c (strtoimax, strtoumax): Remove decls; now done
index 4ac5d62592563e299421df9f0f577ad6db719837..c1effd4d69f04ee225d31c5cb6dc98d7b986f4c0 100644 (file)
@@ -600,6 +600,7 @@ void request_stdin (const char *);
 void tar_stat_init (struct tar_stat_info *st);
 void tar_stat_destroy (struct tar_stat_info *st);
 void usage (int) __attribute__ ((noreturn));
+int tar_timespec_cmp (struct timespec a, struct timespec b);
 
 /* Module update.c.  */
 
index 70d72513aaef6ea80e0e35ae99ba2002758f4e5c..0173363df18be998266ed6a3b906071096cac9f8 100644 (file)
@@ -224,7 +224,8 @@ diff_file (void)
       if (!sys_compare_gid (&stat_data, &current_stat_info.stat))
        report_difference (&current_stat_info, _("Gid differs"));
 
-      if (timespec_cmp (get_stat_mtime (&stat_data), current_stat_info.mtime))
+      if (tar_timespec_cmp (get_stat_mtime (&stat_data), 
+                            current_stat_info.mtime))
        report_difference (&current_stat_info, _("Mod time differs"));
       if (current_header->header.typeflag != GNUTYPE_SPARSE &&
          stat_data.st_size != current_stat_info.stat.st_size)
index 2689f547684a317574927089cb6069f9fc770376..fbb93edd8a85a864feaadd85807841e7faed9e96 100644 (file)
@@ -469,7 +469,7 @@ file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
       return errno != ENOENT;
     }
   if (!S_ISDIR (st.st_mode)
-      && timespec_cmp (tar_stat->mtime, get_stat_mtime (&st)) <= 0)
+      && tar_timespec_cmp (tar_stat->mtime, get_stat_mtime (&st)) <= 0)
     {
       return true;
     }
index a25f2ce0b76536a610bbe51e7a8dd2cb37523e53..7736993cfe956d39326b3bdf39409fa97731bbd9 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -162,7 +162,7 @@ archive_format_string (enum archive_format fmt)
 static void
 assert_format(unsigned fmt_mask)
 {
-  if ((FORMAT_MASK(archive_format) & fmt_mask) == 0)
+  if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
     USAGE_ERROR ((0, 0,
                  _("GNU features wanted on incompatible archive format")));
 }
@@ -314,7 +314,7 @@ static struct argp_option options[] = {
   {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
    N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), 21 },
   {"seek", 'n', NULL, 0,
-   N_("archive is seekable"), 21 },    
+   N_("archive is seekable"), 21 },
 
   {NULL, 0, NULL, 0,
    N_("Overwrite control:"), 30},
@@ -557,7 +557,7 @@ static struct argp_option options[] = {
   {"show-stored-names", SHOW_STORED_NAMES_OPTION, 0, 0,
    N_("When creating archive in verbose mode, list member names as stored in the archive"),
    102 },
-    
+
   {NULL, 0, NULL, 0,
    N_("Compatibility options:"), 110 },
 
@@ -1047,7 +1047,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
       set_subcommand_option (LIST_SUBCOMMAND);
       test_label_option = true;
       break;
-      
+
     case 'T':
       update_argv (arg, state);
       /* Indicate we've been given -T option. This is for backward
@@ -1323,7 +1323,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case SHOW_STORED_NAMES_OPTION:
       show_stored_names_option = true;
       break;
-      
+
     case SUFFIX_OPTION:
       backup_option = true;
       args->backup_suffix_string = arg;
@@ -1679,7 +1679,7 @@ decode_options (int argc, char **argv)
 
   if (multi_volume_option)
     assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT));
-  
+
   if (sparse_option)
     assert_format (FORMAT_MASK (OLDGNU_FORMAT)
                   | FORMAT_MASK (GNU_FORMAT)
@@ -1981,3 +1981,17 @@ tar_stat_destroy (struct tar_stat_info *st)
   free (st->dumpdir);
   memset (st, 0, sizeof (*st));
 }
+
+/* Format mask for all available formats that support nanosecond
+   timestamp resolution. */
+#define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
+
+/* Same as timespec_cmp, but ignore nanoseconds if current archive
+   format does not provide sufficient resolution.  */
+int
+tar_timespec_cmp (struct timespec a, struct timespec b)
+{
+  if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
+    a.tv_nsec = b.tv_nsec = 0;
+  return timespec_cmp (a, b);
+}
index f28c6dc3f3ca0a7e9c9c39852689fe03161607a2..6546b03169eaa55497cb40f12dda9cd45b374388 100644 (file)
@@ -1,7 +1,7 @@
 /* Update a tar archive.
 
    Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
-   2004 Free Software Foundation, Inc.
+   2004, 2005 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
@@ -138,8 +138,8 @@ update_archive (void)
                chdir_do (name->change_dir);
                if (deref_stat (dereference_option,
                                current_stat_info.file_name, &s) == 0
-                   && (timespec_cmp (get_stat_mtime (&s),
-                                     current_stat_info.mtime)
+                   && (tar_timespec_cmp (get_stat_mtime (&s),
+                                         current_stat_info.mtime)
                        <= 0))
                  add_avoided_name (current_stat_info.file_name);
              }
index 676d7945b391263ce99abec9ffbfae0f214c4d33..561d103e32d72181a594b2cc15c1b57a34939be9 100644 (file)
@@ -31,7 +31,6 @@ AT_KEYWORDS([truncated files])
 AT_TAR_CHECK([
 genfile --file foo --length 50000k
 genfile --file baz
-touch -t 197001030000 baz # avoid subsecond resolution
 genfile --run 'tar -vcf bar foo baz' --checkpoint 10 --length 49995k --truncate foo
 echo separator
 sleep 1
index 56aecf7b665f4dd58fea0ac83a87113dcdd6ee65..067c6348e918da6d7109a1774b2f8ea87fe34e48 100644 (file)
@@ -31,7 +31,6 @@ AT_TAR_CHECK([
 mkdir directory
 genfile --length 10240 --pattern zeros --file directory/file1
 genfile --length 10240 --pattern default --file directory/file2
-touch -t 197001030000 directory directory/* # avoid subsecond resolution
 
 tar cf archive directory || exit 1
 echo separator
This page took 0.036981 seconds and 4 git commands to generate.