From: Sergey Poznyakoff Date: Sat, 21 Feb 2004 09:33:58 +0000 (+0000) Subject: (dump_file0): The conditional at line X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=commitdiff_plain;h=b960c38c4bc51f7509e6d9e38a53d976bb10b88f (dump_file0): The conditional at line 1296 prevented incremental backups on individual files from working, as reported by Andreas Schuldei . This is due to the condition (0 < top_level || !incremental_option) Removing it makes incremental backups work for individual files as well as for directories. On the other hand, it does not affect other functionality, as shown by the reasoning below: To begin with, the two parts of this condition are mutually superfluous, because 1) when top_level < 0, incremental_option == 1 so the condition yields false 2) when top_level >= 0, incremental_option == 0 so the condition yields true. In other words, it is completely equivalent to (!incremental_option) Now, let's consider the effect of its removal. There are two cases: 1) when incremental_option==1 This means incremental backup in progress. In this case dump_file is invoked only for directories or for files marked with 'Y' by get_directory_contents. The latter are those that did not meet the condition in incremen.c:242, which is exactly the same condition as this at create.c:1296. So, for these files the check (!incremental_option) is useless, since the rest of the conditional will yield false anyway. On the other hand, if dump_file is invoked on a directory, the conditional will yield false due to !S_ISDIR assertion, so these will be processed as usual. Thus, for this case the extra condition (!incremental_option) is irrelevant, and its removal won't alter the behavior of tar, *except* that it will enable incremental backups on individual files, which is the wanted effect. 2) when incremental_option==0 In this case the condition yields true and its removal does not affect the functionality. --- diff --git a/src/create.c b/src/create.c index cc75bb8..59231ac 100644 --- a/src/create.c +++ b/src/create.c @@ -972,8 +972,8 @@ dump_dir0 (char *directory, return; if (one_file_system_option - && !top_level - && parent_device != stat->stat.st_dev) + && !top_level + && parent_device != stat->stat.st_dev) { if (verbose_option) WARN ((0, 0, @@ -1293,12 +1293,11 @@ dump_file0 (struct tar_stat_info *stat, char *p, /* See if we want only new files, and check if this one is too old to put in the archive. */ - if ((0 < top_level || !incremental_option) - && !S_ISDIR (stat->stat.st_mode) + if (!S_ISDIR (stat->stat.st_mode) && stat->stat.st_mtime < newer_mtime_option && (!after_date_option || stat->stat.st_ctime < newer_ctime_option)) { - if (0 < top_level) + if (0 < top_level) /* equivalent to !incremental_option */ WARN ((0, 0, _("%s: file is unchanged; not dumped"), quotearg_colon (p))); /* FIXME: recheck this return. */