adium 4075:566837fb8868: Multi-Nightly Support
commits at adium.im
commits at adium.im
Wed Jul 27 09:27:43 UTC 2011
details: http://hg.adium.im/adium/rev/566837fb8868
revision: 4075:566837fb8868
branch: (none)
author: Adrian Godoroja <robotive at me.com>
date: Wed Jul 27 11:50:16 2011 +0300
Multi-Nightly Support
Subject: adium 4076:353c10aa7ce2: Multi-Nightly Support (this made my day)
details: http://hg.adium.im/adium/rev/353c10aa7ce2
revision: 4076:353c10aa7ce2
branch: (none)
author: Adrian Godoroja <robotive at me.com>
date: Wed Jul 27 12:26:25 2011 +0300
Multi-Nightly Support (this made my day)
diffs (564 lines):
diff -r 732390b9b84a -r 353c10aa7ce2 Frameworks/AIUtilities Framework/Source/AIDictionaryAdditions.m
--- a/Frameworks/AIUtilities Framework/Source/AIDictionaryAdditions.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Frameworks/AIUtilities Framework/Source/AIDictionaryAdditions.m Wed Jul 27 12:26:25 2011 +0300
@@ -22,43 +22,6 @@
#import "AIFileManagerAdditions.h"
#import "AISharedWriterQueue.h"
- at interface AIWriteDictionaryOperation : NSOperation
-{
- NSString *path;
- NSString *name;
- NSDictionary *dict;
-}
-
-- (AIWriteDictionaryOperation *)initWithPath:(NSString *)path name:(NSString *)s dictionary:(NSDictionary *)dict;
-
- at end
-
- at implementation AIWriteDictionaryOperation
-- (AIWriteDictionaryOperation *)initWithPath:(NSString *)p name:(NSString *)s dictionary:(NSDictionary *)d
-{
- if ((self = [super init]))
- {
- path = [p retain];
- dict = [d retain];
- name = [s retain];
- }
- return self;
-}
-
-- (void) dealloc
-{
- [name release];
- [dict release];
- [path release];
- [super dealloc];
-}
-
-- (void) main
-{
- [dict writeToPath:path withName:name];
-}
- at end
-
@implementation NSDictionary (AIDictionaryAdditions)
// Returns a dictionary from the owners bundle with the specified name
@@ -159,8 +122,9 @@
NSParameterAssert(path != nil); NSParameterAssert([path length] != 0);
NSParameterAssert(name != nil); NSParameterAssert([name length] != 0);
- AIWriteDictionaryOperation *op = [[[AIWriteDictionaryOperation alloc] initWithPath:path name:name dictionary:self] autorelease];
- [AISharedWriterQueue addOperation:op];
+ [AISharedWriterQueue addOperation:^{
+ [self writeToPath:path withName:name];
+ }];
}
- (NSDictionary *)dictionaryByTranslating:(NSDictionary *)translation adding:(NSDictionary *)addition removing:(NSSet *)removal
diff -r 732390b9b84a -r 353c10aa7ce2 Frameworks/AIUtilities Framework/Source/AIHostReachabilityMonitor.m
--- a/Frameworks/AIUtilities Framework/Source/AIHostReachabilityMonitor.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Frameworks/AIUtilities Framework/Source/AIHostReachabilityMonitor.m Wed Jul 27 12:26:25 2011 +0300
@@ -20,12 +20,9 @@
#import <arpa/inet.h>
#import <netdb.h>
#import <netinet/in.h>
-#import <libkern/OSAtomic.h>
#define CONNECTIVITY_DEBUG FALSE
-static AIHostReachabilityMonitor *sharedMonitor = nil;
-
@interface AIHostReachabilityMonitor ()
- (void)scheduleReachabilityMonitoringForHost:(NSString *)nodename observer:(id)observer;
- (void)gotReachabilityRef:(SCNetworkReachabilityRef)reachabilityRef forHost:(NSString *)host observer:(id)observer;
@@ -50,11 +47,11 @@
*/
+ (id)defaultMonitor
{
- if (!sharedMonitor) {
- AIHostReachabilityMonitor *newMonitor = [[AIHostReachabilityMonitor alloc] init];
- if(!OSAtomicCompareAndSwapPtrBarrier(nil, newMonitor, (void *)&sharedMonitor))
- [newMonitor release];
- }
+ static AIHostReachabilityMonitor *sharedMonitor;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ sharedMonitor = [[AIHostReachabilityMonitor alloc] init];
+ });
return sharedMonitor;
}
diff -r 732390b9b84a -r 353c10aa7ce2 Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.h
--- a/Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.h Tue Jul 26 23:56:35 2011 +0200
+++ b/Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.h Wed Jul 27 12:26:25 2011 +0300
@@ -15,6 +15,6 @@
*/
@interface AISharedWriterQueue : NSObject {}
-+ (void) addOperation:(NSOperation *)op;
++ (void) addOperation:(dispatch_block_t)op;
+ (void) waitUntilAllOperationsAreFinished;
@end
diff -r 732390b9b84a -r 353c10aa7ce2 Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.m
--- a/Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Frameworks/AIUtilities Framework/Source/AISharedWriterQueue.m Wed Jul 27 12:26:25 2011 +0300
@@ -14,37 +14,25 @@
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "AISharedWriterQueue.h"
-#import <libkern/OSAtomic.h>
-#import "AIApplicationAdditions.h"
-
- at interface AISharedWriterQueue()
-+ (NSOperationQueue *)queue;
- at end
@implementation AISharedWriterQueue
-+ (void) addOperation:(NSOperation *)op {
- [[self queue] addOperation:op];
-}
-
-+ (void) waitUntilAllOperationsAreFinished {
- [[self queue] waitUntilAllOperationsAreFinished];
-}
-
-+ (NSOperationQueue *)queue {
- static NSOperationQueue *sharedWriterQueue = nil;
-
-
- if (!sharedWriterQueue) {
- NSOperationQueue *newWriterQueue = [[NSOperationQueue alloc] init];
- if(!OSAtomicCompareAndSwapPtrBarrier(nil, newWriterQueue, (void *)&sharedWriterQueue))
- [newWriterQueue release];
-
- [sharedWriterQueue setMaxConcurrentOperationCount:1];
- [sharedWriterQueue setName:@"AISharedWriterQueue"];
- }
+static inline dispatch_queue_t queue() {
+ static dispatch_queue_t sharedWriterQueue = nil;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ sharedWriterQueue = dispatch_queue_create("com.adium.sharedAsyncIOQueue", 0);
+ });
return sharedWriterQueue;
}
++ (void) addOperation:(dispatch_block_t)op {
+ dispatch_async(queue(), op);
+}
+
++ (void) waitUntilAllOperationsAreFinished {
+ dispatch_sync(queue(), ^{});
+}
+
@end
diff -r 732390b9b84a -r 353c10aa7ce2 Release/Makefile
--- a/Release/Makefile Tue Jul 26 23:56:35 2011 +0200
+++ b/Release/Makefile Wed Jul 27 12:26:25 2011 +0300
@@ -24,6 +24,8 @@
# Always builds in debug mode.
NIGHTLY?=FALSE
+NIGHTLY_REPO?=adium #change to adium-1.4 on the 1.4 branch
+NIGHTLY_BRANCH?=default
###########
# To release!
@@ -117,9 +119,13 @@
version:
@# update the plists
- defaults write $(ADIUM_PLIST) CFBundleGetInfoString "$(VERSION), Copyright 2001-2011 The Adium Team"
+ defaults write $(ADIUM_PLIST) CFBundleGetInfoString "$(VERSION), Copyright 2001-$(shell date +"%Y") The Adium Team"
defaults write $(ADIUM_PLIST) CFBundleVersion "$(VERSION)"
defaults write $(ADIUM_PLIST) CFBundleShortVersionString "$(VERSION)"
+ifeq ($(NIGHTLY),TRUE)
+ defaults write $(ADIUM_PLIST) AINightlyRepo "$(NIGHTLY_REPO)"
+ defaults write $(ADIUM_PLIST) AINightlyBranch "$(NIGHTLY_BRANCH)"
+end
plutil -convert xml1 $(ADIUM_PLIST).plist
compile:
@@ -144,10 +150,10 @@
ifeq ($(BUILD_IN_DEBUG_MODE),FALSE)
find $(BUILD_DIR) \( -name classes.nib -or -name info.nib -or -name designable.nib \) -type f -delete
endif
-
+
@# delete backup files
find $(BUILD_DIR) \( -name "*~" -or -name .DS_Store \) -type f -delete
-
+
@# delete header files
find $(BUILD_DIR) \( -name "*.h" \) -type f -delete
@@ -165,14 +171,14 @@
mkdir $(BUILD_DIR)
mkdir $(ADIUM_DIR)
-
+
@# copy the app
cp -R "$(ADIUM_BUILD_DIR)/Adium.app" $(ADIUM_DIR)
@# copy the text files
cp $(SRC_DIR)/ChangeLogs/Changes.txt $(ADIUM_DIR)
cp $(SRC_DIR)/License.txt $(ADIUM_DIR)
-
+
@# symlink /Applications
./mkalias -r /Applications $(ADIUM_DIR)/Applications
@@ -184,7 +190,7 @@
./ensureCustomIconsExtracted $(ART_DIR)
./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_NAME).dmg $(ADIUM_DIR) "Adium $(VERSION)" dmg_adium.scpt $(ART_DIR)
-
+
ifeq ($(OFFICIAL_BUILD),TRUE)
@echo DSA for Sparkle: `ruby sign_update.rb $(BUILD_DIR)/$(RELEASE_NAME_ESCAPED).dmg ~/adium-dsa-sign/dsa_priv.pem`
endif
@@ -208,4 +214,4 @@
cd $(BUILD_DIR) && tar zcf $(RELEASE_NAME).tgz Adium*/ && cd ..
tarball:
- hg archive -t tgz ($TARBALL_DIR).tgz
+ hg archive -t tgz ($TARBALL_DIR).tgz
\ No newline at end of file
diff -r 732390b9b84a -r 353c10aa7ce2 Release/upload-nightly.sh
--- a/Release/upload-nightly.sh Tue Jul 26 23:56:35 2011 +0200
+++ b/Release/upload-nightly.sh Wed Jul 27 12:26:25 2011 +0300
@@ -1,6 +1,6 @@
#!/bin/bash
-# You need to set NIGHTLY_HOST and NIGHTLY_USER in environment, and have your
+# You need to set NIGHTLY_HOST, NIGHTLY_USER, NIGHTLY_REPO, and NIGHTLY_BRANCH in environment, and have your
# public key in the authorized_keys file on the nightly server.
# Set our working directory to be the parent of this script, in case we're run
@@ -9,6 +9,6 @@
cd ${PARENT:-.}
ADIUM_RELEASE_NAME=`head -n 1 build/latest.info | tail -n 1`
-scp build/latest.info build/${ADIUM_RELEASE_NAME}.dmg.md5 build/${ADIUM_RELEASE_NAME}.dmg ${NIGHTLY_USER}@${NIGHTLY_HOST}:
+scp build/latest.info build/${ADIUM_RELEASE_NAME}.dmg.md5 build/${ADIUM_RELEASE_NAME}.dmg ${NIGHTLY_USER}@${NIGHTLY_HOST}:${NIGHTLY_REPO}-${NIGHTLY_BRANCH}
ssh ${NIGHTLY_USER}@${NIGHTLY_HOST} chmod go+r ${ADIUM_RELEASE_NAME}.dmg latest.info ${ADIUM_RELEASE_NAME}.dmg.md5
diff -r 732390b9b84a -r 353c10aa7ce2 Source/AIAdium.m
--- a/Source/AIAdium.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Source/AIAdium.m Wed Jul 27 12:26:25 2011 +0300
@@ -1059,7 +1059,11 @@
[profileInfo addObject:UPDATE_TYPE_DICT];
#ifdef NIGHTLY_RELEASE
NSString *buildId = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AIBuildIdentifier"];
+ NSString *nightlyRepo = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AINightlyRepo"];
+ NSString *nightlyBranch = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AINightlyBranch"];
[profileInfo addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"revision", @"key", @"Revision", @"visibleKey", buildId, @"value", buildId, @"visibleValue", nil]];
+ [profileInfo addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"repo", @"key", nightlyRepo, @"value", nil]];
+ [profileInfo addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"branch", @"key", nightlyBranch, @"value", nil]];
#endif
if (sendProfileInfo) {
diff -r 732390b9b84a -r 353c10aa7ce2 Source/AILogViewerWindowController.m
--- a/Source/AILogViewerWindowController.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Source/AILogViewerWindowController.m Wed Jul 27 12:26:25 2011 +0300
@@ -136,14 +136,13 @@
+ (NSOperationQueue *)sharedLogViewerQueue
{
static NSOperationQueue *logViewerQueue = nil;
- if(!logViewerQueue) {
- NSOperationQueue *newQueue = [[NSOperationQueue alloc] init];
- if(!OSAtomicCompareAndSwapPtrBarrier(nil, newQueue, (void *)&logViewerQueue))
- [newQueue release];
-
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ logViewerQueue = [[NSOperationQueue alloc] init];
if([logViewerQueue respondsToSelector:@selector(setName:)])
- [logViewerQueue performSelector:@selector(setName:) withObject:@"sharedLogViewerQueue"];
- }
+ [logViewerQueue performSelector:@selector(setName:) withObject:@"im.adium.AILogViewerWindowController.logViewerQueue"];
+ });
+
return logViewerQueue;
}
diff -r 732390b9b84a -r 353c10aa7ce2 Source/AIXMLAppender.m
--- a/Source/AIXMLAppender.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Source/AIXMLAppender.m Wed Jul 27 12:26:25 2011 +0300
@@ -62,149 +62,9 @@
@property (readwrite) BOOL initialized;
@property (readwrite, copy, nonatomic) AIXMLElement *rootElement;
@property (readwrite, copy, nonatomic) NSString *path;
- at end
-
- at interface AIAppendXMLOperation : NSOperation
-{
- NSData *data;
- NSInteger seekBackLength;
- AIXMLAppender *appender;
-}
-- (AIAppendXMLOperation *)initWithData:(NSData *)d
- seekBackLength:(NSInteger)s
- appender:(AIXMLAppender *)a;
-
- (void) prepareFileHandle;
@end
- at implementation AIAppendXMLOperation
-- (AIAppendXMLOperation *)initWithData:(NSData *)d
- seekBackLength:(NSInteger)s
- appender:(AIXMLAppender *)a
-{
- if ((self = [super init]))
- {
- data = [d retain];
- seekBackLength = s;
- appender = [a retain];
- }
-
- return self;
-}
-
-- (void) dealloc
-{
- [data release];
- [appender release];
- [super dealloc];
-}
-
-- (void) main
-{
- BOOL success = YES;
- if (!appender.fileHandle)
- [self prepareFileHandle];
-
- @try {
- [appender.fileHandle writeData:data];
-
- } @catch (NSException *writingException) {
- /* NSFileHandle raises an exception if:
- * * the file descriptor is closed or is not valid - we should reopen the file and try again
- * * if the receiver represents an unconnected pipe or socket endpoint - this should never happen
- * * if no free space is left on the file system - this should be handled gracefully if possible.. but the user is probably in trouble.
- * * if any other writing error occurs - as with lack of free space.
- */
- if (appender.initialized &&
- [[writingException name] isEqualToString:NSFileHandleOperationException] &&
- [[writingException reason] rangeOfString:@"Bad file descriptor"].location != NSNotFound) {
-
- appender.fileHandle = nil;
-
- [self prepareFileHandle];
-
- @try {
- [appender.fileHandle writeData:data];
- success = YES;
-
- } @catch (NSException *secondWritingException) {
- NSLog(@"Exception while writing %@ log file %@: %@ (%@)",
- (appender.initialized ? @"initialized" : @"uninitialized"), appender.path, [secondWritingException name], [secondWritingException reason]);
- success = NO;
- }
-
- } else {
- NSLog(@"Exception while writing %@ log file %@: %@ (%@)",
- (appender.initialized ? @"initialized" : @"uninitialized"), appender.path, [writingException name], [writingException reason]);
- success = NO;
- }
- }
-
- if (success) {
- [appender.fileHandle synchronizeFile];
-
- @try {
- [appender.fileHandle seekToFileOffset:([appender.fileHandle offsetInFile] - seekBackLength)];
-
- } @catch (NSException *seekException) {
- /* -[NSFileHandler seekToFileOffset:] raises an exception if
- * * the message is sent to an NSFileHandle object representing a pipe or socket
- * * if the file descriptor is closed
- * * if any other error occurs in seeking.
- */
- NSLog(@"Exception while seeking in %@ log file %@: %@ (%@)",
- (appender.initialized ? @"initialized" : @"uninitialized"), appender.path, [seekException name], [seekException reason]);
- success = NO;
- }
- }
-}
-
-- (void)prepareFileHandle
-{
- NSFileManager *manager = [NSFileManager defaultManager];
-
- //Check if the file already exists
- if ([manager fileExistsAtPath:appender.path]) {
- //Get the root element name and set initialized
- NSString *rootElementName = [appender rootElementNameForFileAtPath:appender.path];
- if (rootElementName)
- appender.rootElement = [[[AIXMLElement alloc] initWithName:rootElementName] autorelease];
- appender.initialized = (rootElementName != nil);
-
- } else {
- //Create each component of the path, then change into it.
- NSError *error = nil;
- if (![manager createDirectoryAtPath:[appender.path stringByDeletingLastPathComponent]
- withIntermediateDirectories:YES
- attributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0700UL] forKey:NSFilePosixPermissions]
- error:&error]) {
- AILogWithSignature(@"Error creating directory at %@: %@",
- [appender.path stringByDeletingLastPathComponent],
- error);
- }
-
- appender.initialized = NO;
- }
-
- //Open our file handle and seek if necessary
- const char *pathCString = [appender.path fileSystemRepresentation];
- int fd = open(pathCString, O_CREAT | O_WRONLY, 0600);
- if(fd == -1) {
- AILog(@"Couldn't open log file %@ (%s - length %u) for writing!",
- appender.path, pathCString, (pathCString ? strlen(pathCString) : 0));
- } else {
- appender.fileHandle = [[[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES] autorelease];
- if (appender.initialized) {
- struct stat sb;
- fstat(fd, &sb);
- NSInteger closingTagLength = [appender.rootElement.name length] + 4; //</rootElementName>
- [appender.fileHandle seekToFileOffset:sb.st_size - closingTagLength];
- }
- }
-}
-
- at end
-
/*!
* @class AIXMLAppender
* @brief Provides multiple-write access to an XML document while maintaining wellformedness.
@@ -280,8 +140,108 @@
- (void)writeData:(NSData *)data seekBackLength:(NSInteger)seekBackLength
{
- AIAppendXMLOperation *op = [[[AIAppendXMLOperation alloc] initWithData:data seekBackLength:seekBackLength appender:self] autorelease];
- [AISharedWriterQueue addOperation:op];
+ [AISharedWriterQueue addOperation:^{
+ BOOL success = YES;
+ if (!self.fileHandle)
+ [self prepareFileHandle];
+
+ @try {
+ [self.fileHandle writeData:data];
+
+ } @catch (NSException *writingException) {
+ /* NSFileHandle raises an exception if:
+ * * the file descriptor is closed or is not valid - we should reopen the file and try again
+ * * if the receiver represents an unconnected pipe or socket endpoint - this should never happen
+ * * if no free space is left on the file system - this should be handled gracefully if possible.. but the user is probably in trouble.
+ * * if any other writing error occurs - as with lack of free space.
+ */
+ if (self.initialized &&
+ [[writingException name] isEqualToString:NSFileHandleOperationException] &&
+ [[writingException reason] rangeOfString:@"Bad file descriptor"].location != NSNotFound) {
+
+ self.fileHandle = nil;
+
+ [self prepareFileHandle];
+
+ @try {
+ [self.fileHandle writeData:data];
+ success = YES;
+
+ } @catch (NSException *secondWritingException) {
+ NSLog(@"Exception while writing %@ log file %@: %@ (%@)",
+ (self.initialized ? @"initialized" : @"uninitialized"), self.path, [secondWritingException name], [secondWritingException reason]);
+ success = NO;
+ }
+
+ } else {
+ NSLog(@"Exception while writing %@ log file %@: %@ (%@)",
+ (self.initialized ? @"initialized" : @"uninitialized"), self.path, [writingException name], [writingException reason]);
+ success = NO;
+ }
+ }
+
+ if (success) {
+ [self.fileHandle synchronizeFile];
+
+ @try {
+ [self.fileHandle seekToFileOffset:([self.fileHandle offsetInFile] - seekBackLength)];
+
+ } @catch (NSException *seekException) {
+ /* -[NSFileHandler seekToFileOffset:] raises an exception if
+ * * the message is sent to an NSFileHandle object representing a pipe or socket
+ * * if the file descriptor is closed
+ * * if any other error occurs in seeking.
+ */
+ NSLog(@"Exception while seeking in %@ log file %@: %@ (%@)",
+ (self.initialized ? @"initialized" : @"uninitialized"), self.path, [seekException name], [seekException reason]);
+ success = NO;
+ }
+ }
+ }];
+}
+
+- (void)prepareFileHandle
+{
+ NSFileManager *manager = [NSFileManager defaultManager];
+
+ //Check if the file already exists
+ if ([manager fileExistsAtPath:self.path]) {
+ //Get the root element name and set initialized
+ NSString *rootElementName = [self rootElementNameForFileAtPath:self.path];
+ if (rootElementName)
+ self.rootElement = [[[AIXMLElement alloc] initWithName:rootElementName] autorelease];
+ self.initialized = (rootElementName != nil);
+
+ } else {
+ //Create each component of the path, then change into it.
+ NSError *error = nil;
+ if (![manager createDirectoryAtPath:[self.path stringByDeletingLastPathComponent]
+ withIntermediateDirectories:YES
+ attributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0700UL] forKey:NSFilePosixPermissions]
+ error:&error]) {
+ AILogWithSignature(@"Error creating directory at %@: %@",
+ [self.path stringByDeletingLastPathComponent],
+ error);
+ }
+
+ self.initialized = NO;
+ }
+
+ //Open our file handle and seek if necessary
+ const char *pathCString = [self.path fileSystemRepresentation];
+ int fd = open(pathCString, O_CREAT | O_WRONLY, 0600);
+ if(fd == -1) {
+ AILog(@"Couldn't open log file %@ (%s - length %u) for writing!",
+ self.path, pathCString, (pathCString ? strlen(pathCString) : 0));
+ } else {
+ self.fileHandle = [[[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES] autorelease];
+ if (self.initialized) {
+ struct stat sb;
+ fstat(fd, &sb);
+ NSInteger closingTagLength = [self.rootElement.name length] + 4; //</rootElementName>
+ [self.fileHandle seekToFileOffset:sb.st_size - closingTagLength];
+ }
+ }
}
/*!
diff -r 732390b9b84a -r 353c10aa7ce2 Source/AdiumPasswords.m
--- a/Source/AdiumPasswords.m Tue Jul 26 23:56:35 2011 +0200
+++ b/Source/AdiumPasswords.m Wed Jul 27 12:26:25 2011 +0300
@@ -23,7 +23,6 @@
#import <AIUtilities/AIObjectAdditions.h>
#import <AIUtilities/AIStringAdditions.h>
#import <objc/objc-runtime.h>
-#import <libkern/OSAtomic.h>
#import <AIUtilities/AIApplicationAdditions.h>
More information about the commits
mailing list