[39735] branches/gsoc08-framework/MacPorts_Framework_Release
armahg at macports.org
armahg at macports.org
Mon Sep 1 17:36:04 PDT 2008
Revision: 39735
http://trac.macosforge.org/projects/macports/changeset/39735
Author: armahg at macports.org
Date: 2008-09-01 17:36:03 -0700 (Mon, 01 Sep 2008)
Log Message:
-----------
Reformated input for simplelog Tcl command. This will make it easier for MPNotifications to parse it and post approrpiate notification. Added notion of authorization modes (-setAuthorizationMode: and -authorizationMode methods) to MPMacPorts instance. This way, users can require port operations to either be run with authorization or not. Added a parentMacPortsSharedInstance ivar to MPPort. Future iterations might have a cleaner implementation but for now, it serves as the way for an MPPort instance to access its parent MPMacPorts instance
Modified Paths:
--------------
branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperNotificationsProtocol.h
branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m
branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperToolIPCTester.m
branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m
branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.h
branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.m
branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m
branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.h
branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.m
branches/gsoc08-framework/MacPorts_Framework_Release/MacPorts.Framework.xcodeproj/project.pbxproj
branches/gsoc08-framework/MacPorts_Framework_Release/interpInit.tcl
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperNotificationsProtocol.h
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperNotificationsProtocol.h 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperNotificationsProtocol.h 2008-09-02 00:36:03 UTC (rev 39735)
@@ -178,5 +178,6 @@
// the details about how I achieve this.
#define kServerSocketPath "/var/tmp/macports/org.macports.framework.ipc.socket"
+#define MPSEPARATOR @"_&MP&_"
#endif
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperTool.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -812,52 +812,71 @@
{
int returnCode = TCL_ERROR;
- //int err;
- //assert(logClient != NULL);
+ NSMutableString * data;
-// ConnectionRef iConn;
-// initIPC(iConn);
-
- //if(!globalConnInitialized){
-// initIPC(globalConn);
-// globalConnInitialized = YES;
-// }
-
-
++objv, --objc;
if (objc) {
+ int tclCount;
+ int tclResult;
+ const char **tclElements;
- const char * log = Tcl_GetString(*objv);
- NSString * data = [NSString stringWithUTF8String:log];
- [ASLLogger logString:data];
- if (notifier != nil && [notifier connected]) {
- if([notifier doShout:data])
- [ASLLogger logString:@"DoShout successful"];
- else
- [ASLLogger logString:@"DoShout unsuccessful"];
-
+
+ tclResult = Tcl_SplitList(interpreter, Tcl_GetString(*objv), &tclCount, &tclElements);
+
+
+ if (tclResult == TCL_OK) {
+ if (tclCount > 0) {
+ data = [NSMutableString stringWithUTF8String:tclElements[0]];
+ [data appendString:MPSEPARATOR];
+
+ if(tclCount > 1 && tclElements[1]) {
+ [data appendString:[NSString stringWithUTF8String:tclElements[1]]];
+ [data appendString:MPSEPARATOR];
+ }
+ else {
+ [data appendString:@"None"];
+ [data appendString:MPSEPARATOR];
+ }
+
+ if(tclCount > 2 && tclElements[2]) {
+ [data appendString:[NSString stringWithUTF8String:tclElements[2]]];
+ [data appendString:MPSEPARATOR];
+ }
+ else {
+ [data appendString:@"None"];
+ [data appendString:MPSEPARATOR];
+ }
+ }
+ else {
+ data = [NSMutableString stringWithFormat:@"None%@None%@None%@", MPSEPARATOR, MPSEPARATOR, MPSEPARATOR ];
+ }
}
- else
- [ASLLogger logString:[NSString stringWithFormat:@"notifier didn't connect has value %@", notifier]];
+ }
- //DoShout(iConn, log);
+ //Now get the actual message
+ ++objv; --objc;
+ if (objc) {
+ [data appendString:[NSString stringWithUTF8String:Tcl_GetString(*objv)]];
+ }
+ else {
+ [data appendString:@"None"];
+ }
- //err = asl_NSLog(logClient , logMsg, ASL_LEVEL_INFO, @"MPHelperTool: %@ " , data);
-// if (globalConn != NULL) {
-// //DoShout(globalConn, log);
-// }
-// else {
-// [ASLLogger logString:[NSString stringWithFormat:@"globalConn is NULL on message %@",log]];
-// }
- //assert(err == 0);
- returnCode = TCL_OK;
- }
+ if (data != nil) {
+ //[ASLLogger logString:data];
+ if (notifier != nil && [notifier connected]) {
+ if([notifier doShout:data]) {
+ returnCode = TCL_OK;
+ [ASLLogger logString:@"DoShout successful"];
+ }
+ else
+ [ASLLogger logString:@"DoShout unsuccessful"];
+ }
+ else
+ [ASLLogger logString:[NSString stringWithFormat:@"notifier didn't connect has value %@", notifier]];
+ }
- //ConnectionClose(iConn);
- //DoQuit(iConn);
-
- //asl_close(logClient);
return returnCode;
}
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperToolIPCTester.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperToolIPCTester.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPHelperToolIPCTester.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -17,9 +17,21 @@
}
-(BOOL) installUninstallManipulation:(NSString *)portName;
+-(BOOL) selfUpdate;
@end
@implementation PortManipulator
+-(BOOL) selfUpdate {
+ NSError *err = nil;
+ [[MPMacPorts sharedInstance] selfUpdate:&err];
+
+ if( err != nil) {
+ NSLog(@"%@", [err description]);
+ return NO;
+ }
+ return YES;
+}
+
-(BOOL) installUninstallManipulation:(NSString *)portName {
BOOL ret = NO;
@@ -92,8 +104,9 @@
@end
int main(int argc, char const * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ //NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ [[MPMacPorts sharedInstance] setAuthorizationMode:YES];
PortManipulator * pm = [[PortManipulator alloc] init];
@@ -104,12 +117,19 @@
NSLog(@"pngcrush INSTALLATION UNSUCCESSFUL");
}
+ if([pm selfUpdate]) {
+ NSLog(@"SELFUPDATE SUCCESSFUL");
+ }
+ else {
+ NSLog(@"SELFUPDATE UNSUCCESSFUL");
+ }
+
[pm release];
- [pool release];
+ //[pool release];
return 0;
}
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPInterpreter.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -80,7 +80,7 @@
if (tclResult == TCL_OK) {
//I have sacrificed generality for simplicity in the code below
- if (tclElements > 0) {
+ if (tclCount > 0) {
[info setObject:[NSString stringWithUTF8String:tclElements[0]] forKey:MPCHANNEL];
if(tclElements[1])
@@ -116,7 +116,7 @@
//NSLog(@"Class type is %@", NSStringFromClass([[cmd objectAtIndex:0] class]));
if( [[cmd objectAtIndex:0] isEqualToString:@"YES"]) {
- [info setObject:[cmd objectAtIndex:1] forKey:@"Function"];
+ [info setObject:[cmd objectAtIndex:1] forKey:MPMETHOD];
}
}
}
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.h
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.h 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.h 2008-09-02 00:36:03 UTC (rev 39735)
@@ -72,6 +72,7 @@
NSString *version;
id macportsDelegate;
+ BOOL authorizationMode;
}
@@ -198,7 +199,25 @@
*/
- (void)setDelegate:(id)delegate;
+/*!
+ @brief Determines whether certain port operations require privileges before exection
+ @param mode A YES value will require privileges whereas a NO value will not require privileges.
+ @Discussion Use this method to indicate whether port operations should be
+ run with privilieges. The default behavior is to not run these port operations with
+ privileges. Operations affected by this setting include -sync, -selfUpdate, all variants
+ of the -exec method and all of MPPort's port manipulation methods.
+ */
+-(void) setAuthorizationMode:(BOOL)mode;
+/*! Returns a BOOL that indicates whether or not port operations are to be run with privileges
+ @Discussion You can use this method in conjuction with -setAuthorizationMode: to set and unset
+ the authorization mode for this MPMacPorts object. A return value of YES means that the -sync,
+ -selfUpdate, all variants of the -exec method and all of MPPort's port manipulation methods
+ require privileges;a return value of NO indicates that they don't.
+ */
+-(BOOL) authorizationMode;
+
+
//Notifications stuff for private use and testing purposes
-(void)registerForLocalNotifications;
-(void)respondToLocalNotification:(NSNotification *) notification;
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPMacPorts.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -110,7 +110,10 @@
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"MacPorts_sync_Started" object:nil];
[[MPNotifications sharedListener] setPerformingTclCommand:@"YES_sync"];
- result = [interpreter evaluateStringWithPossiblePrivileges:@"mportsync" error:sError];
+ if ([self authorizationMode])
+ result = [interpreter evaluateStringWithMPHelperTool:@"mportsync" error:sError];
+ else
+ result = [interpreter evaluateStringWithPossiblePrivileges:@"mportsync" error:sError];
[[MPNotifications sharedListener] setPerformingTclCommand:@""];
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"MacPorts_sync_Finished" object:nil];
@@ -123,7 +126,10 @@
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"MacPorts_selfupdate_Started" object:nil];
[[MPNotifications sharedListener] setPerformingTclCommand:@"YES_selfUpdate"];
- [interpreter evaluateStringWithPossiblePrivileges:@"macports::selfupdate" error:sError];
+ if([self authorizationMode])
+ [interpreter evaluateStringWithMPHelperTool:@"macports::selfupdate" error:sError];
+ else
+ [interpreter evaluateStringWithPossiblePrivileges:@"macports::selfupdate" error:sError];
[[MPNotifications sharedListener] setPerformingTclCommand:@""];
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"MacPorts_selfupdate_Finished" object:nil];
@@ -230,6 +236,14 @@
return version;
}
+-(void) setAuthorizationMode:(BOOL)mode {
+ authorizationMode = mode;
+}
+
+-(BOOL) authorizationMode {
+ return authorizationMode;
+}
+
#pragma mark -
#pragma mark Delegate Methods
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPNotifications+IPCAdditions.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -810,7 +810,7 @@
CFIndex clientCount;
CFIndex clientIndex;
- fprintf(stderr, "%p: Shout \"%.*s\"\n", client, (int) sizeof(packet->fMessage), packet->fMessage);
+ //fprintf(stderr, "%p: Shout \"%.*s\"\n", client, (int) sizeof(packet->fMessage), packet->fMessage);
NSString * shout = [NSString stringWithCString:packet->fMessage encoding:NSUTF8StringEncoding];
NSLog(@"CLIENT SHOUT BEING CALLED (YAAAY!!) : %@" , shout);
@@ -913,7 +913,7 @@
//loop running. For now i'm not synchronizing variable access since the
//worst that could happen is that the server is late in reading a chaged
//value update
- clientHasQuit = 1;
+ //clientHasQuit = 1;
}
return result;
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.h
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.h 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.h 2008-09-02 00:36:03 UTC (rev 39735)
@@ -48,6 +48,7 @@
+
#define MPPortStateUnknown 0
#define MPPortStateLearnState 1
@@ -58,6 +59,9 @@
#define MPPortWillExecuteTarget @"org.macports.framework.port.willExecuteTarget"
#define MPPortDidExecuteTarget @"org.macports.framework.port.didExecuteTarget"
+
+ at class MPMacPorts;
+
/*!
@class MPPort
@abstract A representation of a port.
@@ -67,6 +71,8 @@
//Maybe we should have a single MPInterpreter *interpreter and use that
//throughout the code? Ask Randall whether or not it was intentional
//to declare new variable for each method
+
+ MPMacPorts * parentMacPortsInstance;
}
/*!
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.m
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.m 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MPPort.m 2008-09-02 00:36:03 UTC (rev 39735)
@@ -38,10 +38,20 @@
@implementation MPPort
+// Each of the init methods sets the parent MPMacPorts object for this MPPort object
+// if it hasn't already been set. We are assuming that this MPPort object and its
+// parent MPMacPort object would have been created in the same thread. That might
+// not have been the case. I should make a note of that in the release notes and
+// also add some more sane changes later for a closer coupling of an MPMacPorts
+// object and its associated MPPort objects.
+
- (id)init {
self = [super initWithCapacity:15];
if (self != nil) {
[self setState:MPPortStateUnknown];
+ if (parentMacPortsInstance != nil)
+ parentMacPortsInstance = [MPMacPorts sharedInstance];
+
}
return self;
}
@@ -50,6 +60,8 @@
self = [super initWithCapacity:numItems];
if (self != nil) {
[self setState:MPPortStateUnknown];
+ if (parentMacPortsInstance != nil)
+ parentMacPortsInstance = [MPMacPorts sharedInstance];
}
return self;
}
@@ -59,6 +71,8 @@
if (self != nil) {
[self setState:MPPortStateUnknown];
[self setPortWithTclListAsString:string];
+ if (parentMacPortsInstance != nil)
+ parentMacPortsInstance = [MPMacPorts sharedInstance];
}
return self;
}
@@ -182,11 +196,21 @@
NSString * tclCmd = [@"YES_" stringByAppendingString:procedure];
[[MPNotifications sharedListener] setPerformingTclCommand:tclCmd];
- [interpreter evaluateStringWithPossiblePrivileges:
- [NSString stringWithFormat:
- @"%@ %@ %@ %@" ,
- procedure, [self name], v, opts]
- error:execError];
+ if ([parentMacPortsInstance authorizationMode]) {
+ [interpreter evaluateStringWithMPHelperTool:
+ [NSString stringWithFormat:
+ @"%@ %@ %@ %@" ,
+ procedure, [self name], v, opts]
+ error:execError];
+
+ }
+ else {
+ [interpreter evaluateStringWithPossiblePrivileges:
+ [NSString stringWithFormat:
+ @"%@ %@ %@ %@" ,
+ procedure, [self name], v, opts]
+ error:execError];
+ }
[[MPNotifications sharedListener] setPerformingTclCommand:@""];
[self sendGlobalExecNotification:procedure withStatus:@"Finished"];
@@ -217,12 +241,23 @@
NSString * tclCmd = [@"YES_" stringByAppendingString:target];
[[MPNotifications sharedListener] setPerformingTclCommand:tclCmd];
- [interpreter evaluateStringWithPossiblePrivileges:
- [NSString stringWithFormat:
- @"set portHandle [mportopen %@ %@ %@]; mportexec $portHandle %@; mportclose $portHandle",
- [self valueForKey:@"porturl"], opts, vrnts, target]
- error:execError];
+ if ([parentMacPortsInstance authorizationMode]) {
+ [interpreter evaluateStringWithMPHelperTool:
+ [NSString stringWithFormat:
+ @"set portHandle [mportopen %@ %@ %@]; mportexec $portHandle %@; mportclose $portHandle",
+ [self valueForKey:@"porturl"], opts, vrnts, target]
+ error:execError];
+ }
+ else {
+ [interpreter evaluateStringWithPossiblePrivileges:
+ [NSString stringWithFormat:
+ @"set portHandle [mportopen %@ %@ %@]; mportexec $portHandle %@; mportclose $portHandle",
+ [self valueForKey:@"porturl"], opts, vrnts, target]
+ error:execError];
+ }
+
+
[[MPNotifications sharedListener] setPerformingTclCommand:@""];
[self sendGlobalExecNotification:target withStatus:@"Finished"];
@@ -253,9 +288,15 @@
}
}
+ if( [parentMacPortsInstance authorizationMode] ) {
+ [interpreter evaluateStringWithMPHelperTool:[NSString stringWithFormat:@"[%@ %@]" , procedure, sparams]
+ error:execError];
+ }
+ else {
+ [interpreter evaluateStringAsString:[NSString stringWithFormat:@"[%@ %@]" , procedure, sparams]
+ error:execError];
+ }
- [interpreter evaluateStringAsString:[NSString stringWithFormat:@"[%@ %@]" , procedure, sparams]
- error:execError];
}
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/MacPorts.Framework.xcodeproj/project.pbxproj
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/MacPorts.Framework.xcodeproj/project.pbxproj 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/MacPorts.Framework.xcodeproj/project.pbxproj 2008-09-02 00:36:03 UTC (rev 39735)
@@ -782,6 +782,7 @@
buildSettings = {
ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
DEBUG_INFORMATION_FORMAT = stabs;
+ GCC_ENABLE_OBJC_GC = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH)";
@@ -796,6 +797,7 @@
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
+ GCC_ENABLE_OBJC_GC = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
@@ -930,9 +932,12 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
+ ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "ppc i386 ppc64 x86_64";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_ENABLE_OBJC_GC = required;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
@@ -946,6 +951,7 @@
);
PREBINDING = NO;
PRODUCT_NAME = MPHelperToolIPCTester;
+ SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
};
name = Debug;
};
@@ -953,9 +959,12 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
+ ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "ppc i386 ppc64 x86_64";
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_ENABLE_OBJC_GC = required;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
@@ -968,6 +977,7 @@
);
PREBINDING = NO;
PRODUCT_NAME = MPHelperToolIPCTester;
+ SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
ZERO_LINK = NO;
};
name = Release;
Modified: branches/gsoc08-framework/MacPorts_Framework_Release/interpInit.tcl
===================================================================
--- branches/gsoc08-framework/MacPorts_Framework_Release/interpInit.tcl 2008-09-01 22:33:08 UTC (rev 39734)
+++ branches/gsoc08-framework/MacPorts_Framework_Release/interpInit.tcl 2008-09-02 00:36:03 UTC (rev 39735)
@@ -116,8 +116,7 @@
set nbchans [llength $channels]
if {$nbchans == 0} {
proc ::ui_$priority {str} [subst {
- puts stdout "\$str"
- simplelog "\$str"
+ simplelog "$nottype $chan $prefix" "\$str"
}]
} else {
try {
@@ -133,13 +132,13 @@
proc ::ui_$priority {str} [subst {
puts $chan "$prefix\$str"
- simplelog "$prefix\$str"
+ simplelog "$nottype $chan $prefix" "\$str"
}]
} else {
proc ::ui_$priority {str} [subst {
foreach chan \$channels {
puts $chan "$prefix\$str"
- simplelog "$prefix\$str"
+ simplelog "$nottype $chan $prefix" "\$str"
}
}]
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20080901/9c4a3ead/attachment.html
More information about the macports-changes
mailing list