[darwinbuild-changes] [786] trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Mar 15 14:01:43 PDT 2010


Revision: 786
          http://trac.macosforge.org/projects/darwinbuild/changeset/786
Author:   wsiegrist at apple.com
Date:     2010-03-15 14:01:42 -0700 (Mon, 15 Mar 2010)
Log Message:
-----------
Merge PR-7748469

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

Property Changed:
----------------
    trunk/
    trunk/darwinbuild/darwinbuild.in
    trunk/darwinbuild/darwinmaster.in
    trunk/darwinbuild/installXcode.in
    trunk/darwinbuild/packageRoots.in
    trunk/darwinbuild/thinPackages.in


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-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-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-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


Property changes on: trunk/darwinbuild/darwinbuild.in
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388/darwinbuild/darwinbuild:399-419
/branches/PR-6358021/darwinbuild/darwinbuild:442-443
/branches/PR-6392966/darwinbuild/darwinbuild:423-427
/branches/PR-6398060/darwinbuild/darwinbuild:433-434
/branches/PR-6493844/darwinbuild/darwinbuild.in:460-461
/branches/PR-6497694/darwinbuild/darwinbuild.in:466-468,471
/branches/PR-6634286/darwinbuild/darwinbuild.in:632-650
/branches/PR-6688645/darwinbuild/darwinbuild.in:479-490
/branches/PR-6722857/darwinbuild/darwinbuild.in:495-499
/branches/PR-6729491/darwinbuild/darwinbuild.in:655-664
/branches/PR-7250612/darwinbuild/darwinbuild.in:635-650
/branches/PR-7341154/darwinbuild/darwinbuild.in:682-694
/branches/PR-7431723/darwinbuild/darwinbuild.in:660-664
/branches/PR-7461534/darwinbuild/darwinbuild.in:650-664
/branches/PR-7489777/darwinbuild/darwinbuild.in:676-731
/branches/PR-7529688/darwinbuild/darwinbuild.in:692-694
/branches/PR-7593824/darwinbuild/darwinbuild.in:739-772
/branches/PR-7598640/darwinbuild/darwinbuild.in:703-731
   + /branches/PR-4841388/darwinbuild/darwinbuild:399-419
/branches/PR-6358021/darwinbuild/darwinbuild:442-443
/branches/PR-6392966/darwinbuild/darwinbuild:423-427
/branches/PR-6398060/darwinbuild/darwinbuild:433-434
/branches/PR-6493844/darwinbuild/darwinbuild.in:460-461
/branches/PR-6497694/darwinbuild/darwinbuild.in:466-468,471
/branches/PR-6634286/darwinbuild/darwinbuild.in:632-650
/branches/PR-6688645/darwinbuild/darwinbuild.in:479-490
/branches/PR-6722857/darwinbuild/darwinbuild.in:495-499
/branches/PR-6729491/darwinbuild/darwinbuild.in:655-664
/branches/PR-7250612/darwinbuild/darwinbuild.in:635-650
/branches/PR-7341154/darwinbuild/darwinbuild.in:682-694
/branches/PR-7431723/darwinbuild/darwinbuild.in:660-664
/branches/PR-7461534/darwinbuild/darwinbuild.in:650-664
/branches/PR-7489777/darwinbuild/darwinbuild.in:676-731
/branches/PR-7529688/darwinbuild/darwinbuild.in:692-694
/branches/PR-7593824/darwinbuild/darwinbuild.in:739-772
/branches/PR-7598640/darwinbuild/darwinbuild.in:703-731
/branches/PR-7748469/darwinbuild/darwinbuild.in:777-785


