[darwinbuild-changes] [356] trunk/darwinxref/plugins/resolveDeps.c

source_changes at macosforge.org source_changes at macosforge.org
Mon Nov 12 22:14:11 PST 2007


Revision: 356
          http://trac.macosforge.org/projects/darwinbuild/changeset/356
Author:   kvv at apple.com
Date:     2007-11-12 22:14:10 -0800 (Mon, 12 Nov 2007)

Log Message:
-----------
more robust dependency resolution logic

Modified Paths:
--------------
    trunk/darwinxref/plugins/resolveDeps.c

Modified: trunk/darwinxref/plugins/resolveDeps.c
===================================================================
--- trunk/darwinxref/plugins/resolveDeps.c	2007-11-13 06:07:42 UTC (rev 355)
+++ trunk/darwinxref/plugins/resolveDeps.c	2007-11-13 06:14:10 UTC (rev 356)
@@ -43,11 +43,11 @@
 	char* project = NULL;
 	int commit = 0;
 
-	if(count == 1) {
+	if (count == 1) {
 	  project = strdup_cfstr(CFArrayGetValueAtIndex(argv, 0));
 	} else if (count > 1) {
 	  project = strdup_cfstr(CFArrayGetValueAtIndex(argv, 1));
-	  if(CFEqual(CFSTR("-commit"), CFArrayGetValueAtIndex(argv, 0)))
+	  if (CFEqual(CFSTR("-commit"), CFArrayGetValueAtIndex(argv, 0)))
 	    commit = 1;
 	}
 
@@ -85,11 +85,6 @@
 	CFMutableArrayRef types = CFArrayCreateMutable(NULL, 0, &cfArrayCStringCallBacks);
 	CFMutableArrayRef params[2] = { files, types };
 
-	CFMutableDictionaryRef finalDeps = CFDictionaryCreateMutable(NULL, 0,
-								     &kCFCopyStringDictionaryKeyCallBacks,
-								     &kCFTypeDictionaryValueCallBacks);
-
-
         char* table = "CREATE TABLE dependencies (build TEXT, project TEXT, type TEXT, dependency TEXT)";
         char* index = "CREATE INDEX dependencies_index ON unresolved_dependencies (build, project, type, dependency)";
 
@@ -98,6 +93,8 @@
 
 	if (SQL("BEGIN")) { return -1; }
 
+	// Convert from unresolved_dependencies (i.e. path names) to resolved dependencies (i.e. project names)
+	// Deletes unresolved_dependencies after they are processed.
 	SQL_CALLBACK(&addToCStrArrays, params,
 		"SELECT DISTINCT dependency,type FROM unresolved_dependencies WHERE build=%Q AND project=%Q",
 		build, project);
@@ -121,38 +118,60 @@
 			}
 			SQL("DELETE FROM unresolved_dependencies WHERE build=%Q AND project=%Q AND type=%Q AND dependency=%Q",
 				build, project, type, file);
-			if(commit) {
-			  // find subarray for this dep type
-			  CFStringRef cfdep = cfstr(type);
-			  CFStringRef cfval = cfstr(dep);
-			  CFMutableArrayRef deparray = (CFMutableArrayRef)CFDictionaryGetValue(finalDeps, cfdep);
-			  if(deparray == NULL) {
-			    deparray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
-			    CFDictionarySetValue(finalDeps, cfdep, deparray);
-			    CFRelease(deparray); // still retained by dict
-			  }
-			  if(!CFArrayContainsValue(deparray,
-						   CFRangeMake(0, CFArrayGetCount(deparray)),
-						   cfval)) {
-			    CFArrayAppendValue(deparray, cfval);
-			  }
-			  CFRelease(cfdep);
-			  CFRelease(cfval);
-			}
 		} else {
 			*unresolvedCount += 1;
 		}
 	}
 
-	if(commit) {
-	  DBSetProp(cfstr(build), cfstr(project), CFSTR("dependencies"), finalDeps);
+	CFRelease(files);
+	CFRelease(types);
+
+	// If committing, merge resolved dependencies to the dependencies property dictionary.
+	// Deletes resolved dependencies after they are processed.
+	if (commit) {
+		CFMutableArrayRef types = CFArrayCreateMutable(NULL, 0, &cfArrayCStringCallBacks);
+		CFMutableArrayRef projs = CFArrayCreateMutable(NULL, 0, &cfArrayCStringCallBacks);
+		CFMutableArrayRef params[2] = { projs, types };
+		CFMutableDictionaryRef dependencies = (CFMutableDictionaryRef)DBCopyPropDictionary(cfstr(build), cfstr(project), CFSTR("dependencies"));
+		if (dependencies == NULL) {
+			dependencies = CFDictionaryCreateMutable(NULL, 0,
+								     &kCFCopyStringDictionaryKeyCallBacks,
+								     &kCFTypeDictionaryValueCallBacks);
+		}
+		
+		SQL_CALLBACK(&addToCStrArrays, params,
+			"SELECT DISTINCT dependency,type FROM dependencies WHERE build=%Q AND project=%Q",
+			build, project);
+		
+		CFIndex i, count = CFArrayGetCount(projs);
+		for (i = 0; i < count; ++i) {
+			CFStringRef proj = cfstr(CFArrayGetValueAtIndex(projs, i));
+			CFStringRef type = cfstr(CFArrayGetValueAtIndex(types, i));
+			
+			CFMutableArrayRef deparray = (CFMutableArrayRef)CFDictionaryGetValue(dependencies, type);
+			if (deparray == NULL) {
+				deparray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+				CFDictionarySetValue(dependencies, type, deparray);
+				CFRelease(deparray); // still retained by dict
+			}
+			if (!CFArrayContainsValue(deparray,
+							CFRangeMake(0, CFArrayGetCount(deparray)),
+							proj)) {
+				CFArrayAppendValue(deparray, proj);
+			}
+			CFRelease(proj);
+			CFRelease(type);
+		}
+		
+		DBSetProp(cfstr(build), cfstr(project), CFSTR("dependencies"), dependencies);
+		CFRelease(dependencies);
+		CFRelease(types);
+		CFRelease(projs);
+
+		SQL("DELETE FROM dependencies WHERE build=%Q AND project=%Q", build, project);
 	}
 
 	if (SQL("COMMIT")) { return -1; }
-	
-	CFRelease(finalDeps);
-	CFRelease(files);
-	CFRelease(types);
 }
 
 int resolve_dependencies(const char* build, const char* project, int commit) {

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20071112/8dc9a91e/attachment.html


More information about the darwinbuild-changes mailing list