]> Dogcows Code - chaz/tar/commitdiff
Handle --keep-newer-files option
authorSergey Poznyakoff <gray@gnu.org.ua>
Sun, 29 Feb 2004 00:05:12 +0000 (00:05 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Sun, 29 Feb 2004 00:05:12 +0000 (00:05 +0000)
src/extract.c

index e62671e985fb32076623a5c7a06f6c273c4d9e0a..ec483050aae2cc495b6a10b615c33bcb091fa3d7 100644 (file)
@@ -419,6 +419,24 @@ make_directories (char *file_name)
   return did_something;                /* tell them to retry if we made one */
 }
 
+static bool
+file_newer_p (const char *file_name, struct tar_stat_info *tar_stat)
+{
+  struct stat st;
+           
+  if (stat (file_name, &st))
+    {
+      stat_warn (file_name);
+      return true; /* Be on the safe side */
+    }
+  if (!S_ISDIR (st.st_mode)
+      && st.st_mtime >= current_stat_info.stat.st_mtime)
+    {
+      return true;
+    }
+  return false;
+}  
+
 /* Prepare to extract a file.
    Return zero if extraction should not proceed.  */
 
@@ -428,12 +446,27 @@ prepare_to_extract (char const *file_name, bool directory)
   if (to_stdout_option)
     return 0;
 
-  if (old_files_option == UNLINK_FIRST_OLD_FILES
-      && !remove_any_file (file_name, recursive_unlink_option)
-      && errno && errno != ENOENT)
+  switch (old_files_option)
     {
-      unlink_error (file_name);
-      return 0;
+    case UNLINK_FIRST_OLD_FILES:
+      if (!remove_any_file (file_name, recursive_unlink_option)
+         && errno && errno != ENOENT)
+       {
+         unlink_error (file_name);
+         return 0;
+       }
+      break;
+
+    case KEEP_NEWER_FILES:
+      if (file_newer_p (file_name, &current_stat_info))
+       {
+         WARN ((0, 0, _("Current `%s' is newer"), file_name)); 
+         return 0;
+       }
+      break;
+
+    default:
+      break;
     }
 
   return 1;
@@ -446,6 +479,8 @@ prepare_to_extract (char const *file_name, bool directory)
 static int
 maybe_recoverable (char *file_name, int *interdir_made)
 {
+  int e = errno;
+  
   if (*interdir_made)
     return 0;
 
@@ -456,9 +491,17 @@ maybe_recoverable (char *file_name, int *interdir_made)
 
       switch (old_files_option)
        {
-       default:
+       case KEEP_OLD_FILES:
          return 0;
 
+       case KEEP_NEWER_FILES:
+         if (file_newer_p (file_name, &current_stat_info))
+           {
+             errno = e;
+             return 0;
+           }
+         /* FALL THROUGH */
+           
        case DEFAULT_OLD_FILES:
        case NO_OVERWRITE_DIR_OLD_FILES:
        case OVERWRITE_OLD_FILES:
This page took 0.027818 seconds and 4 git commands to generate.