]> Dogcows Code - chaz/tar/commitdiff
Update for new exclude module from gnulib. Add testcases by Phil Proudman.
authorSergey Poznyakoff <gray@gnu.org.ua>
Wed, 12 Aug 2009 16:25:29 +0000 (19:25 +0300)
committerSergey Poznyakoff <gray@gnu.org.ua>
Wed, 12 Aug 2009 16:25:29 +0000 (19:25 +0300)
* src/names.c (is_pattern): Remove.
(regex_usage_warning): Use fnmatch_pattern_has_wildcards instead of
is_pattern.
* src/tar.c: New option --exclude-backups.
(vcs_file_table, backup_file_table): New globals.
(add_exclude_array): New function.
* tests/exclude01.at, tests/exclude02.at,
tests/exclude03.at, tests/exclude04.at,
tests/exclude05.at: New testcases. Supplied by Phil Proudman.
* tests/Makefile.am (TESTSUITE_AT): Add new tests.
* tests/testsuite.at: Add new tests.
* THANKS: Update.

THANKS
src/names.c
src/tar.c
tests/Makefile.am
tests/exclude01.at [new file with mode: 0644]
tests/exclude02.at [new file with mode: 0644]
tests/exclude03.at [new file with mode: 0644]
tests/exclude04.at [new file with mode: 0644]
tests/exclude05.at [new file with mode: 0644]
tests/testsuite.at

diff --git a/THANKS b/THANKS
index 9d918ba8d178ed3e99219fed74ad07deba3a40c9..922682f9de363d9633af8d25d9ba1d34c233310b 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -389,6 +389,7 @@ Peter Fox           fox@gec-mi-at.co.uk
 Peter Kutschera                peter@zditr1.arcs.ac.at
 Peter Seebach          seebs@taniemarie.solon.com
 Phil Hands             phil@hands.com
+Phil Proudman          phil@proudman51.freeserve.co.uk
 Philippe Defert                defert@cern.ch
 Piercarlo Grandi       piercarl@sabi.demon.co.uk
 Pierce Cantrell                cantrell@ee.tamu.edu
index 16566bb57aeee8f4ce5700f14f6a653eb98f20bf..6e251e3c159bd7d92b66efa323be8203024c64de 100644 (file)
@@ -589,18 +589,12 @@ all_names_found (struct tar_stat_info *p)
   return true;
 }
 