Property changes on: trunk/darwinbuild/darwinmaster.in
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388/darwinbuild/darwinmaster.sh:399-419
/branches/PR-6358021/darwinbuild/darwinmaster.sh:442-443
/branches/PR-6392966/darwinbuild/darwinmaster.sh:423-427
/branches/PR-6398060/darwinbuild/darwinmaster.sh:433-434
/branches/PR-6493844/darwinbuild/darwinmaster.sh.in:460-461
/branches/PR-6497694/darwinbuild/darwinmaster.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/darwinmaster.in:632-650
/branches/PR-6688645/darwinbuild/darwinmaster.sh.in:479-490
/branches/PR-6722857/darwinbuild/darwinmaster.sh.in:495-499
/branches/PR-6729491/darwinbuild/darwinmaster.in:655-664
/branches/PR-7250612/darwinbuild/darwinmaster.in:635-650
/branches/PR-7341154/darwinbuild/darwinmaster.in:682-694
/branches/PR-7431723/darwinbuild/darwinmaster.in:660-664
/branches/PR-7461534/darwinbuild/darwinmaster.in:650-664
/branches/PR-7489777/darwinbuild/darwinmaster.in:676-731
/branches/PR-7529688/darwinbuild/darwinmaster.in:692-694
/branches/PR-7593824/darwinbuild/darwinmaster.in:739-772
/branches/PR-7598640/darwinbuild/darwinmaster.in:703-731
   + /branches/PR-4841388/darwinbuild/darwinmaster.sh:399-419
/branches/PR-6358021/darwinbuild/darwinmaster.sh:442-443
/branches/PR-6392966/darwinbuild/darwinmaster.sh:423-427
/branches/PR-6398060/darwinbuild/darwinmaster.sh:433-434
/branches/PR-6493844/darwinbuild/darwinmaster.sh.in:460-461
/branches/PR-6497694/darwinbuild/darwinmaster.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/darwinmaster.in:632-650
/branches/PR-6688645/darwinbuild/darwinmaster.sh.in:479-490
/branches/PR-6722857/darwinbuild/darwinmaster.sh.in:495-499
/branches/PR-6729491/darwinbuild/darwinmaster.in:655-664
/branches/PR-7250612/darwinbuild/darwinmaster.in:635-650
/branches/PR-7341154/darwinbuild/darwinmaster.in:682-694
/branches/PR-7431723/darwinbuild/darwinmaster.in:660-664
/branches/PR-7461534/darwinbuild/darwinmaster.in:650-664
/branches/PR-7489777/darwinbuild/darwinmaster.in:676-731
/branches/PR-7529688/darwinbuild/darwinmaster.in:692-694
/branches/PR-7593824/darwinbuild/darwinmaster.in:739-772
/branches/PR-7598640/darwinbuild/darwinmaster.in:703-731
/branches/PR-7748469/darwinbuild/darwinmaster.in:777-785


Property changes on: trunk/darwinbuild/installXcode.in
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388/darwinbuild/installXcode:399-419
/branches/PR-6358021/darwinbuild/installXcode:442-443
/branches/PR-6392966/darwinbuild/installXcode:423-427
/branches/PR-6398060/darwinbuild/installXcode:433-434
/branches/PR-6493844/darwinbuild/installXcode.in:460-461
/branches/PR-6497694/darwinbuild/installXcode.in:466-468,471
/branches/PR-6634286/darwinbuild/installXcode.in:632-650
/branches/PR-6688645/darwinbuild/installXcode.in:479-490
/branches/PR-6722857/darwinbuild/installXcode.in:495-499
/branches/PR-6729491/darwinbuild/installXcode.in:655-664
/branches/PR-7250612/darwinbuild/installXcode.in:635-650
/branches/PR-7341154/darwinbuild/installXcode.in:682-694
/branches/PR-7431723/darwinbuild/installXcode.in:660-664
/branches/PR-7461534/darwinbuild/installXcode.in:650-664
/branches/PR-7489777/darwinbuild/installXcode.in:676-731
/branches/PR-7529688/darwinbuild/installXcode.in:692-694
/branches/PR-7593824/darwinbuild/installXcode.in:739-772
/branches/PR-7598640/darwinbuild/installXcode.in:703-731
   + /branches/PR-4841388/darwinbuild/installXcode:399-419
/branches/PR-6358021/darwinbuild/installXcode:442-443
/branches/PR-6392966/darwinbuild/installXcode:423-427
/branches/PR-6398060/darwinbuild/installXcode:433-434
/branches/PR-6493844/darwinbuild/installXcode.in:460-461
/branches/PR-6497694/darwinbuild/installXcode.in:466-468,471
/branches/PR-6634286/darwinbuild/installXcode.in:632-650
/branches/PR-6688645/darwinbuild/installXcode.in:479-490
/branches/PR-6722857/darwinbuild/installXcode.in:495-499
/branches/PR-6729491/darwinbuild/installXcode.in:655-664
/branches/PR-7250612/darwinbuild/installXcode.in:635-650
/branches/PR-7341154/darwinbuild/installXcode.in:682-694
/branches/PR-7431723/darwinbuild/installXcode.in:660-664
/branches/PR-7461534/darwinbuild/installXcode.in:650-664
/branches/PR-7489777/darwinbuild/installXcode.in:676-731
/branches/PR-7529688/darwinbuild/installXcode.in:692-694
/branches/PR-7593824/darwinbuild/installXcode.in:739-772
/branches/PR-7598640/darwinbuild/installXcode.in:703-731
/branches/PR-7748469/darwinbuild/installXcode.in:777-785


