]> Dogcows Code - chaz/tar/commitdiff
(struct directory): New member tagfile
authorSergey Poznyakoff <gray@gnu.org.ua>
Wed, 26 Sep 2007 22:08:13 +0000 (22:08 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Wed, 26 Sep 2007 22:08:13 +0000 (22:08 +0000)
(make_directory): Initialize tagfile to NULL
(procdir): New argument: entry
Hanlde exclusion tags.
(makedumpdir): Take into account directory->tagfile.
(scan_directory): Hanlde exclusion tags.

src/incremen.c

index 372e11b8045995a3c0e8c0532833cdc53b2d82eb..acccb8f605753ff9170a9b94479540521bd3d845 100644 (file)
@@ -62,6 +62,8 @@ struct directory
     unsigned flags;             /* See DIRF_ macros above */
     struct directory *orig;     /* If the directory was renamed, points to
                                   the original directory structure */
+    const char *tagfile;        /* Tag file, if the directory falls under
+                                  exclusion_tag_under */
     char name[1];              /* file name of directory */
   };
 
@@ -124,6 +126,7 @@ make_directory (const char *name)
   strcpy (directory->name, name);
   if (ISSLASH (directory->name[namelen-1]))
     directory->name[namelen-1] = 0;
+  directory->tagfile = NULL;
   return directory;
 }
 
@@ -229,7 +232,8 @@ static struct directory *
 procdir (char *name_buffer, struct stat *stat_data,
         dev_t device,
         enum children children,
-        bool verbose)
+        bool verbose,
+        char *entry)
 {
   struct directory *directory;
   bool nfs = NFS_FILE_STAT (*stat_data);
@@ -330,6 +334,40 @@ procdir (char *name_buffer, struct stat *stat_data,
 
   DIR_SET_FLAG (directory, DIRF_INIT);
 
+  {
+    const char *tag_file_name;
+    size_t len;
+    
+    switch (check_exclusion_tags (name_buffer, &tag_file_name))
+      {
+      case exclusion_tag_all:
+       /* This warning can be duplicated by code in dump_file0, but only
+          in case when the topmost directory being archived contains
+          an exclusion tag. */
+       exclusion_tag_warning (name_buffer, tag_file_name,
+                              _("directory not dumped"));
+       if (entry)
+         *entry = 'N';
+       directory->children = NO_CHILDREN;
+       break;
+
+      case exclusion_tag_contents:
+       exclusion_tag_warning (name_buffer, tag_file_name,
+                              _("contents not dumped"));
+       directory->children = NO_CHILDREN;
+       break;
+       
+      case exclusion_tag_under:
+       exclusion_tag_warning (name_buffer, tag_file_name,
+                              _("contents not dumped"));
+       directory->tagfile = tag_file_name;
+       break;
+       
+      case exclusion_tag_none:
+       break;
+      }
+  }
+
   return directory;
 }
 
@@ -436,9 +474,17 @@ makedumpdir (struct directory *directory, const char *dir)
       const char *loc = dumpdir_locate (dump, array[i]);
       if (loc)
        {
-         *new_dump_ptr++ = ' ';
+         if (directory->tagfile)
+           *new_dump_ptr = strcmp (directory->tagfile, array[i]) == 0 ?
+                              ' ' : 'I';
+         else
+           *new_dump_ptr = ' ';
+         new_dump_ptr++;
          dump = loc + strlen (loc) + 1;
        }
+      else if (directory->tagfile)
+       *new_dump_ptr++ = strcmp (directory->tagfile, array[i]) == 0 ?
+                              ' ' : 'I';
       else
        *new_dump_ptr++ = 'Y'; /* New entry */
 
@@ -462,7 +508,7 @@ scan_directory (char *dir, dev_t device)
   size_t name_length;          /* used length in name_buffer */
   struct stat stat_data;
   struct directory *directory;
-
+  
   if (! dirp)
     savedir_error (dir);
 
@@ -484,8 +530,9 @@ scan_directory (char *dir, dev_t device)
       return NULL;
     }
 
-  directory = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false);
-
+  directory = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false,
+                      NULL);
+  
   if (dirp && directory->children != NO_CHILDREN)
     {
       char  *entry;    /* directory entry being scanned */
@@ -506,7 +553,9 @@ scan_directory (char *dir, dev_t device)
            }
          strcpy (name_buffer + name_length, entry + 1);
 
-         if (excluded_name (name_buffer))
+         if (*entry == 'I') /* Ignored entry */
+           *entry = 'N';
+         else if (excluded_name (name_buffer))
            *entry = 'N';
          else
            {
@@ -519,10 +568,10 @@ scan_directory (char *dir, dev_t device)
 
              if (S_ISDIR (stat_data.st_mode))
                {
+                 *entry = 'D';
                  procdir (name_buffer, &stat_data, device,
                           directory->children,
-                          verbose_option);
-                 *entry = 'D';
+                          verbose_option, entry);
                }
 
              else if (one_file_system_option && device != stat_data.st_dev)
This page took 0.025969 seconds and 4 git commands to generate.