-static inline int
-is_pattern (const char *string)
-{
-  return strchr (string, '*') || strchr (string, '[') || strchr (string, '?');
-}
-
 static void
 regex_usage_warning (const char *name)
 {
   static int warned_once = 0;
 
-  if (warn_regex_usage && is_pattern (name))
+  if (warn_regex_usage && fnmatch_pattern_has_wildcards (name, 0))
     {
       warned_once = 1;
       WARN ((0, 0,
index 943de847457a558e9d80e927f8a224f6dcea4ad1..3aa52871ba084848d9bb99d1d932e77c00ef652d 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -256,6 +256,7 @@ enum
   DELAY_DIRECTORY_RESTORE_OPTION,
   HARD_DEREFERENCE_OPTION,
   DELETE_OPTION,
+  EXCLUDE_BACKUPS_OPTION,
   EXCLUDE_CACHES_OPTION,
   EXCLUDE_CACHES_UNDER_OPTION,
   EXCLUDE_CACHES_ALL_OPTION,
@@ -659,6 +660,8 @@ static struct argp_option options[] = {
    N_("exclude directories containing FILE"), GRID+1 },
   {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0,
    N_("exclude version control system directories"), GRID+1 },
+  {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0,
+   N_("exclude backup and lock files"), GRID+1 },
   {"no-recursion", NO_RECURSION_OPTION, 0, 0,
    N_("avoid descending automatically in directories"), GRID+1 },
   {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
@@ -844,44 +847,52 @@ struct tar_args        /* Variables used during option parsing */
   | (args)->matching_flags \
   | recursion_option)
 
+static char const * const vcs_file_table[] = {
+  /* CVS: */
+  "CVS",
+  ".cvsignore",
+  /* RCS: */
+  "RCS",
+  /* SCCS: */
+  "SCCS",
+  /* SVN: */
+  ".svn",
+  /* git: */
+  ".git",
+  ".gitignore",
+  /* Arch: */
+  ".arch-ids",
+  "{arch}",
+  "=RELEASE-ID",
+  "=meta-update",
+  "=update",
+  /* Bazaar */
+  ".bzr",
+  ".bzrignore",
+  ".bzrtags",
+  /* Mercurial */
+  ".hg",
+  ".hgignore",
+  ".hgtags",
+  /* darcs */
+  "_darcs",
+  NULL
+};
+
+static char const * const backup_file_table[] = {
+  ".#*",
+  "*~",
+  "#*#",
+  NULL
+};
+
 void
-exclude_vcs_files ()
+add_exclude_array (char const * const * fv)
 {
   int i;
-  static char *vcs_file[] = {
-    /* CVS: */
-    "CVS",
-    ".cvsignore",
-    /* RCS: */
-    "RCS",
-    /* SCCS: */
-    "SCCS",
-    /* SVN: */
-    ".svn",
-    /* git: */
-    ".git",
-    ".gitignore",
-    /* Arch: */
-    ".arch-ids",
-    "{arch}",
-    "=RELEASE-ID",
-    "=meta-update",
-    "=update",
-    /* Bazaar */
-    ".bzr",
-    ".bzrignore",
-    ".bzrtags",
-    /* Mercurial */
-    ".hg",
-    ".hgignore",
-    ".hgtags",
-    /* darcs */
-    "_darcs",
-    NULL
-  };
 
-  for (i = 0; vcs_file[i]; i++)
-    add_exclude (excluded, vcs_file[i], 0);
+  for (i = 0; fv[i]; i++)
+    add_exclude (excluded, fv[i], 0);
 }
 
 \f
@@ -1652,6 +1663,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
       set_subcommand_option (DELETE_SUBCOMMAND);
       break;
 
+    case EXCLUDE_BACKUPS_OPTION:
+      add_exclude_array (backup_file_table);
+      break;
+      
     case EXCLUDE_OPTION:
       add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
       break;
@@ -1684,7 +1699,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
       break;
 
     case EXCLUDE_VCS_OPTION:
-      exclude_vcs_files ();
+      add_exclude_array (vcs_file_table);
       break;
       
     case FORCE_LOCAL_OPTION:
index 0e22bdf178c3d542f7a0848494d2536ba7142fb0..51ad526b5b66353a2f1c334aca49548130fa0f7f 100644 (file)
@@ -61,6 +61,11 @@ TESTSUITE_AT = \
  delete04.at\
  delete05.at\
  exclude.at\
+ exclude01.at\
+ exclude02.at\
+ exclude03.at\
+ exclude04.at\
+ exclude05.at\
  extrac01.at\
  extrac02.at\
  extrac03.at\
diff --git a/tests/exclude01.at b/tests/exclude01.at
new file mode 100644 (file)
index 0000000..778a7fc
--- /dev/null
@@ -0,0 +1,69 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# 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, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([exclude wildcards])
+AT_KEYWORDS([exclude exclude01])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+rm -rf testdir
+mkdir -p testdir/dir1 testdir/dir2 testdir/dir3
+touch testdir/dir1/file1
+touch testdir/dir1/\*
+touch testdir/dir2/file2
+touch testdir/dir2/\*
+touch testdir/dir3/file3
+touch testdir/dir3/\*
+
+tar cf archive --exclude=testdir/dir1/\* \
+               --no-wildcards \
+               --exclude=testdir/dir2/\* \
+               --wildcards \
+               --exclude=testdir/dir3/\* \
+               testdir
+tar tf archive | sort
+
+echo "NEXT"
+tar cf archive testdir
+tar t "testdir/dir1/*" -f archive | sort
+
+echo "NEXT"
+tar cf archive testdir/dir1
+tar t --no-wildcards "testdir/dir1/*" -f archive | sort
+
+echo "NEXT"
+tar cf archive testdir
+tar t --wildcards "testdir/dir1/*" -f archive | sort
+
+rm -rf testdir
+],
+[0],
+[testdir/
+testdir/dir1/
+testdir/dir2/
+testdir/dir2/file2
+testdir/dir3/
+NEXT
+testdir/dir1/*
+NEXT
+testdir/dir1/*
+NEXT
+testdir/dir1/*
+testdir/dir1/file1
+])
+
+AT_CLEANUP
diff --git a/tests/exclude02.at b/tests/exclude02.at
new file mode 100644 (file)
index 0000000..7996d16
--- /dev/null
@@ -0,0 +1,77 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# 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, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([exclude: anchoring])
+AT_KEYWORDS([exclude exclude02])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+rm -rf testdir
+mkdir -p testdir
+touch file1.txt
+touch testdir/file1.txt
+touch testdir/file2
+
+tar cf archive --exclude="file1.txt" \
+               testdir
+tar tf archive | sort
+
+echo "SUB 1"
+tar cf archive --no-anchored \
+               --exclude="file1.txt" \
+               testdir
+tar tf archive | sort
+
+echo "SUB 2"
+tar cf archive --anchored \
+               --exclude="file1.txt" \
+               testdir
+tar tf archive | sort
+
+echo "SUB 3"
+tar cf archive testdir file1.txt
+tar t "file1.txt" -f archive | sort
+
+echo "SUB 4"
+tar t --no-anchored "file1.txt" -f archive | sort
+
+echo "SUB 5"
+tar t --anchored "file1.txt" -f archive | sort
+
+rm -rf testdir file1.txt
+
+],
+[0],
+[testdir/
+testdir/file2
+SUB 1
+testdir/
+testdir/file2
+SUB 2
+testdir/
+testdir/file1.txt
+testdir/file2
+SUB 3
+file1.txt
+SUB 4
+file1.txt
+testdir/file1.txt
+SUB 5
+file1.txt
+])
+
+AT_CLEANUP
diff --git a/tests/exclude03.at b/tests/exclude03.at
new file mode 100644 (file)
index 0000000..d592109
--- /dev/null
@@ -0,0 +1,73 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# 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, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([exclude: wildcards match slash])
+AT_KEYWORDS([exclude exclude03])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+rm -rf testdir
+mkdir -p testdir/dir1 testdir/dir2 testdir/dir3
+touch testdir/\*f\*1
+touch testdir/dir1/file1
+touch testdir/dir1/\*
+touch testdir/dir2/file2
+touch testdir/dir2/\*
+touch testdir/dir3/file3
+touch testdir/dir3/\*
+
+tar cf archive --exclude='testdir*f*1' \
+               --no-wildcards-match-slash \
+               --exclude='testdir*f*2' \
+               --wildcards-match-slash \
+               --exclude='testdir*f*3' \
+               testdir
+tar tf archive | sort
+
+echo "NEXT"
+tar cf archive testdir
+tar t --wildcards 'testdir/*f*1' -f archive | sort
+
+echo "NEXT"
+tar t --wildcards --no-wildcards-match-slash 'testdir/*f*1' -f archive | sort
+
+echo "NEXT"
+tar t --wildcards --wildcards-match-slash 'testdir/*f*1' -f archive | sort
+
+rm -rf testdir
+
+],
+[0],
+[testdir/
+testdir/dir1/
+testdir/dir1/*
+testdir/dir2/
+testdir/dir2/*
+testdir/dir2/file2
+testdir/dir3/
+testdir/dir3/*
+NEXT
+testdir/*f*1
+testdir/dir1/file1
+NEXT
+testdir/*f*1
+NEXT
+testdir/*f*1
+testdir/dir1/file1
+])
+
+AT_CLEANUP
diff --git a/tests/exclude04.at b/tests/exclude04.at
new file mode 100644 (file)
index 0000000..c6f03cb
--- /dev/null
@@ -0,0 +1,73 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# 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, see <http://www.gnu.org/licenses/>.
+
+AT_SETUP([exclude: case insensitive])
+AT_KEYWORDS([exclude exclude04])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+rm -rf testdir
+mkdir -p testdir/dir
+touch testdir/file1
+touch testdir/file2
+touch testdir/file3
+touch testdir/file4
+touch testdir/dir/File1
+touch testdir/dir/File2
+touch testdir/dir/File3
+touch testdir/dir/File4
+
+tar cf archive --exclude=FILE2 \
+               --exclude=file1 \
+               --ignore-case \
+               --exclude=file3 \
+               --no-ignore-case \
+               --exclude=FILE2 \
+               --exclude=file4 \
+               testdir
+tar tf archive | sort
+
+echo "SUB 1"
+tar cf archive testdir
+tar t --wildcards --wildcards-match-slash '*File2' -f archive | sort
+
+echo "SUB 2"
+tar t --wildcards --wildcards-match-slash --ignore-case '*File2' -f archive | sort
+
+echo "SUB 3"
+tar t --wildcards --wildcards-match-slash --no-ignore-case '*File2' -f archive | sort
+
+rm -rf testdir
+
+],
+[0],
+[testdir/
+testdir/dir/
+testdir/dir/File1
+testdir/dir/File2
+testdir/dir/File4
+testdir/file2
+SUB 1
+testdir/dir/File2
+SUB 2
+testdir/dir/File2
+testdir/file2
+SUB 3
+testdir/dir/File2
+])
+
+AT_CLEANUP
diff --git a/tests/exclude05.at b/tests/exclude05.at
new file mode 100644 (file)
index 0000000..d7ad8f3
--- /dev/null
@@ -0,0 +1,55 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+# 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, see <http://www.gnu.org/licenses/>.
+
+# Test the functioning of many items in an exclude list (should run quickly)
+
+AT_SETUP([exclude: lots of excludes])
+AT_KEYWORDS([exclude exclude05])
+
+AT_TAR_CHECK([
+AT_SORT_PREREQ
+
+rm -rf testdir exclfile
+mkdir -p testdir
+`awk 'BEGIN {for (i=9; i < 100; ++i ) { print > "testdir/file" i; }}'`
+
+`awk 'BEGIN {for (i=1000000; i >= 12; --i ) { print "testdir/file" i > "exclfile"; }}'`
+
+tar cf archive --anchored --exclude-from=exclfile \
+               testdir
+tar tf archive | sort
+
+echo "NEXT"
+tar cf archive --exclude-from=exclfile \
+               testdir
+tar tf archive | sort
+
+rm -rf testdir exclfile
+
+],
+[0],
+[testdir/
+testdir/file10
+testdir/file11
+testdir/file9
+NEXT
+testdir/
+testdir/file10
+testdir/file11
+testdir/file9
+])
+
+AT_CLEANUP
index b22850e7d308fb4d43a695c7f8648d91f4a04fca..325f9d071e506a6f789666fd7e1e3a60cbabf98b 100644 (file)
@@ -125,6 +125,11 @@ m4_include([append02.at])
 m4_include([xform-h.at])
 
 m4_include([exclude.at])
+m4_include([exclude01.at])
+m4_include([exclude02.at])
+m4_include([exclude03.at])
+m4_include([exclude04.at])
+m4_include([exclude05.at])
 
 m4_include([delete01.at])
 m4_include([delete02.at])
This page took 0.039969 seconds and 4 git commands to generate.