Property changes on: trunk/darwinbuild/packageRoots.in
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388/darwinbuild/packageRoots.sh:399-419
/branches/PR-6358021/darwinbuild/packageRoots.sh:442-443
/branches/PR-6392966/darwinbuild/packageRoots.sh:423-427
/branches/PR-6398060/darwinbuild/packageRoots.sh:433-434
/branches/PR-6493844/darwinbuild/packageRoots.sh.in:460-461
/branches/PR-6497694/darwinbuild/packageRoots.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/packageRoots.in:632-650
/branches/PR-6688645/darwinbuild/packageRoots.sh.in:479-490
/branches/PR-6722857/darwinbuild/packageRoots.sh.in:495-499
/branches/PR-6729491/darwinbuild/packageRoots.in:655-664
/branches/PR-7250612/darwinbuild/packageRoots.in:635-650
/branches/PR-7341154/darwinbuild/packageRoots.in:682-694
/branches/PR-7431723/darwinbuild/packageRoots.in:660-664
/branches/PR-7461534/darwinbuild/packageRoots.in:650-664
/branches/PR-7489777/darwinbuild/packageRoots.in:676-731
/branches/PR-7529688/darwinbuild/packageRoots.in:692-694
/branches/PR-7593824/darwinbuild/packageRoots.in:739-772
/branches/PR-7598640/darwinbuild/packageRoots.in:703-731
   + /branches/PR-4841388/darwinbuild/packageRoots.sh:399-419
/branches/PR-6358021/darwinbuild/packageRoots.sh:442-443
/branches/PR-6392966/darwinbuild/packageRoots.sh:423-427
/branches/PR-6398060/darwinbuild/packageRoots.sh:433-434
/branches/PR-6493844/darwinbuild/packageRoots.sh.in:460-461
/branches/PR-6497694/darwinbuild/packageRoots.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/packageRoots.in:632-650
/branches/PR-6688645/darwinbuild/packageRoots.sh.in:479-490
/branches/PR-6722857/darwinbuild/packageRoots.sh.in:495-499
/branches/PR-6729491/darwinbuild/packageRoots.in:655-664
/branches/PR-7250612/darwinbuild/packageRoots.in:635-650
/branches/PR-7341154/darwinbuild/packageRoots.in:682-694
/branches/PR-7431723/darwinbuild/packageRoots.in:660-664
/branches/PR-7461534/darwinbuild/packageRoots.in:650-664
/branches/PR-7489777/darwinbuild/packageRoots.in:676-731
/branches/PR-7529688/darwinbuild/packageRoots.in:692-694
/branches/PR-7593824/darwinbuild/packageRoots.in:739-772
/branches/PR-7598640/darwinbuild/packageRoots.in:703-731
/branches/PR-7748469/darwinbuild/packageRoots.in:777-785


Property changes on: trunk/darwinbuild/thinPackages.in
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/PR-4841388/darwinbuild/thinPackages.sh:399-419
/branches/PR-6358021/darwinbuild/thinPackages.sh:442-443
/branches/PR-6392966/darwinbuild/thinPackages.sh:423-427
/branches/PR-6398060/darwinbuild/thinPackages.sh:433-434
/branches/PR-6493844/darwinbuild/thinPackages.sh.in:460-461
/branches/PR-6497694/darwinbuild/thinPackages.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/thinPackages.in:632-650
/branches/PR-6688645/darwinbuild/thinPackages.sh.in:479-490
/branches/PR-6722857/darwinbuild/thinPackages.sh.in:495-499
/branches/PR-6729491/darwinbuild/thinPackages.in:655-664
/branches/PR-7250612/darwinbuild/thinPackages.in:635-650
/branches/PR-7341154/darwinbuild/thinPackages.in:682-694
/branches/PR-7431723/darwinbuild/thinPackages.in:660-664
/branches/PR-7461534/darwinbuild/thinPackages.in:650-664
/branches/PR-7489777/darwinbuild/thinPackages.in:676-731
/branches/PR-7529688/darwinbuild/thinPackages.in:692-694
/branches/PR-7593824/darwinbuild/thinPackages.in:739-772
/branches/PR-7598640/darwinbuild/thinPackages.in:703-731
   + /branches/PR-4841388/darwinbuild/thinPackages.sh:399-419
