delete-before-update patch

Don Mahurin dmahurin at berkeley.innomedia.com
Thu Nov 22 06:09:48 EST 2001


I have been using this simple patch enough that I know it works for my
purpose,
now I submit it here, for comments.

--delete-before-update
    implies -W, unlinks the destination file just before the new (temporary)
file is written.

This would be used when writing to a small or near full medium to use the
minmum space when writing.

In my case, I happen to be writing to compact flash, so  since -W turns the
block checksum off,  I need -c to force a checksum to ensure that byte wise
identical files are not rewritten.

Tim's comment below concerned me, but looking at the code, -W and -c can
sensibly be used together.
(correct me if I am wrong)
-W turns off the per block checksum.
-c turns on whole file checksum.

so, the flags that I am using "--delete-before-update -c" make sense.


tim.conway at philips.com wrote:

> -W and -c are actually kind of opposite effects... -W means never
> checksum... if it's different in length or time, send it.
> -c means ALWAYS checksum, even if time and length are identical.
-------------- next part --------------
diff -ru rsync-2.4.6/options.c rsync-2.4.6-delete-before-update/options.c
--- rsync-2.4.6/options.c	Tue Sep  5 19:46:43 2000
+++ rsync-2.4.6-delete-before-update/options.c	Wed Nov 14 08:13:03 2001
@@ -23,6 +23,7 @@
 
 int make_backups = 0;
 int whole_file = 0;
+int delete_before_update = 0;
 int copy_links = 0;
 int preserve_links = 0;
 int preserve_hard_links = 0;
@@ -181,7 +182,7 @@
 }
 
 enum {OPT_VERSION, OPT_SUFFIX, OPT_SENDER, OPT_SERVER, OPT_EXCLUDE,
-      OPT_EXCLUDE_FROM, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
+      OPT_EXCLUDE_FROM, OPT_DELETE_BEFORE_UPDATE, OPT_DELETE, OPT_DELETE_EXCLUDED, OPT_NUMERIC_IDS,
       OPT_RSYNC_PATH, OPT_FORCE, OPT_TIMEOUT, OPT_DAEMON, OPT_CONFIG, OPT_PORT,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS, OPT_PARTIAL, OPT_PROGRESS,
       OPT_COPY_UNSAFE_LINKS, OPT_SAFE_LINKS, OPT_COMPARE_DEST,
@@ -197,6 +198,7 @@
   {"server",      0,     0,    OPT_SERVER},
   {"sender",      0,     0,    OPT_SENDER},
   {"existing",    0,     0,    OPT_EXISTING},
+  {"delete-before-update",      0,     0,    OPT_DELETE_BEFORE_UPDATE},
   {"delete",      0,     0,    OPT_DELETE},
   {"delete-excluded", 0, 0,    OPT_DELETE_EXCLUDED},
   {"force",       0,     0,    OPT_FORCE},
@@ -436,6 +438,11 @@
 			whole_file=1;
 			break;
 
+		case OPT_DELETE_BEFORE_UPDATE:
+			delete_before_update=1;
+			whole_file=1;
+			break;
+
 		case 'H':
 #if SUPPORT_HARD_LINKS
 			preserve_hard_links=1;
@@ -706,6 +713,9 @@
 		args[ac++] = "--suffix";
 		args[ac++] = backup_suffix;
 	}
+
+	if (delete_before_update)
+		args[ac++] = "--delete-before-update";
 
 	if (delete_mode && !delete_excluded)
 		args[ac++] = "--delete";
diff -ru rsync-2.4.6/receiver.c rsync-2.4.6-delete-before-update/receiver.c
--- rsync-2.4.6/receiver.c	Thu Mar 30 06:23:03 2000
+++ rsync-2.4.6-delete-before-update/receiver.c	Wed Nov 14 08:11:21 2001
@@ -34,6 +34,7 @@
 extern char *tmpdir;
 extern char *compare_dest;
 extern int make_backups;
+extern int delete_before_update;
 extern char *backup_suffix;
 
 static struct delete_list {
@@ -394,6 +395,17 @@
 			   presmissions then act as though the remote end sent
 			   us the file permissions we already have */
 			file->mode = st.st_mode;
+		}
+
+		if(delete_before_update) {
+			if (fd1 != -1) {
+				close(fd1);
+				if(robust_unlink(fname) != 0) {
+					rprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
+					continue;
+				}
+				fd1 = -1;
+			}
 		}
 
 		if (fd1 != -1 && st.st_size > 0) {


More information about the rsync mailing list