[darwinbuild-changes] [842] trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Jun 15 14:36:54 PDT 2010


Revision: 842
          http://trac.macosforge.org/projects/darwinbuild/changeset/842
Author:   wsiegrist at apple.com
Date:     2010-06-15 14:36:51 -0700 (Tue, 15 Jun 2010)
Log Message:
-----------
Merge PR-7872907

Modified Paths:
--------------
    trunk/darwinup/DB.cpp
    trunk/darwinup/DB.h
    trunk/darwinup/Depot.cpp
    trunk/darwinup/Depot.h
    trunk/darwinup/Utils.cpp
    trunk/darwinup/Utils.h
    trunk/darwinup/darwinup.1
    trunk/darwinup/main.cpp
    trunk/testing/darwinup/run-tests.sh

Added Paths:
-----------
    trunk/testing/darwinup/extension.tar.bz2

Property Changed:
----------------
    trunk/


Property changes on: trunk
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388:399-419
/branches/PR-6358021:442-443
/branches/PR-6392966:423-427
/branches/PR-6398060:433-434
/branches/PR-6493844:460-461
/branches/PR-6497694:466-468,471
/branches/PR-6634286:632-650
/branches/PR-6688645:479-490
/branches/PR-6722857:495-499
/branches/PR-6729491:655-664
/branches/PR-6973110:804-813
/branches/PR-7250612:635-650
/branches/PR-7341154:682-694
/branches/PR-7431723:660-664
/branches/PR-7461534:650-664
/branches/PR-7482850:670-671
/branches/PR-7489777:676-731
/branches/PR-7529688:692-694
/branches/PR-7593824:739-772
/branches/PR-7598640:703-731
/branches/PR-7748469:777-785
/branches/PR-7765119:790-791
/branches/PR-7798586:796-799
/branches/PR-7935095:819-821
   + /branches/PR-4841388:399-419
/branches/PR-6358021:442-443
/branches/PR-6392966:423-427
/branches/PR-6398060:433-434
/branches/PR-6493844:460-461
/branches/PR-6497694:466-468,471
/branches/PR-6634286:632-650
/branches/PR-6688645:479-490
/branches/PR-6722857:495-499
/branches/PR-6729491:655-664
/branches/PR-6973110:804-813
/branches/PR-7250612:635-650
/branches/PR-7341154:682-694
/branches/PR-7431723:660-664
/branches/PR-7461534:650-664
/branches/PR-7482850:670-671
/branches/PR-7489777:676-731
/branches/PR-7529688:692-694
/branches/PR-7593824:739-772
/branches/PR-7598640:703-731
/branches/PR-7748469:777-785
/branches/PR-7765119:790-791
/branches/PR-7798586:796-799
/branches/PR-7872907:830-840
/branches/PR-7935095:819-821

Modified: trunk/darwinup/DB.cpp
===================================================================
--- trunk/darwinup/DB.cpp	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/DB.cpp	2010-06-15 21:36:51 UTC (rev 842)
@@ -105,7 +105,8 @@
 }
 
 int DarwinupDatabase::update_archive(uint64_t serial, uuid_t uuid, const char* name,
-									  time_t date_added, uint32_t active, uint32_t info) {
+									 time_t date_added, uint32_t active, uint32_t info,
+									 const char* build) {
 	this->clear_last_archive();
 	return this->update(this->m_archives_table, serial,
 						(uint8_t*)uuid,
@@ -113,7 +114,8 @@
 						name,
 						(uint64_t)date_added,
 						(uint64_t)active,
-						(uint64_t)info);
+						(uint64_t)info,
+						build);
 }
 
 uint64_t DarwinupDatabase::insert_archive(uuid_t uuid, uint32_t info, const char* name, 

Modified: trunk/darwinup/DB.h
===================================================================
--- trunk/darwinup/DB.h	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/DB.h	2010-06-15 21:36:51 UTC (rev 842)
@@ -73,7 +73,8 @@
 	int      activate_archive(uint64_t serial);
 	int      deactivate_archive(uint64_t serial);
 	int      update_archive(uint64_t serial, uuid_t uuid, const char* name,
-							time_t date_added, uint32_t active, uint32_t info);
+							time_t date_added, uint32_t active, uint32_t info,
+							const char* build);
 	uint64_t insert_archive(uuid_t uuid, uint32_t info, const char* name, 
 							time_t date, const char* build);
 	int      delete_empty_archives();