/branches/PR-6358021/darwinbuild/thinPackages.sh:442-443
/branches/PR-6392966/darwinbuild/thinPackages.sh:423-427
/branches/PR-6398060/darwinbuild/thinPackages.sh:433-434
/branches/PR-6493844/darwinbuild/thinPackages.sh.in:460-461
/branches/PR-6497694/darwinbuild/thinPackages.sh.in:466-468,471
/branches/PR-6634286/darwinbuild/thinPackages.in:632-650
/branches/PR-6688645/darwinbuild/thinPackages.sh.in:479-490
/branches/PR-6722857/darwinbuild/thinPackages.sh.in:495-499
/branches/PR-6729491/darwinbuild/thinPackages.in:655-664
/branches/PR-7250612/darwinbuild/thinPackages.in:635-650
/branches/PR-7341154/darwinbuild/thinPackages.in:682-694
/branches/PR-7431723/darwinbuild/thinPackages.in:660-664
/branches/PR-7461534/darwinbuild/thinPackages.in:650-664
/branches/PR-7489777/darwinbuild/thinPackages.in:676-731
/branches/PR-7529688/darwinbuild/thinPackages.in:692-694
/branches/PR-7593824/darwinbuild/thinPackages.in:739-772
/branches/PR-7598640/darwinbuild/thinPackages.in:703-731
/branches/PR-7748469/darwinbuild/thinPackages.in:777-785

Modified: trunk/darwinup/DB.cpp
===================================================================
--- trunk/darwinup/DB.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/DB.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -311,7 +311,7 @@
 						  this->m_archives_table,
 						  1,
 						  this->m_archives_table->column(2), // name
-						  '!', "<Rollback>");		
+						  '!', "<Rollback>");
 	}
 	if (res != SQLITE_ROW) {
 		fprintf(stderr, "Error: unable to count archives: %d \n", res);
@@ -386,12 +386,18 @@
 	return DB_ERROR;
 }
 
