Fix hard links recognition with -c --remove-files
* src/create.c (dump_hard_link): Always look up in the link table if remove_files_option is set. Patch suggested by Theodore Ts'o <tytso@mit.edu>. (check_links): Remove extra newline from the warning message. * tests/link02.at, tests/link03.at: New testcases. * tests/Makefile.am (TESTSUITE_AT): Add link02.at and link03.at * tests/testsuite.at: Include link02.at and link03.at
This commit is contained in:
@@ -1377,7 +1377,7 @@ static Hash_table *link_table;
|
||||
static bool
|
||||
dump_hard_link (struct tar_stat_info *st)
|
||||
{
|
||||
if (link_table && st->stat.st_nlink > 1)
|
||||
if (link_table && (st->stat.st_nlink > 1 || remove_files_option))
|
||||
{
|
||||
struct link lp;
|
||||
struct link *duplicate;
|
||||
@@ -1468,7 +1468,7 @@ check_links (void)
|
||||
{
|
||||
if (lp->nlink)
|
||||
{
|
||||
WARN ((0, 0, _("Missing links to %s.\n"), quote (lp->name)));
|
||||
WARN ((0, 0, _("Missing links to %s."), quote (lp->name)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,8 @@ TESTSUITE_AT = \
|
||||
indexfile.at\
|
||||
ignfail.at\
|
||||
link01.at\
|
||||
link02.at\
|
||||
link03.at\
|
||||
listed01.at\
|
||||
listed02.at\
|
||||
long01.at\
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
||||
|
||||
# Test suite for GNU tar.
|
||||
# Copyright (C) 2004, 2007 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2004, 2007, 2009 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
|
||||
@@ -31,7 +31,7 @@
|
||||
# http://lists.gnu.org/archive/html/bug-tar/2004-07/msg00009.html
|
||||
|
||||
AT_SETUP([link count gt 2])
|
||||
AT_KEYWORDS([link01])
|
||||
AT_KEYWORDS([hardlinks link01])
|
||||
|
||||
AT_TAR_CHECK([
|
||||
mkdir directory
|
||||
|
||||
52
tests/link02.at
Normal file
52
tests/link02.at
Normal file
@@ -0,0 +1,52 @@
|
||||
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
||||
|
||||
# Test suite for GNU tar.
|
||||
# Copyright (C) 2009 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 Free Software Foundation; either version 3, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
|
||||
# Tar 1.22 failed to recognize last hard link when creating an archive with
|
||||
# the --remove-files option.
|
||||
#
|
||||
# Reported by: "Theodore Y. Ts'o" <tytso@mit.edu>,
|
||||
# Carl Worth <cworth@cworth.org>
|
||||
# References:
|
||||
# <E194EAe-0001lE-00@think.thunk.org>
|
||||
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=188663
|
||||
# <1248955024.1545.1.camel@yoom.home.cworth.org>
|
||||
# http://lists.gnu.org/archive/html/bug-tar/2009-07/msg00015.html
|
||||
|
||||
AT_SETUP([preserve hard links with --remove-files])
|
||||
AT_KEYWORDS([hardlinks link02])
|
||||
|
||||
AT_TAR_CHECK([
|
||||
genfile -l 64 -f file1
|
||||
link file1 file2
|
||||
link file2 file3
|
||||
link file3 file4
|
||||
tar -c -f archive --remove-files file1 file2 file3 file4
|
||||
tar tfv archive | sed -n 's/.*file[[2-4]] link to //p'
|
||||
],
|
||||
[0],
|
||||
[file1
|
||||
file1
|
||||
file1
|
||||
])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
# End of link02.at
|
||||
|
||||
56
tests/link03.at
Normal file
56
tests/link03.at
Normal file
@@ -0,0 +1,56 @@
|
||||
# Process this file with autom4te to create testsuite. -*- Autotest -*-
|
||||
|
||||
# Test suite for GNU tar.
|
||||
# Copyright (C) 2009 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 Free Software Foundation; either version 3, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
|
||||
# Make sure -l option works correctly in conjunction with --remove-files
|
||||
# See also link02.at
|
||||
|
||||
AT_SETUP([working -l with --remove-files])
|
||||
AT_KEYWORDS([hardlinks link03])
|
||||
|
||||
m4_define([create_files],[
|
||||
genfile -l 64 -f file1
|
||||
link file1 file2
|
||||
link file2 file3
|
||||
link file3 file4
|
||||
])
|
||||
|
||||
AT_TAR_CHECK([
|
||||
create_files
|
||||
echo archive.1
|
||||
tar -c -f archive.1 -l --remove-files file1 file2 file3 file4
|
||||
create_files
|
||||
echo archive.2
|
||||
tar -c -f archive.2 -l --remove-files file1 file2 file3
|
||||
echo testing archive.2
|
||||
tar tfv archive.2 | sed -n 's/.*file[[2-3]] link to //p'
|
||||
],
|
||||
[0],
|
||||
[archive.1
|
||||
archive.2
|
||||
testing archive.2
|
||||
file1
|
||||
file1
|
||||
],
|
||||
[tar: Missing links to `file1'.
|
||||
])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
@@ -159,6 +159,8 @@ m4_include([chtype.at])
|
||||
m4_include([ignfail.at])
|
||||
|
||||
m4_include([link01.at])
|
||||
m4_include([link02.at])
|
||||
m4_include([link03.at])
|
||||
|
||||
m4_include([longv7.at])
|
||||
m4_include([long01.at])
|
||||
|
||||
Reference in New Issue
Block a user