Modified: trunk/darwinup/Depot.cpp
===================================================================
--- trunk/darwinup/Depot.cpp	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/Depot.cpp	2010-06-15 21:36:51 UTC (rev 842)
@@ -61,6 +61,7 @@
 	m_is_locked = 0;
 	m_depot_mode = 0750;
 	m_is_dirty = false;
+	m_modified_extensions = false;
 }
 
 Depot::Depot(const char* prefix) {
@@ -69,6 +70,7 @@
 	m_depot_mode = 0750;
 	m_build = NULL;
 	m_is_dirty = false;
+	m_modified_extensions = false;
 	
 	asprintf(&m_prefix, "%s", prefix);
 	join_path(&m_depot_path, m_prefix, "/.DarwinDepot");
@@ -91,10 +93,11 @@
 	if (m_downloads_path)	free(m_downloads_path);
 }
 
-const char*	Depot::archives_path()		{ return m_archives_path; }
-const char*	Depot::downloads_path()		{ return m_downloads_path; }
-const char*     Depot::prefix()                 { return m_prefix; }
-bool          Depot::is_dirty()          { return m_is_dirty; }
+const char*	Depot::archives_path()		      { return m_archives_path; }
+const char*	Depot::downloads_path()		      { return m_downloads_path; }
+const char* Depot::prefix()                   { return m_prefix; }
+bool        Depot::is_dirty()                 { return m_is_dirty; }
+bool        Depot::has_modified_extensions()  { return m_modified_extensions; }
 
 int Depot::connect() {
 	m_db = new DarwinupDatabase(m_database_path);
@@ -107,8 +110,11 @@
 
 int Depot::create_storage() {
 	uid_t uid = getuid();
+	gid_t gid = 0;
 	struct group *gs = getgrnam("admin");
-	gid_t gid = gs->gr_gid;
+	if (gs) {
+		gid = gs->gr_gid;
+	}
 	
 	int res = mkdir(m_depot_path, m_depot_mode);
 	res = chmod(m_depot_path, m_depot_mode);
@@ -483,7 +489,14 @@
 						IF_DEBUG("[analyze]    needs user data backup\n");
 						actual->info_set(FILE_INFO_ROLLBACK_DATA);
 					}
-				}				
+				}
+				
+				if (!this->m_modified_extensions && 
+					(strncmp(file->path(), "/System/Library/Extensions", 26) == 0)) {
+					IF_DEBUG("[analyze]    kernel extension detected\n");
+					this->m_modified_extensions = true;
+				}
+
 			}
 
 			// if file == actual, but actual != preceding, then an external
@@ -1073,9 +1086,9 @@
 		archive = NULL;
 		archcnt = 0;
 		// check for special keywords
