metadata in dryrun mode

Mark Santcroos marks at ripe.net
Fri Apr 5 03:09:03 EST 2002


On Tue, Apr 02, 2002 at 07:28:07PM +0200, Mark Santcroos wrote:
> Please let me know and I will create the appropriate patch.

Here is the patch I have created vs. cvs.

I have tried to change as little structural things as possible to get the
result.

This basicly does what we want, please check and comment. There is 1 'bug'
and that is that in dryrun mode directories get reported twice. I couldn't
find an clean/short way to work around that.
Anyway, this is only proof of concept, more things can be added later :)

While digging through the code it was sometimes unclear to me what the
particular piece of code does. I found the number of comments very low.
How about that we put some more description in the code to make it easier
for everyone?
I'm willing to come up with a patch that only has comments in it.

Mark

-- 
Mark Santcroos				RIPE Network Coordination Centre
http://www.ripe.net/home/mark/		New Projects Group/TTM
-------------- next part --------------
Index: generator.c
===================================================================
RCS file: /cvsroot/rsync/generator.c,v
retrieving revision 1.38
diff -u -r1.38 generator.c
--- generator.c	25 Mar 2002 05:54:31 -0000	1.38
+++ generator.c	5 Apr 2002 10:32:57 -0000
@@ -239,6 +239,7 @@
 	extern int list_only;
 	extern int preserve_perms;
 	extern int only_existing;
+	int report = 0;
 
 	if (list_only) return;
 
@@ -268,8 +269,7 @@
                  * file of that name and it is *not* a directory, then
                  * we need to delete it.  If it doesn't exist, then
                  * recursively create it. */
-          
-		if (dry_run) return; /* XXXX -- might cause inaccuracies?? -- mbp */
+
 		if (statret == 0 && !S_ISDIR(st.st_mode)) {
 			if (robust_unlink(fname) != 0) {
 				rprintf(FERROR, RSYNC_NAME
@@ -286,11 +286,13 @@
 				rprintf(FERROR, RSYNC_NAME ": recv_generator: mkdir \"%s\": %s (2)\n",
 					fname,strerror(errno));
 			}
-		}
-		/* f_out is set to -1 when doing final directory 
-		   permission and modification time repair */
-		if (set_perms(fname,file,NULL,0) && verbose && (f_out != -1)) 
-			rprintf(FINFO,"%s/\n",fname);
+		} else if (statret != 0) {
+			log_transfer(file,fname,NULL);
+			report = 0;
+		} else
+			report = 1;
+
+		set_perms(fname,file,NULL,report);
 		return;
 	}
 
@@ -389,7 +391,8 @@
 	if (statret == -1) {
 		if (errno == ENOENT) {
 			write_int(f_out,i);
-			if (!dry_run) send_sums(NULL,f_out);
+			if (!dry_run) 
+				send_sums(NULL,f_out);
 		} else {
 			if (verbose > 1)
 				rprintf(FERROR, RSYNC_NAME
@@ -406,7 +409,8 @@
 
 		/* now pretend the file didn't exist */
 		write_int(f_out,i);
-		if (!dry_run) send_sums(NULL,f_out);    
+		if (!dry_run) 
+			send_sums(NULL,f_out);    
 		return;
 	}
 
Index: log.c
===================================================================
RCS file: /cvsroot/rsync/log.c,v
retrieving revision 1.59
diff -u -r1.59 log.c
--- log.c	18 Feb 2002 19:51:12 -0000	1.59
+++ log.c	5 Apr 2002 10:32:57 -0000
@@ -571,11 +571,14 @@
  * this will be called at the end where the client was run.
  * Called when a file starts to be transferred.
  */
-void log_transfer(struct file_struct *file, const char *fname)
+void log_transfer(struct file_struct *file, const char *fname, const char *message)
 {
 	extern int verbose;
 
 	if (!verbose) return;
 
-	rprintf(FINFO, "%s\n", fname);
+	if(message)
+		rprintf(FINFO, "%s%s: %s\n", fname,S_ISDIR(file->mode)?"/":"",message);
+	else
+		rprintf(FINFO, "%s%s\n", fname,S_ISDIR(file->mode)?"/":"");
 }
Index: proto.h
===================================================================
RCS file: /cvsroot/rsync/proto.h,v
retrieving revision 1.144
diff -u -r1.144 proto.h
--- proto.h	3 Apr 2002 02:33:42 -0000	1.144
+++ proto.h	5 Apr 2002 10:32:58 -0000
@@ -159,7 +159,7 @@
 void log_send(struct file_struct *file, struct stats *initial_stats);
 void log_recv(struct file_struct *file, struct stats *initial_stats);
 void log_exit(int code, const char *file, int line);
-void log_transfer(struct file_struct *file, const char *fname);
+void log_transfer(struct file_struct *file, const char *fname, const char *message);
 void wait_process(pid_t pid, int *status);
 void start_server(int f_in, int f_out, int argc, char *argv[]);
 int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]);
