* src/common.h (transform_symlinks_option): New global.

* src/create.c (dump_file0): Transform symlink targets only if
explicitly required.  Thanks Cyril Strejc for reporting the
problem.
* src/tar.c (parse_opt): New options --transform-symlinks and
--no-transform-symlinks. New alias --xform to the --transform
option.
* doc/tar.texi: Document --transform-symlinks
* NEWS: Update.
* THANKS: Update.

* src/names.c (name_gather): Use xzalloc.
* src/buffer.c (short_read): Move record size detection before
the loop.
This commit is contained in:
Sergey Poznyakoff
2008-10-16 11:07:19 +00:00
parent 7b69ee5a24
commit 57bfbbde90
10 changed files with 134 additions and 25 deletions
+60 -4
View File
@@ -2905,6 +2905,13 @@ characters set by the previous @option{--quote-chars} option
With this option, @command{tar} will not recurse into directories.
@xref{recurse}.
@opsummary{no-transform-symlinks}
@item --no-transform-symlinks
Cancel the effect of any prior @command{--transform-symlinks} option
(see below) and return to the default behavior of applying name
transformation expression only to the names of files (archive
members), not to target of symbolic links.
@opsummary{no-same-owner}
@item --no-same-owner
@itemx -o
@@ -3266,8 +3273,9 @@ rather than the data modification time stored in the archive.
@xref{Data Modification Times}.
@opsummary{transform}
@opsummary{xform}
@item --transform=@var{sed-expr}
@itemx --xform=@var{sed-expr}
Transform file or member names using @command{sed} replacement expression
@var{sed-expr}. For example,
@@ -3284,6 +3292,11 @@ To see transformed member names in verbose listings, use
@option{--show-transformed-names} option
(@pxref{show-transformed-names}).
@opsummary{transform-symlinks}
@item --transform-symlinks
Apply @command{--transform} option to symbolic link targets
(@pxref{transform}).
@opsummary{uncompress}
@item --uncompress
@@ -7553,7 +7566,7 @@ characters that are quoted by default in the selected quoting style.
@command{Tar} archives contain detailed information about files stored
in them and full file names are part of that information. When
storing file to an archive, its file name is recorded in the archive
storing file to an archive, its file name is recorded in it,
along with the actual file contents. When restoring from an archive,
a file is created on disk with exactly the same name as that stored
in the archive. In the majority of cases this is the desired behavior
@@ -7570,7 +7583,7 @@ directory components, or with otherwise modified names. In other
cases it is desirable to store files under differing names in the
archive.
@GNUTAR{} provides two options for these needs.
@GNUTAR{} provides several options for these needs.
@table @option
@opindex strip-components
@@ -7644,7 +7657,9 @@ In case you need to apply more complex modifications to the file name,
@table @option
@opindex transform
@opindex xform
@item --transform=@var{expression}
@itemx --xform=@var{expression}
Modify file names using supplied @var{expression}.
@end table
@@ -7683,7 +7698,7 @@ sed, GNU sed}).
@item @var{number}
Only replace the @var{number}th match of the @var{regexp}.
Note: the @var{posix} standard does not specify what should happen
Note: the @acronym{POSIX} standard does not specify what should happen
when you mix the @samp{g} and @var{number} modifiers. @GNUTAR{}
follows the GNU @command{sed} implementation in this regard, so
the interaction is defined to be: ignore matches before the
@@ -7737,6 +7752,47 @@ $ @kbd{tar --transform 's/.*/\L&/' -x -f arch.tar}
@end enumerate
The @option{--transform} option applies only to member names. It does
not apply to symbolic link targets. In many cases, this is the
desired behavior. Consider for example, archiving the @file{/lib}
directory:
@smallexample
$ @kbd{tar -vv -c -f archive /lib}
tar: Removing leading `/' from member names
drwxr-xr-x root/root 0 2008-07-08 16:20 /lib/
-rwxr-xr-x root/root 1250840 2008-05-25 07:44 /lib/libc-2.3.2.so
lrwxrwxrwx root/root 0 2008-06-24 17:12 /lib/libc.so.6 -> libc-2.3.2.so
...
@end smallexample
Now, you can use our example above to extract it into @file{/usr/local}:
@smallexample
$ @kbd{tar --transform 's,^,/usr/local/,' \
--show-transformed -v -x -f archive}
drwxr-xr-x root/root 0 2008-07-08 16:20 /usr/local/lib/
-rwxr-xr-x root/root 1250840 2008-05-25 07:44 /usr/local/lib/libc-2.3.2.so
lrwxrwxrwx root/root 0 2008-06-24 17:12 /usr/local/lib/libc.so.6 ->
libc-2.3.2.so
@end smallexample
As you see, it correctly extracts @file{libc.so.6} as a symbolic link
to @file{libc-2.3.2.so}.
However, sometimes you may need to transform symbolic link targets as
well. To do so, @GNUTAR provides an additional option:
@table @option
@opindex transform-symlinks
@item --transform-symlinks
Apply @command{--transform} option to symbolic link targets.
@opindex no-transform-symlinks
@itemx --no-transform-symlinks
Cancel the effect of the previous @option{--transform-symlinks} option.
@end table
Unlike @option{--strip-components}, @option{--transform} can be used
in any @GNUTAR{} operation mode. For example, the following command
adds files to the archive while replacing the leading @file{usr/}