-int DarwinupDatabase::get_files(uint8_t*** data, uint32_t* count, Archive* archive) {
-	int res = this->get_all_ordered("files__archive",
+int DarwinupDatabase::get_files(uint8_t*** data, uint32_t* count, Archive* archive, bool reverse) {
+	int order = ORDER_BY_ASC;
+	const char* name = "files_archive";
+	if (reverse) {
+		order = ORDER_BY_DESC;
+		name = "files_archive_reverse";
+	}
+	int res = this->get_all_ordered(name,
 									data, count,
 									this->m_files_table,
 									this->m_files_table->column(8), // order by path
-									ORDER_BY_ASC,
+									order,
 									1,
 									this->m_files_table->column(1),
 									'=', archive->serial());
@@ -441,7 +447,7 @@
 									ORDER_BY_DESC,
 									1,
 									this->m_archives_table->column(2),  // name
-									'!', (include_rollbacks ? "" : "<Rollback>") );
+									'!', (include_rollbacks ? "" : "<Rollback>"));
 	
 	if ((res == SQLITE_DONE) && *count) return (DB_OK | DB_FOUND);
 	if (res == SQLITE_DONE) return DB_OK;

Modified: trunk/darwinup/DB.h
===================================================================
--- trunk/darwinup/DB.h	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/DB.h	2010-03-15 21:01:42 UTC (rev 786)
@@ -87,7 +87,7 @@
 	int      get_file_serials(uint64_t** serials, uint32_t* count);
 	int      get_file_serial_from_archive(Archive* archive, const char* path, 
 										  uint64_t** serial);
-	int      get_files(uint8_t*** data, uint32_t* count, Archive* archive);
+	int      get_files(uint8_t*** data, uint32_t* count, Archive* archive, bool reverse);
 	int      file_offset(int column);
 	int      update_file(uint64_t serial, Archive* archive, uint32_t info, mode_t mode, 
 						 uid_t uid, gid_t gid, Digest* digest, const char* path);

Modified: trunk/darwinup/Database.cpp
===================================================================
--- trunk/darwinup/Database.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/Database.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -553,7 +553,7 @@
     char* error;
     if (this->m_db) {
         char *query = sqlite3_vmprintf(fmt, args);
-        res = sqlite3_exec(this->m_db, query, NULL, NULL, &error);
+		res = sqlite3_exec(this->m_db, query, NULL, NULL, &error);
         sqlite3_free(query);
     } else {
         fprintf(stderr, "Error: database not open.\n");
@@ -562,7 +562,7 @@
     va_end(args);
 	if (error) {
 		strlcpy(m_error, error, m_error_size);
-		fprintf(stderr, "Error: sql(): %s \n", m_error);
+		fprintf(stderr, "Error: sql_once(): %s \n", m_error);
 		fprintf(stderr, "Error: fmt: %s \n", fmt);
 		sqlite3_free(error);
 	}
@@ -593,7 +593,8 @@
 }
 
 int Database::execute(sqlite3_stmt* stmt) {
-	int res = sqlite3_step(stmt);
+	int res = SQLITE_OK;
+	res = sqlite3_step(stmt);
 	if (res == SQLITE_DONE) {
 		res = SQLITE_OK;
 	} else {
@@ -770,9 +771,10 @@
 }
 
 bool Database::has_information_table() {
-	int res = sqlite3_exec(this->m_db, 
-						   "SELECT count(*) FROM database_information;", 
-						   NULL, NULL, NULL);
+	int res = SQLITE_OK;
+	res = sqlite3_exec(this->m_db, 
+					   "SELECT count(*) FROM database_information;", 
+					   NULL, NULL, NULL);
 	return res == SQLITE_OK;
 }
 
@@ -849,7 +851,8 @@
  *   were written to output
  */
 int Database::step_once(sqlite3_stmt* stmt, uint8_t* output, uint32_t* used) {
-	int res = sqlite3_step(stmt);
+	int res = SQLITE_OK;
+	res = sqlite3_step(stmt);
 	uint8_t* current = output;
 	if (used) *used = 0;
 	if (res == SQLITE_ROW) {

Modified: trunk/darwinup/Database.h
===================================================================
--- trunk/darwinup/Database.h	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/Database.h	2010-03-15 21:01:42 UTC (rev 786)
@@ -83,7 +83,29 @@
 #define ADD_BLOB(table, name) \
 	assert(table->add_column(new Column(name, TYPE_BLOB), this->schema_version())==0);
 
+// retry an operation a few times if we hit a lock
+#define __retry_if_locked(operation) \
+    do { \
+    extern uint32_t verbosity; \
+    fprintf(stderr, "retry: verbosity %u \n", verbosity); \
+    res = operation; \
+    fprintf(stderr, "retry: initial res %d \n", res); \
+    if (res == 5 || res == 6) { \
+        fprintf(stderr, "retry: locked \n"); \
+        int _num_tries = 3; \
+        while (_num_tries--) { \
+            fprintf(stderr, "retry: tries left %d \n", _num_tries); \
+            if (verbosity) fprintf(stdout, "Database is locked, " \
+								   "trying again in 1 second...\n"); \
+	        sleep(1); \
+            res = operation; \
+			fprintf(stderr, "retry: res %d \n", res); \
+		} \
+        if (verbosity) fprintf(stdout, "Database is still locked, giving up.\n"); \
+	} \
+    } while (0);
 
+
 /**
  * 
  * Generic sqlite abstraction

Modified: trunk/darwinup/Depot.cpp
===================================================================
--- trunk/darwinup/Depot.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/Depot.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -145,17 +145,21 @@
 	if (writable) {
 		uid_t uid = getuid();
 		if (uid) {
-			fprintf(stderr, "You must be root to perform that operation.\n");
+			fprintf(stdout, "You must be root to perform that operation.\n");
 			exit(3);
 		}			
+		
 		res = this->create_storage();
 		if (res) return res;
-		res = this->lock(LOCK_SH);
-		if (res) return res;
-		m_is_locked = 1;
-		res = build_number_for_path(&m_build, m_prefix);
+				
+		build_number_for_path(&m_build, m_prefix);
 	}
 
+	// take an exclusive lock
+	res = this->lock(LOCK_EX);
+	if (res) return res;
+	m_is_locked = 1;			
+	
 	struct stat sb;
 	res = stat(m_database_path, &sb);
 	if (!writable && res == -1 && (errno == ENOENT || errno == ENOTDIR)) {
@@ -324,6 +328,30 @@
 	return c;
 }
 
+struct InstallContext {
+	InstallContext(Depot* d, Archive* a) {
+		depot = d;
+		archive = a;
+		files_modified = 0;
+		files_added = 0;
+		files_removed = 0;
+		files_to_remove = new SerialSet();
+		reverse_files = false;
+	}
+	
+	~InstallContext() {
+		delete files_to_remove;
+	}
+	
+	Depot* depot;
+	Archive* archive;
+	uint64_t files_modified;
+	uint64_t files_added;
+	uint64_t files_removed;
+	SerialSet* files_to_remove;	// for uninstall
+	bool reverse_files; // for uninstall
+};
+
 int Depot::iterate_archives(ArchiveIteratorFunc func, void* context) {
 	int res = 0;
 	uint32_t count = 0;
@@ -341,7 +369,8 @@
 	int res = DB_OK;
 	uint8_t** filelist;
 	uint32_t count;
-	res = this->m_db->get_files(&filelist, &count, archive);
+	bool reverse = ((InstallContext*)context)->reverse_files;
+	res = this->m_db->get_files(&filelist, &count, archive, reverse);
 	if (FOUND(res)) {
 		for (uint32_t i=0; i < count; i++) {
 			File* file = this->m_db->make_file(filelist[i]);
@@ -529,7 +558,7 @@
 				}
 			}
 
-			fprintf(stderr, "%c %s\n", state, file->path());
+			fprintf(stdout, "%c %s\n", state, file->path());
 			if (!dryrun) res = this->insert(archive, file);
 			assert(res == 0);
 			if (preceding && preceding != actual) delete preceding;
@@ -542,30 +571,6 @@
 	return res;
 }
 
-
-
-struct InstallContext {
-	InstallContext(Depot* d, Archive* a) {
-		depot = d;
-		archive = a;
-		files_modified = 0;
-		files_added = 0;
-		files_removed = 0;
-		files_to_remove = new SerialSet();
-	}
-	
-	~InstallContext() {
-		delete files_to_remove;
-	}
-	
-	Depot* depot;
-	Archive* archive;
-	uint64_t files_modified;
-	uint64_t files_added;
-	uint64_t files_removed;
-	SerialSet* files_to_remove;	// for uninstall
-};
-
 int Depot::backup_file(File* file, void* ctx) {
 	InstallContext* context = (InstallContext*)ctx;
 	int res = 0;
@@ -642,6 +647,8 @@
 	if (archive) {
 		res = this->install(archive);
 		if (res == 0) {
+			fprintf(stdout, "Installed archive: %llu %s \n", 
+					archive->serial(), archive->name());
 			uuid_unparse_upper(archive->uuid(), uuid);
 			fprintf(stdout, "%s\n", uuid);
 		} else {
@@ -651,12 +658,12 @@
 				fprintf(stderr, "Error: Unable to rollback installation. "
 						"Your system is in an inconsistent state! File a bug!\n");
 			} else {
-				fprintf(stderr, "Rollback successful.\n");
+				fprintf(stdout, "Rollback successful.\n");
 			}
 			res = 1;
 		}
 	} else {
-		fprintf(stderr, "Archive not found: %s\n", path);
+		fprintf(stdout, "Archive not found: %s\n", path);
 	}
 
 	return res;
@@ -676,7 +683,6 @@
 	assert(rollback != NULL);
 	assert(archive != NULL);
 
-	res = this->lock(LOCK_EX);
 	if (res != 0) return res;
 
 	//
@@ -715,7 +721,6 @@
 		remove_directory(rollback_path);
 		free(rollback_path);
 		free(archive_path);
-		(void)this->lock(LOCK_SH);
 		return res;
 	}
 	
@@ -768,8 +773,6 @@
 	remove_directory(rollback_path);
 	free(rollback_path);
 	free(archive_path);
-	
-	(void)this->lock(LOCK_SH);
 
 	return res;
 }
@@ -889,7 +892,7 @@
 		}
 	}
 
-	fprintf(stderr, "%c %s\n", state, file->path());
+	fprintf(stdout, "%c %s\n", state, file->path());
 
 	if (res != 0) fprintf(stderr, "%s:%d: uninstall failed: %s\n", 
 						  __FILE__, __LINE__, file->path());
@@ -938,8 +941,7 @@
 				archive->name(), archive->build(), m_build);
 		return 9999;
 	}
-	
-	res = this->lock(LOCK_EX);
+
 	if (res != 0) return res;
 
 	if (!dryrun) {
@@ -954,6 +956,7 @@
 	}
 	
 	InstallContext context(this, archive);
+	context.reverse_files = true; // uninstall children before parents
 	if (res == 0) res = this->iterate_files(archive, &Depot::uninstall_file, &context);
 	
 	if (!dryrun) {
@@ -977,8 +980,6 @@
 	
 	if (res == 0) fprintf(stdout, "Uninstalled archive: %llu %s \n",
 						  archive->serial(), archive->name());
-	
-	(void)this->lock(LOCK_SH);
 
 	return res;
 }
@@ -1197,7 +1198,7 @@
 	uint8_t** filelist;
 	uint8_t* data;
 	uint32_t count;	
-	res = this->m_db->get_files(&filelist, &count, archive);
+	res = this->m_db->get_files(&filelist, &count, archive, false);
 	if (FOUND(res)) {
 		for (uint32_t i=0; i < count; i++) {
 			File* file = this->m_db->make_file(filelist[i]);
@@ -1336,7 +1337,7 @@
 		fprintf(stderr, "Error: unknown command given to dispatch_command.\n");
 	}
 	if (res != 0) {
-		fprintf(stderr, "An error occurred.\n");
+		fprintf(stdout, "An error occurred.\n");
 	}
 	return res;
 }
@@ -1361,13 +1362,13 @@
 	
 	for (size_t i = 0; i < count; i++) {
 		if (!list[i]) {
-			fprintf(stderr, "Archive not found: %s\n", arg);
+			fprintf(stdout, "Archive not found: %s\n", arg);
 			return -1;
 		}
 		if (verbosity & VERBOSE_DEBUG) {
 			char uuid[37];
 			uuid_unparse_upper(list[i]->uuid(), uuid);
-			fprintf(stderr, "Found archive: %s\n", uuid);
+			fprintf(stdout, "Found archive: %s\n", uuid);
 		}
 		res = this->dispatch_command(list[i], command);
 		delete list[i];

Modified: trunk/darwinup/Table.cpp
===================================================================
--- trunk/darwinup/Table.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/Table.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -498,8 +498,12 @@
         } else {
             op = tmp_op;
         }
-        va_arg(args, void*);
-        if (col->type() == SQLITE_BLOB) va_arg(args, uint32_t);
+		if (col->type() == SQLITE_TEXT) va_arg(args, char*);
+        if (col->type() == SQLITE_INTEGER) va_arg(args, uint64_t);
+        if (col->type() == SQLITE_BLOB) {
+			va_arg(args, char*);
+			va_arg(args, uint32_t);
+		}
 		len = snprintf(tmpstr, 256, " AND %s%c%c?", col->name(), not_op, op);
 		if (len >= 255) {
 			fprintf(stderr, "Error: column name is too big (limit: 248): %s\n", 

Modified: trunk/darwinup/Utils.cpp
===================================================================
--- trunk/darwinup/Utils.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/Utils.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -317,6 +317,12 @@
 	char* toolpath;
 	join_path(&toolpath, base, "/usr/bin/update_dyld_shared_cache");
 
+	struct stat sb;
+	res = stat(toolpath, &sb);
+	if (res) {
+		return 1;
+	}
+		
 	const char* args[] = {
 		toolpath,
 		"-root", base,

Modified: trunk/darwinup/main.cpp
===================================================================
--- trunk/darwinup/main.cpp	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/darwinup/main.cpp	2010-03-15 21:01:42 UTC (rev 786)
@@ -104,12 +104,11 @@
 				update_dyld = false;
 				break;
 		case 'f':
-				IF_DEBUG("forcing operations\n");
 				force = 1;
 				break;
 		case 'n':
-				IF_DEBUG("dry run\n");
 				dryrun = 1;
+				update_dyld = false;
 				break;
 		case 'p':
 				if (optarg[0] != '/') {
@@ -138,8 +137,14 @@
 	
 	int res = 0;
 
+	if (dryrun) IF_DEBUG("option: dry run\n");
+	if (force)  IF_DEBUG("option: forcing operations\n");
+	if (!update_dyld) IF_DEBUG("option: not updating dyld cache\n");
+	
 	if (!path) {
 		asprintf(&path, "/");
+	} else {
+		IF_DEBUG("option: path is %s\n", path);
 	}
 
 	Depot* depot = new Depot(path);
@@ -175,7 +180,6 @@
 			if (strcmp(argv[0], "install") == 0) {
 				if (i==1 && depot->initialize(true)) exit(13);
 				res = depot->install(argv[i]);
-				if (update_dyld && res == 0) res = update_dyld_shared_cache(path);
 			} else if (strcmp(argv[0], "upgrade") == 0) {
 				if (i==1 && depot->initialize(true)) exit(14);
 				// find most recent matching archive by name
@@ -188,14 +192,12 @@
 				if (res == 0) res = depot->install(argv[i]);
 				// uninstall old archive
 				if (res == 0) res = depot->uninstall(old);
-				if (update_dyld && res == 0) res = update_dyld_shared_cache(path);
 			} else if (strcmp(argv[0], "files") == 0) {
 				if (i==1 && depot->initialize(false)) exit(12);
 				res = depot->process_archive(argv[0], argv[i]);
 			} else if (strcmp(argv[0], "uninstall") == 0) {
 				if (i==1 && depot->initialize(true)) exit(15);
 				res = depot->process_archive(argv[0], argv[i]);
-				if (update_dyld && res == 0) res = update_dyld_shared_cache(path);
 			} else if (strcmp(argv[0], "verify") == 0) {
 				if (i==1 && depot->initialize(true)) exit(16);
 				res = depot->process_archive(argv[0], argv[i]);
@@ -203,6 +205,11 @@
 				usage(progname);
 			}
 		}
+		if (update_dyld && res == 0) {
+			res = update_dyld_shared_cache(path);
+			if (res) fprintf(stderr, "Warning: could not update dyld cache.\n");
+			res = 0;
+		}		
 	}
 	
 	free(path);

Modified: trunk/testing/darwinup/run-tests.sh
===================================================================
--- trunk/testing/darwinup/run-tests.sh	2010-03-15 15:57:36 UTC (rev 785)
+++ trunk/testing/darwinup/run-tests.sh	2010-03-15 21:01:42 UTC (rev 786)
@@ -11,7 +11,7 @@
 DEST=$PREFIX/dest
 DESTTAR=dest.tar.gz
 
-DARWINUP="darwinup -dvvv -p $DEST "
+DARWINUP="darwinup $1 -p $DEST "
 DIFF="diff -x .DarwinDepot -x broken -qru"
 
 ROOTS="root root2 root3"
@@ -41,6 +41,26 @@
 mkdir -p $ORIG
 cp -R $DEST/* $ORIG/
 
+echo "========== TEST: Trying both 32 and 64 bit =========="
+for R in $ROOTS;
+do
+	echo "INFO: Installing $R ...";
+	arch -i386 $DARWINUP install $PREFIX/$R
+	UUID=$($DARWINUP list | head -3 | tail -1 | awk '{print $1}')
+	echo "INFO: Uninstalling $R ...";
+	arch -x86_64 $DARWINUP uninstall $UUID
+	echo "DIFF: diffing original test files to dest (should be no diffs) ..."
+	$DIFF $ORIG $DEST 2>&1
+	echo "INFO: Installing $R ...";
+	arch -x86_64 $DARWINUP install $PREFIX/$R
+	UUID=$($DARWINUP list | head -3 | tail -1 | awk '{print $1}')
+	echo "INFO: Uninstalling $R ...";
+	arch -i386 $DARWINUP uninstall $UUID
+	echo "DIFF: diffing original test files to dest (should be no diffs) ..."
+	$DIFF $ORIG $DEST 2>&1
+done
+
+
 echo "========== TEST: Trying roots one at a time =========="
 for R in $ROOTS;
 do
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100315/1ee9370c/attachment-0001.html>


More information about the darwinbuild-changes mailing list