Index: receiver.c
===================================================================
RCS file: /cvsroot/rsync/receiver.c,v
retrieving revision 1.38
diff -u -r1.38 receiver.c
--- receiver.c	13 Feb 2002 18:42:20 -0000	1.38
+++ receiver.c	5 Apr 2002 10:32:58 -0000
@@ -356,7 +356,7 @@
 
 		if (dry_run) {
 			if (!am_server) {
-				log_transfer(file, fname);
+				log_transfer(file, fname, NULL);
 			}
 			continue;
 		}
@@ -449,7 +449,7 @@
 		cleanup_set(fnametmp, fname, file, buf, fd1, fd2);
 
 		if (!am_server) {
-			log_transfer(file, fname);
+			log_transfer(file, fname, NULL);
 		}
 
 		/* recv file data */
Index: rsync.c
===================================================================
RCS file: /cvsroot/rsync/rsync.c,v
retrieving revision 1.119
diff -u -r1.119 rsync.c
--- rsync.c	20 Dec 2001 15:33:13 -0000	1.119
+++ rsync.c	5 Apr 2002 10:32:58 -0000
@@ -151,10 +151,8 @@
 	STRUCT_STAT st2;
 	int change_uid, change_gid;
 
-	if (dry_run) return 0;
-
 	if (!st) {
-		if (link_stat(fname,&st2) != 0) {
+		if (link_stat(fname,&st2) != 0 && !dry_run) {
 			rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
 			return 0;
 		}
@@ -199,12 +197,16 @@
 			link_stat(fname, st);
 		}
 		updated = 1;
+		if(verbose && report)
+			log_transfer(file,fname,"owner diff");
 	}
 
 #ifdef HAVE_CHMOD
 	if (!S_ISLNK(st->st_mode)) {
 		if (st->st_mode != file->mode) {
 			updated = 1;
+			if(verbose && report)
+				log_transfer(file,fname,"permission diff");
 			if (do_chmod(fname,file->mode) != 0) {
 				rprintf(FERROR,"failed to set permissions on %s : %s\n",
 					fname,strerror(errno));
Index: sender.c
===================================================================
RCS file: /cvsroot/rsync/sender.c,v
retrieving revision 1.15
diff -u -r1.15 sender.c
--- sender.c	25 Jan 2002 23:07:33 -0000	1.15
+++ sender.c	5 Apr 2002 10:32:58 -0000
@@ -150,7 +150,7 @@
 	  
 		if (dry_run) {	
 			if (!am_server) {
-				log_transfer(file, fname+offset);
+				log_transfer(file, fname+offset, NULL);
 			}
 			write_int(f_out,i);
 			continue;
@@ -212,7 +212,7 @@
 			    rprintf(FINFO,"calling match_sums %s\n",fname);
 	  
 		if (!am_server) {
-			log_transfer(file, fname+offset);
+			log_transfer(file, fname+offset, NULL);
 		}
 
 		set_compression(fname);


More information about the rsync mailing list