[darwinbuild-dev] How to find build version difference

Kevin Van Vechten kvv at apple.com
Wed Jan 9 11:22:01 PST 2008


This is looking good, and I'm happy to see you contribute code to the  
project.  As an optimization, we can take advantage of the fact that  
DBCopyProjectNames() returns a sorted list to detect missing projects  
in either build in a single pass (pseudo code below).  By comparing in  
this way, we don't need to do the extra merge and sort found in  
get_project names, and we don't have to do as many database lookups to  
see if the project really exists in that build.

On a different topic, it's easiest for us to accept your contributions  
if you place a license header (preferably the same BSD-style license  
DarwinBuild already uses) and your copyright on the top of the file.   
Believe it or not, that's more straightforward than simply saying the  
code is free to use.

Thanks,

- Kevin

alist = DBCopyProjectNames(abuild);
blist = DBCopyProjectNames(bbuild);

int i = 0, j = 0;

for (;;) {
	CFStringRef a = CFArrayGetValueAtIndex(alist, i);
	CFStringRef b = CFArrayGetValueAtIndex(blist, j);

	CFComparisonResult res = CFStringCompare(a,b,0);

	if (res == kCFCompareEqualTo) {
		// both builds have the same project, let's compare versions

		av = DBCopyPropString(abuild, a, CFSTR("version"));
		bv = DBCopyPropString(bbuild, b, CFSTR("version"));
		res = CFStringCompare(av,bv,0);
		if (res == kCFStringCompareEqualTo) {
			print "same";
		} else {
			print "different";
		}

		// move both lists to next project
		++i;
		++j;		

	} else if (res == kCFCompareLessThan) {
		// a fell behind b, which means b is missing a project

		print "project A only in build A";

		// only increment a, so that it catches up to b
		++i;
	} else if (res == kCFCompareGreaterThan) {
		// a got ahead of b, which means a is missing a project

		print "project B only in build B";

		// only increment b, so that it catches up to a
		++j;
	}
	
	// we're done if we reach the end of both lists, otherwise
	// make sure we don't march past the end of one
	if (i >= acount && j >= bcount) break;
	else if (i >= acount) i = acount -1;
	else if (j >= bcount) j = bcount -1;
}


On Jan 8, 2008, at 6:22 PM, Michael Franz wrote:

> Kevin,
>
> thanks for the input.  I had already figured out that I was not
> getting the correct information from the plists.  I was only get the
> project plist which was missing inherited projects.  I have changed it
> to use code from the version plugin instead.
>
> On 1/8/08, Kevin Van Vechten <kvv at apple.com> wrote:
>> Michael's plugin is a good start, however copying the whole Build
>> plist (with all project attributes) to inspect it is a rather
>> heavyweight process.  It's possible to use the plugin API to search
>> the data in the sqlite database.  The use of this API also answers  
>> the
>> question below.
>>
>> On Jan 7, 2008, at 7:45 PM, Michael Franz wrote:
>>
>>> I found a slight bug in my implementation.  I do not use a complete
>>> set of project names, so, when the src build has many more projects
>>> than the destination the diff is incorrect.  I am currently  
>>> looking at
>>> a way to create a set of the two build project names.  This way I  
>>> will
>>> have a complete set of all projects in both builds.
>>
>> CFArrayRef DBCopyProjectNames(CFStringRef build);
>>
> Using this instead as stated above.
>
>> This function returns an array of all projects in the given build
>> (including inherited projects).  I believe this is already sorted,  
>> but
>> I'm not 100% sure.
>>
>> There's also the following function which you might be interested in:
>>
>> CFArrayRef DBCopyChangedProjectNames(CFStringRef oldbuild,  
>> CFStringRef
>> newbuild);
>>
> I 'll look into that function.
>
>> Also it's not clear to me why DBSetPlist() is called at the end... I
>> don't think of "diff" as a mutagenic operation.
> That was a line that I did not delete - it is from mergeBuild.
>
> I have removed it, as I also found it earlier and couldn't understand
> why it was there.
>>
>> - Kevin
>>
>
> Here is a (almost) rewritten version of the plugin.
>
> Michael
> <diff.c>



More information about the darwinbuild-dev mailing list