-		if (strncasecmp(args[i], "all", 3) == 0) {
+		if (strncasecmp(args[i], "all", 3) == 0 && strlen(args[i]) == 3) {
 			list = this->get_all_archives(&archcnt);
-		} else if (strncasecmp(args[i], "superseded", 10) == 0) {
+		} else if (strncasecmp(args[i], "superseded", 10) == 0 && strlen(args[i]) == 10) {
 			list = this->get_superseded_archives(&archcnt);
 		} 
 		if (archcnt) {
@@ -1368,26 +1381,26 @@
 }
 
 // perform a command on an archive specification
-int Depot::process_archive(const char* command, const char* arg) {
+int Depot::process_archive(const char* command, const char* archspec) {
 	extern uint32_t verbosity;
 	int res = 0;
 	uint32_t count = 0;
 	Archive** list = NULL;
 	
-	if (strncasecmp(arg, "all", 3) == 0) {
+	if (strncasecmp(archspec, "all", 3) == 0 && strlen(archspec) == 3) {
 		list = this->get_all_archives(&count);
-	} else if (strncasecmp(arg, "superseded", 10) == 0) {
+	} else if (strncasecmp(archspec, "superseded", 10) == 0 && strlen(archspec) == 10) {
 		list = this->get_superseded_archives(&count);
 	} else {
 		// make a list of 1 Archive
 		list = (Archive**)malloc(sizeof(Archive*));
-		list[0] = this->get_archive(arg);
+		list[0] = this->get_archive(archspec);
 		count = 1;
 	}
 	
 	for (size_t i = 0; i < count; i++) {
 		if (!list[i]) {
-			fprintf(stdout, "Archive not found: %s\n", arg);
+			fprintf(stdout, "Archive not found: %s\n", archspec);
 			return -1;
 		}
 		if (verbosity & VERBOSE_DEBUG) {
@@ -1401,3 +1414,49 @@
 	free(list);
 	return res;
 }
+
+int Depot::rename_archive(const char* archspec, const char* name) {
+	extern uint32_t verbosity;
+	int res = 0;
+	
+	if ((strncasecmp(archspec, "all", 3) == 0 && strlen(archspec) == 3) ||
+		(strncasecmp(archspec, "superseded", 10) == 0 && strlen(archspec) == 10)) {
+		fprintf(stderr, "Error: keywords 'all' and 'superseded' cannot be used with the"
+				" rename command.\n");
+		return -2;
+	}
+	
+	Archive* archive = this->get_archive(archspec);
+	if (!archive) {
+		fprintf(stdout, "Archive not found: %s\n", archspec);
+		return -1;
+	}
+	
+	char uuid[37];
+	uuid_unparse_upper(archive->uuid(), uuid);
+	if (verbosity & VERBOSE_DEBUG) {
+		fprintf(stdout, "Found archive: %s\n", uuid);
+	}
+
+	if (!name || strlen(name) == 0) {
+		fprintf(stderr, "Error: invalid name: '%s'\n", name);
+		return -3;
+	}
+	
+	free(archive->m_name);
+	archive->m_name = strdup(name);
+	
+	res = m_db->update_archive(archive->serial(),
+							   archive->uuid(),
+							   archive->name(),
+							   archive->date_installed(),
+							   1,
+							   archive->info(),
+							   archive->build());
+
+	if (res == 0) fprintf(stdout, "Renamed archive %s to '%s'.\n", 
+						  uuid, archive->name());
+	
+	delete archive;
+	return res;
+}

Modified: trunk/darwinup/Depot.h
===================================================================
--- trunk/darwinup/Depot.h	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/Depot.h	2010-06-15 21:36:51 UTC (rev 842)
@@ -110,8 +110,10 @@
 	// processes an archive according to command
 	//  arg is an archive identifier, such as serial or uuid
 	int dispatch_command(Archive* archive, const char* command);
-	int process_archive(const char* command, const char* arg);
+	int process_archive(const char* command, const char* archspec);
 	
+	int rename_archive(const char* archspec, const char* name);
+	
 	// test if the depot is currently locked 
 	int is_locked();
 
@@ -120,6 +122,7 @@
 	void    archive_header();
 	
 	bool    is_dirty();
+	bool    has_modified_extensions();
 	
 protected:
 
@@ -168,7 +171,9 @@
 	char*       m_build;
 	int		    m_lock_fd;
 	int         m_is_locked;
-	bool      m_is_dirty; // track if we need to update dyld cache
+	bool        m_is_dirty; // track if we need to update dyld cache
+	bool        m_modified_extensions; // track if we need to touch /S/L/E
+
 };
 
 #endif

Modified: trunk/darwinup/Utils.cpp
===================================================================
--- trunk/darwinup/Utils.cpp	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/Utils.cpp	2010-06-15 21:36:51 UTC (rev 842)
@@ -402,6 +402,20 @@
 
 	return -1;
 }
+
+int tell_finder_to_restart() {
+	int res = 0;
+	
+	const char *args[] = {
+		"/usr/bin/osascript", "-e",
+		"tell app \"Finder\" to restart",
+		NULL,
+	};
+	
+	res = exec_with_args(args);
+	
+	return res;
+}
 #endif
 
 void __data_hex(FILE* f, uint8_t* data, uint32_t size) {
@@ -425,4 +439,3 @@
 	fprintf(stdout, "=============================================="
 			"=======================================\n");	
 }
-

Modified: trunk/darwinup/Utils.h
===================================================================
--- trunk/darwinup/Utils.h	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/Utils.h	2010-06-15 21:36:51 UTC (rev 842)
@@ -82,6 +82,7 @@
 
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
 int build_number_for_path(char** build, const char* path);
+int tell_finder_to_restart();
 #endif
 
 void __data_hex(FILE* f, uint8_t* data, uint32_t size);

Modified: trunk/darwinup/darwinup.1
===================================================================
--- trunk/darwinup/darwinup.1	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/darwinup.1	2010-06-15 21:36:51 UTC (rev 842)
@@ -46,9 +46,7 @@
 .Sh OPTIONS
 .Bl -tag -width -indent
 .It \-d
-Do not update dyld cache. Darwinup normally runs update_dyld_shared_cache 
-if the operation actually changes files on disk. To ensure this does not 
-happen, you can provide this option.
+Do not run helpful automation. See HELPFUL AUTOMATION below.
 .It \-f
 Force. Some operations will fail gracefully due to potentially unsafe 
 situations, such as a root that installs a file where a directory is.
@@ -58,10 +56,14 @@
 Dry run. Darwinup will go through an operation, including analyzing
 the root(s) and printing the state/change symbol, but no files will
 be modified on your system and no records will be added to the depot.
+This option implies -d.
 .It \-p Op Ar path
 Prefix path. Normally, darwinup will operate on the boot partition. You
 can use the -p option to have darwinup work on another partition. You
 can provide any arbitrary path, it does not need to be a mount point.
+.It \-r
+Restart. Gracefully restart after all operations are complete by telling
+Finder to restart. 
 .It \-v
 Verbose. This option causes darwinup to print extra information. You can
 pass 2 or 3 v's for even more information, but that is usually only needed
@@ -75,22 +77,24 @@
 options listed below support globbing and multiple items. See the EXAMPLES 
 section below for more details.
 .Bl -tag -width -indent
-.It Ar files Ar archives
+.It files Ar archives
 List the files and directories in the 
 .Ar archive .
-.It Ar install Ar path
+.It install Ar path
 Install the root at 
 .Ar path .
-.It Ar list Op Ar archive
+.It list Op Ar archive
 List archives that are installed. You may optionally provide an
 archive specification to limit which archives get listed. 
-.It Ar uninstall Ar archives
+.It rename Ar archive Ar name
+Rename an archive.
+.It uninstall Ar archives
 Uninstall the specified archive.
-.It Ar upgrade Ar path
+.It upgrade Ar path
 Find the last archive that was installed with the same name (basename of 
 path), and replace it with the root at 
 .Ar path .
-.It Ar verify Ar archive
+.It verify Ar archive
 List all of the information about 
 .Ar archive .
 This includes status letters
@@ -208,6 +212,20 @@
 superseded, then you should not get this error as the backup copies will
 not be used anyway. 
 .El
+.Sh HELPFUL AUTOMATION
+Darwinup tries to detect common situations and run external tools that you
+would otherwise have to remember to run yourself. The "dry run" (-n) and 
+"disable automation" (-d) options prevent any of the following from 
+happening.
+.Bl -tag -width -indent
+.It Dyld Cache
+If a root modifies any file, then darwinup will run 
+update_dyld_shared_cache unless the -d option is specified.
+.It Kernel Extensions
+If a root modifies a file under /System/Library/Extensions, then darwinup
+will update the mtime of /System/Library/Extensions to ensure that the 
+kext cache is updated during the next boot. 
+.El
 .Sh EXAMPLES
 .Bl -tag -width -indent
 .It Install files from a tarball
@@ -229,4 +247,5 @@
 .Xr curl 1 ,
 .Xr tar 1 ,
 .Xr gzip 1 ,
-.Xr ditto 1
\ No newline at end of file
+.Xr ditto 1 ,
+.Xr update_dyld_shared_cache 1
\ No newline at end of file

Modified: trunk/darwinup/main.cpp
===================================================================
--- trunk/darwinup/main.cpp	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/darwinup/main.cpp	2010-06-15 21:36:51 UTC (rev 842)
@@ -35,6 +35,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/time.h>
 #include <unistd.h>
 #include <limits.h>
 
@@ -50,17 +51,21 @@
 	fprintf(stderr, "                                                               \n");
 	fprintf(stderr, "options:                                                       \n");
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-	fprintf(stderr, "          -d        do not update dyld cache                   \n");	
+	fprintf(stderr, "          -d        disable helpful automation                 \n");	
 #endif
 	fprintf(stderr, "          -f        force operation to succeed at all costs    \n");
 	fprintf(stderr, "          -n        dry run                                    \n");
 	fprintf(stderr, "          -p DIR    operate on roots under DIR (default: /)    \n");
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+	fprintf(stderr, "          -r        gracefully restart when finished           \n");	
+#endif
 	fprintf(stderr, "          -v        verbose (use -vv for extra verbosity)      \n");
 	fprintf(stderr, "                                                               \n");
 	fprintf(stderr, "commands:                                                      \n");
 	fprintf(stderr, "          files      <archive>                                 \n");
 	fprintf(stderr, "          install    <path>                                    \n");
 	fprintf(stderr, "          list       [archive]                                 \n");
+	fprintf(stderr, "          rename     <archive> <name>                          \n");
 	fprintf(stderr, "          uninstall  <archive>                                 \n");
 	fprintf(stderr, "          upgrade    <path>                                    \n");
 	fprintf(stderr, "          verify     <archive>                                 \n");
@@ -103,19 +108,20 @@
 	char* progname = strdup(basename(argv[0]));      
 	char* path = NULL;
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-	bool update_dyld = true;
+	bool disable_automation = false;
+	bool restart = false;
 #endif
 	
 	int ch;
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-	while ((ch = getopt(argc, argv, "dfnp:vh")) != -1) {
+	while ((ch = getopt(argc, argv, "dfnp:rvh")) != -1) {
 #else
 	while ((ch = getopt(argc, argv, "fnp:vh")) != -1) {		
 #endif
 		switch (ch) {
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060	
 		case 'd':
-				update_dyld = false;
+				disable_automation = true;
 				break;
 #endif
 		case 'f':
@@ -124,7 +130,7 @@
 		case 'n':
 				dryrun = 1;
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-				update_dyld = false;
+				disable_automation = true;
 #endif
 				break;
 		case 'p':
@@ -138,6 +144,11 @@
 				}
 				join_path(&path, optarg, "/");
 				break;
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060	
+		case 'r':
+				restart = true;
+				break;
+#endif
 		case 'v':
 				verbosity <<= 1;
 				verbosity |= VERBOSE;
@@ -149,7 +160,7 @@
 		}
 	}
 	argc -= optind;
-	argv += optind;
+    argv += optind;
 	if (argc == 0) usage(progname);
 	
 	int res = 0;
@@ -157,7 +168,8 @@
 	if (dryrun) IF_DEBUG("option: dry run\n");
 	if (force)  IF_DEBUG("option: forcing operations\n");
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-	if (!update_dyld) IF_DEBUG("option: not updating dyld cache\n");
+	if (disable_automation) IF_DEBUG("option: helpful automation disabled\n");
+    if (restart) IF_DEBUG("option: restart when finished\n");
 #endif
 	
 	if (!path) {
@@ -191,11 +203,12 @@
 			if (depot->initialize(false)) exit(11);
 			depot->dump();
 		} else {
+			fprintf(stderr, "Error: unknown command: '%s' \n", argv[0]);
 			usage(progname);
 		}
 	} else {
 		// loop over arguments
-		for (int i = 1; i < argc; i++) {
+		for (int i = 1; i < argc && res == 0; i++) {
 			if (strcmp(argv[0], "install") == 0) {
 				if (i==1 && depot->initialize(true)) exit(13);
 				res = depot->install(argv[i]);
@@ -220,16 +233,43 @@
 			} else if (strcmp(argv[0], "verify") == 0) {
 				if (i==1 && depot->initialize(true)) exit(16);
 				res = depot->process_archive(argv[0], argv[i]);
+			} else if (strcmp(argv[0], "rename") == 0) {
+				if (i==1 && depot->initialize(true)) exit(17);
+				if ((i+1) >= argc) {
+					fprintf(stderr, 
+							"Error: rename command for '%s' takes 2 arguments.\n", 
+							argv[i]);
+					exit(18);
+				}
+				res = depot->rename_archive(argv[i], argv[i+1]);
+				i++;
 			} else {
+				fprintf(stderr, "Error: unknown command: '%s' \n", argv[0]);
 				usage(progname);
 			}
 		}
 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
-		if (update_dyld && depot->is_dirty() && res == 0) {
+		if (!disable_automation && depot->is_dirty() && res == 0) {
 			res = update_dyld_shared_cache(path);
 			if (res) fprintf(stderr, "Warning: could not update dyld cache.\n");
 			res = 0;
-		}		
+		}
+		if (!disable_automation && depot->has_modified_extensions() && res == 0) {
+			char *sle_path;
+			res = join_path(&sle_path, depot->prefix(), "/System/Library/Extensions");
+			if (res == 0) res = utimes(sle_path, NULL);
+			if (res) {
+				fprintf(stderr, "Warning: unable to touch %s \n", sle_path);
+				res = 0;
+			}
+			free(sle_path);
+		}
+		if (restart && res == 0) {
+			res = tell_finder_to_restart();
+			if (res) fprintf(stderr, "Warning: tried to tell Finder to restart"
+							         "but failed.\n");
+			res = 0;
+		}
 #endif
 	}
 	

Copied: trunk/testing/darwinup/extension.tar.bz2 (from rev 840, branches/PR-7872907/testing/darwinup/extension.tar.bz2)
===================================================================
(Binary files differ)

Modified: trunk/testing/darwinup/run-tests.sh
===================================================================
--- trunk/testing/darwinup/run-tests.sh	2010-06-15 21:36:06 UTC (rev 841)
+++ trunk/testing/darwinup/run-tests.sh	2010-06-15 21:36:51 UTC (rev 842)
@@ -1,11 +1,11 @@
 #!/bin/bash
 set -e
 set -x
+pushd $(dirname $0) >> /dev/null
 
 #
 # Run tests on darwinup
 #
-
 PREFIX=/tmp/testing/darwinup
 ORIG=$PREFIX/orig
 DEST=$PREFIX/dest
@@ -37,7 +37,7 @@
 	tar zxvf $R.tar.gz -C $PREFIX
 done;
 
-for R in 300dirs.tbz2 300files.tbz2 deep-rollback.cpgz deep-rollback-2.xar;
+for R in 300dirs.tbz2 300files.tbz2 deep-rollback.cpgz deep-rollback-2.xar extension.tar.bz2;
 do
 	cp $R $PREFIX/
 done;
@@ -272,6 +272,47 @@
 $DIFF $ORIG $DEST 2>&1
 
 
+echo "========== TEST: Archive Rename ============="
+$DARWINUP install $PREFIX/root2
+$DARWINUP install $PREFIX/root
+$DARWINUP install $PREFIX/root6
+$DARWINUP rename root "RENAME1"
+C=$($DARWINUP list | grep "RENAME1" | wc -l | xargs)
+test "$C" == "1" 
+$DARWINUP rename oldest "RENAME2"
+C=$($DARWINUP list | grep "RENAME2" | wc -l | xargs)
+test "$C" == "1" 
+$DARWINUP uninstall "RENAME1"
+C=$($DARWINUP list | grep "RENAME1" | wc -l | xargs)
+test "$C" == "0" 
+C=$($DARWINUP files "RENAME2" | wc -l | xargs)
+test "$C" == "17" 
+C=$($DARWINUP verify "RENAME2" | wc -l | xargs)
+test "$C" == "17"
+$DARWINUP rename root6 RENAME3 RENAME3 RENAME4 RENAME4 RENAME5 RENAME5 RENAME6
+C=$($DARWINUP list | grep "root6" | wc -l | xargs)
+test "$C" == "0" 
+C=$($DARWINUP list | grep "RENAME6" | wc -l | xargs)
+test "$C" == "1" 
+C=$($DARWINUP files "RENAME6" | wc -l | xargs)
+test "$C" == "8"
+$DARWINUP uninstall all
+echo "DIFF: diffing original test files to dest (should be no diffs) ..."
+$DIFF $ORIG $DEST 2>&1
+
+echo "========== TEST: Modify /System/Library/Extensions =========="
+mkdir -p $DEST/System/Library/Extensions/Foo.kext
+BEFORE=$(ls -Tld $DEST/System/Library/Extensions/ | awk '{print $6$7$8$9}');
+sleep 2;
+$DARWINUP install extension.tar.bz2
+AFTER=$(ls -Tld $DEST/System/Library/Extensions/ | awk '{print $6$7$8$9}');
+test $BEFORE != $AFTER
+$DARWINUP uninstall newest
+rm -rf $DEST/System
+echo "DIFF: diffing original test files to dest (should be no diffs) ..."
+$DIFF $ORIG $DEST 2>&1
+
+
 #
 # The following are expected failures
 #
@@ -282,5 +323,6 @@
 echo "DIFF: diffing original test files to dest (should be no diffs) ..."
 $DIFF $ORIG $DEST 2>&1
 
+popd >> /dev/null
 echo "INFO: Done testing!"
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100615/8ed2b521/attachment-0001.html>


More information about the darwinbuild-changes mailing list