Browse Source

Honor the pax-option overrides when creating archive.

Changes proposed by Denis Excoffier.

* NEWS: Fix typos.
* doc/tar.texi: Fix typos.  Improve recipe for creation of binary
equivalent archives.
* src/create.c (write_extended): Use the value of the
--mtime option (if specified) as the default for exthdr.mtime.
* src/xheader.c (xheader_store): Create the header if at least
one override is supplied in --pax-option.
Sergey Poznyakoff 10 years ago
parent
commit
e7b6f8e3ae
4 changed files with 25 additions and 8 deletions
  1. 3 3
      NEWS
  2. 18 1
      doc/tar.texi
  3. 1 1
      src/create.c
  4. 3 3
      src/xheader.c

+ 3 - 3
NEWS

@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2014-07-27
+GNU tar NEWS - User visible changes. 2014-11-07
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 Please send GNU tar bug reports to <bug-tar@gnu.org>
 
 
 
 
@@ -369,7 +369,7 @@ Modification times in ustar header blocks of extended headers
 are set to mtimes of the corresponding archive members.  This
 are set to mtimes of the corresponding archive members.  This
 can be overridden by the
 can be overridden by the
 
 
-  --pax-opion='exthdr.mtime=STRING'
+  --pax-option='exthdr.mtime=STRING'
 
 
 command line option.  The STRING is either number of seconds since
 command line option.  The STRING is either number of seconds since
 the Epoch or a "Time reference" (see below).
 the Epoch or a "Time reference" (see below).
@@ -379,7 +379,7 @@ headers are set to the time when tar was invoked.
 
 
 This can be overridden by the
 This can be overridden by the
 
 
-  --pax-opion='globexthdr.mtime=STRING'
+  --pax-option='globexthdr.mtime=STRING'
 
 
 command line option.  The STRING is either number of seconds since
 command line option.  The STRING is either number of seconds since
 the Epoch or a "Time reference" (see below).
 the Epoch or a "Time reference" (see below).

+ 18 - 1
doc/tar.texi

@@ -9930,7 +9930,8 @@ will use the following default value:
 This keyword defines the value of the @samp{mtime} field that
 This keyword defines the value of the @samp{mtime} field that
 is written into the ustar header blocks for the extended headers.
 is written into the ustar header blocks for the extended headers.
 By default, the @samp{mtime} field is set to the modification time
 By default, the @samp{mtime} field is set to the modification time
-of the archive member described by that extended headers.
+of the archive member described by that extended header (or to the
+value of the @option{--mtime} option, if supplied).
 
 
 @item globexthdr.name=@var{string}
 @item globexthdr.name=@var{string}
 This keyword allows user control over the name that is written into
 This keyword allows user control over the name that is written into
@@ -10023,6 +10024,22 @@ same contents:
 --pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0
 --pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0
 @end smallexample
 @end smallexample
 
 
+@noindent
+If you extract files from such an archive and recreate the archive
+from them, you will also need to eliminate changes due to ctime, as
+shown in examples below:
+
+@smallexample
+--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,ctime:=0
+@end smallexample
+
+@noindent
+or
+
+@smallexample
+--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,delete=ctime
+@end smallexample
+
 @node Checksumming
 @node Checksumming
 @subsection Checksumming Problems
 @subsection Checksumming Problems
 
 

+ 1 - 1
src/create.c

@@ -706,7 +706,7 @@ write_extended (bool global, struct tar_stat_info *st, union block *old_header)
     {
     {
       type = XHDTYPE;
       type = XHDTYPE;
       p = xheader_xhdr_name (st);
       p = xheader_xhdr_name (st);
-      t = st->stat.st_mtime;
+      t = set_mtime_option ? mtime_option.tv_sec : st->stat.st_mtime;
     }
     }
   xheader_write (type, p, t, &st->xhdr);
   xheader_write (type, p, t, &st->xhdr);
   free (p);
   free (p);

+ 3 - 3
src/xheader.c

@@ -813,11 +813,11 @@ xheader_store (char const *keyword, struct tar_stat_info *st,
   t = locate_handler (keyword);
   t = locate_handler (keyword);
   if (!t || !t->coder)
   if (!t || !t->coder)
     return;
     return;
-  if (xheader_keyword_deleted_p (keyword)
+  if (xheader_keyword_deleted_p (keyword))
-      || xheader_keyword_override_p (keyword))
     return;
     return;
   xheader_init (&st->xhdr);
   xheader_init (&st->xhdr);
-  t->coder (st, keyword, &st->xhdr, data);
+  if (!xheader_keyword_override_p (keyword))
+    t->coder (st, keyword, &st->xhdr, data);
 }
 }
 
 
 void
 void