Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Apr 2001 22:21:32 +0200
From:      Jeroen Ruigrok/Asmodai <asmodai@wxs.nl>
To:        current@freebsd.org
Subject:   cp -u patch
Message-ID:  <20010426222132.B55566@daemon.ninth-circle.org>

next in thread | raw e-mail | index | archive | help

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Please test this further.

This adds -u to our cp, which is a reimplemented GNU feature after Jim
Mock asked me if we supported -u in our cp.

Basically cp -u compares src and dest and only overwrites if dest's
mtime < src's mtime.

Only caveat which I haven't yet solved is that it still shows dirs on
cp -Ruv copy actions, whilst it doesn't copy the directory.  Solutions
welcome.

Question is, do we want to add this to our cp?

I found it handy for stuff like:

cp -Ruv mozilla mozilla-test

so that my mozilla CVS tree [not touched] only overwrites the
mozilla-test files which are older.

-- 
Jeroen Ruigrok van der Werven/Asmodai --=-- asmodai@[wxs.nl|freebsd.org]
Documentation nutter/C-rated Coder BSD: Technical excellence at its best  
http://www.freebsd.org/doc/en_US.ISO_8859-1/books/developers-handbook/
Only in sleep can one find salvation that resembles Death...

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="cp.diff"

Index: src/bin/cp/cp.1
===================================================================
RCS file: /home/ncvs/FreeBSD/src/bin/cp/cp.1,v
retrieving revision 1.16.2.2
diff -u -r1.16.2.2 cp.1
--- src/bin/cp/cp.1	2001/03/05 04:32:59	1.16.2.2
+++ src/bin/cp/cp.1	2001/04/14 11:54:01
@@ -48,7 +48,10 @@
 .Op Fl H | Fl L | Fl P
 .Oc
 .Op Fl f | i
-.Op Fl pv
+.Oo
+.Fl v
+.Op Fl p | u
+.Oc
 .Ar source_file target_file
 .Nm
 .Oo
@@ -56,7 +59,10 @@
 .Op Fl H | Fl L | Fl P
 .Oc
 .Op Fl f | i
-.Op Fl pv
+.Oo
+.Fl v
+.Op Fl p | u
+.Oc
 .Ar source_file ... target_directory
 .Sh DESCRIPTION
 In the first synopsis form, the
@@ -155,6 +161,13 @@
 and either the user ID or group ID cannot be preserved, neither
 the set user ID nor set group ID bits are preserved in the copy's
 permissions.
+.It Fl u
+Cause
+.Nm
+to not copy the source file
+if the modification time is less than
+or equal to the modification time of the destination file,
+if it exists.
 .It Fl v
 Cause
 .Nm
Index: src/bin/cp/cp.c
===================================================================
RCS file: /home/ncvs/FreeBSD/src/bin/cp/cp.c,v
retrieving revision 1.24
diff -u -r1.24 cp.c
--- src/bin/cp/cp.c	1999/11/28 09:34:21	1.24
+++ src/bin/cp/cp.c	2001/04/12 16:16:37
@@ -83,7 +83,7 @@
 PATH_T to = { to.p_path, "", "" };
 
 uid_t myuid;
-int Rflag, iflag, pflag, rflag, fflag, vflag;
+int Rflag, iflag, pflag, rflag, fflag, uflag, vflag;
 int myumask;
 
 enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
@@ -102,7 +102,7 @@
 	char *target;
 
 	Hflag = Lflag = Pflag = 0;
-	while ((ch = getopt(argc, argv, "HLPRfiprv")) != -1)
+	while ((ch = getopt(argc, argv, "HLPRfipruv")) != -1)
 		switch (ch) {
 		case 'H':
 			Hflag = 1;
@@ -132,6 +132,11 @@
 			break;
 		case 'r':
 			rflag = 1;
+			break;
+		case 'u':
+			uflag = 1;
+			fflag = 0;
+			pflag = 0;
 			break;
 		case 'v':
 			vflag = 1;
Index: src/bin/cp/extern.h
===================================================================
RCS file: /home/ncvs/FreeBSD/src/bin/cp/extern.h,v
retrieving revision 1.9
diff -u -r1.9 extern.h
--- src/bin/cp/extern.h	1999/08/27 23:13:39	1.9
+++ src/bin/cp/extern.h	2001/04/12 16:07:56
@@ -42,7 +42,7 @@
 
 extern PATH_T to;
 extern uid_t myuid;
-extern int iflag, pflag, fflag, vflag, myumask;
+extern int iflag, pflag, fflag, uflag, vflag, myumask;
 
 #include <sys/cdefs.h>
 
Index: src/bin/cp/utils.c
===================================================================
RCS file: /home/ncvs/FreeBSD/src/bin/cp/utils.c,v
retrieving revision 1.27.2.1
diff -u -r1.27.2.1 utils.c
--- src/bin/cp/utils.c	2000/10/27 16:24:22	1.27.2.1
+++ src/bin/cp/utils.c	2001/04/15 19:21:27
@@ -62,7 +62,7 @@
 	int dne;
 {
 	static char buf[MAXBSIZE];
-	struct stat to_stat, *fs;
+	struct stat from_stat, to_stat, *fs;
 	int ch, checkch, from_fd, rcount, rval, to_fd, wcount, wresid;
 	char *bufp;
 #ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
@@ -105,9 +105,27 @@
 		    (void)unlink(to.p_path);
 		    to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
 				 fs->st_mode & ~(S_ISUID | S_ISGID));
-		} else 
-		    /* overwrite existing destination file name */
-		    to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
+		} else {
+			if (uflag) {
+				if (fstat(from_fd, &from_stat) == -1) {
+					warn("%s", entp->fts_path);
+					(void)close(from_fd);
+					return (1);
+				} else if (stat(to.p_path, &to_stat) == -1) {
+					warn("%s", to.p_path);
+					(void)close(from_fd);
+					return (1);
+				}
+
+				if (from_stat.st_mtime <= to_stat.st_mtime) {
+					(void)close(from_fd);
+					return (1);
+				}
+			}
+
+			/* overwrite existing destination file name */
+			to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
+		}
 	} else
 		to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
 		    fs->st_mode & ~(S_ISUID | S_ISGID));
@@ -324,7 +342,7 @@
 {
 
 	(void)fprintf(stderr, "%s\n%s\n",
-"usage: cp [-R [-H | -L | -P]] [-f | -i] [-pv] src target",
-"       cp [-R [-H | -L | -P]] [-f | -i] [-pv] src1 ... srcN directory");
+"usage: cp [-R [-H | -L | -P]] [-f | -i] [-v [-p | -u]] src target",
+"       cp [-R [-H | -L | -P]] [-f | -i] [-v [-p | -u]] src1 ... srcN directory");
 	exit(EX_USAGE);
 }

--BOKacYhQ+x31HxR3--

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010426222132.B55566>