From 1ab6ba5bdc438c3efe2ca31eae10ba81c1dd9ee3 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:17:44 +0200 Subject: [PATCH 1/8] Updated ACCodeSnippetRepository Tests to XCTest. --- .../ACCodeSnippetGitDataStoreTests.m | 4 +- .../ACCodeSnippetSerializationTests.m | 40 +++++++++---------- .../ACGitRepositoryTests.m | 4 +- .../NSDictionary+MergeTests.m | 10 ++--- .../project.pbxproj | 15 +++---- 5 files changed, 34 insertions(+), 39 deletions(-) diff --git a/ACCodeSnippetRepository Tests/ACCodeSnippetGitDataStoreTests.m b/ACCodeSnippetRepository Tests/ACCodeSnippetGitDataStoreTests.m index a5adfdc..4a2a2b7 100644 --- a/ACCodeSnippetRepository Tests/ACCodeSnippetGitDataStoreTests.m +++ b/ACCodeSnippetRepository Tests/ACCodeSnippetGitDataStoreTests.m @@ -6,11 +6,11 @@ // Copyright (c) 2014 Arnaud Coomans. All rights reserved. // -#import +#import #import "ACCodeSnippetGitDataStore.h" -@interface ACCodeSnippetGitDataStoreTests : SenTestCase +@interface ACCodeSnippetGitDataStoreTests : XCTestCase @end @implementation ACCodeSnippetGitDataStoreTests diff --git a/ACCodeSnippetRepository Tests/ACCodeSnippetSerializationTests.m b/ACCodeSnippetRepository Tests/ACCodeSnippetSerializationTests.m index 1036ef4..fac0972 100644 --- a/ACCodeSnippetRepository Tests/ACCodeSnippetSerializationTests.m +++ b/ACCodeSnippetRepository Tests/ACCodeSnippetSerializationTests.m @@ -6,10 +6,10 @@ // Copyright (c) 2014 Arnaud Coomans. All rights reserved. // -#import +#import #import "ACCodeSnippetSerialization.h" -@interface ACCodeSnippetSerializationTests : SenTestCase +@interface ACCodeSnippetSerializationTests : XCTestCase @end @implementation ACCodeSnippetSerializationTests @@ -31,14 +31,14 @@ - (void)testSerialize { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"\n%@", string); - STAssertTrue([string rangeOfString:@"title"].location != NSNotFound, nil); - STAssertTrue([string rangeOfString:@"summary"].location != NSNotFound, nil); - STAssertTrue([string rangeOfString:@"line1\nline2\nline3"].location != NSNotFound, nil); - STAssertTrue([string rangeOfString:@"WhateverKey"].location != NSNotFound, nil); - STAssertTrue([string rangeOfString:@"WhateverValue"].location != NSNotFound, nil); + XCTAssertTrue([string rangeOfString:@"title"].location != NSNotFound); + XCTAssertTrue([string rangeOfString:@"summary"].location != NSNotFound); + XCTAssertTrue([string rangeOfString:@"line1\nline2\nline3"].location != NSNotFound); + XCTAssertTrue([string rangeOfString:@"WhateverKey"].location != NSNotFound); + XCTAssertTrue([string rangeOfString:@"WhateverValue"].location != NSNotFound); - STAssertTrue([string rangeOfString:@"one"].location != NSNotFound, nil); - STAssertTrue([string rangeOfString:@"two"].location != NSNotFound, nil); + XCTAssertTrue([string rangeOfString:@"one"].location != NSNotFound); + XCTAssertTrue([string rangeOfString:@"two"].location != NSNotFound); } - (void)testDeserialize { @@ -50,13 +50,13 @@ - (void)testDeserialize { error:nil]; NSLog(@"\n%@", dict); - STAssertTrue([dict[ACCodeSnippetTitleKey] isEqualToString:@"title"], nil); - STAssertTrue([dict[ACCodeSnippetSummaryKey] isEqualToString:@"summary"], nil); - STAssertTrue([dict[ACCodeSnippetContentsKey] isEqualToString:@"line1\nline2\nline3\n"], nil); - STAssertTrue([dict[@"WhateverKey"] isEqualToString:@"WhateverValue"], nil); + XCTAssertTrue([dict[ACCodeSnippetTitleKey] isEqualToString:@"title"]); + XCTAssertTrue([dict[ACCodeSnippetSummaryKey] isEqualToString:@"summary"]); + XCTAssertTrue([dict[ACCodeSnippetContentsKey] isEqualToString:@"line1\nline2\nline3\n"]); + XCTAssertTrue([dict[@"WhateverKey"] isEqualToString:@"WhateverValue"]); NSArray *a = @[@"one", @"two"]; - STAssertTrue([dict[@"Array"] isEqualToArray:a], nil); + XCTAssertTrue([dict[@"Array"] isEqualToArray:a]); } - (void)testDeserialize2 { @@ -68,13 +68,13 @@ - (void)testDeserialize2 { error:nil]; NSLog(@"\n%@", dict); - STAssertTrue([dict[ACCodeSnippetTitleKey] isEqualToString:@"title"], nil); - STAssertTrue([dict[ACCodeSnippetSummaryKey] isEqualToString:@"summary"], nil); - STAssertTrue([dict[ACCodeSnippetContentsKey] isEqualToString:@"line1\nline2\nline3\n"], nil); - STAssertTrue([dict[@"WhateverKey"] isEqualToString:@"WhateverValue"], nil); + XCTAssertTrue([dict[ACCodeSnippetTitleKey] isEqualToString:@"title"]); + XCTAssertTrue([dict[ACCodeSnippetSummaryKey] isEqualToString:@"summary"]); + XCTAssertTrue([dict[ACCodeSnippetContentsKey] isEqualToString:@"line1\nline2\nline3\n"]); + XCTAssertTrue([dict[@"WhateverKey"] isEqualToString:@"WhateverValue"]); NSArray *a = @[@"one", @"two"]; - STAssertTrue([dict[@"Array"] isEqualToArray:a], nil); + XCTAssertTrue([dict[@"Array"] isEqualToArray:a]); } - (void)testSerializeDeserialize { @@ -96,7 +96,7 @@ - (void)testSerializeDeserialize { options:0 format:ACCodeSnippetSerializationFormatC error:nil]; - STAssertTrue([dict1 isEqualToDictionary:dict2], nil); + XCTAssertTrue([dict1 isEqualToDictionary:dict2]); } diff --git a/ACCodeSnippetRepository Tests/ACGitRepositoryTests.m b/ACCodeSnippetRepository Tests/ACGitRepositoryTests.m index 01c7061..fb813a3 100644 --- a/ACCodeSnippetRepository Tests/ACGitRepositoryTests.m +++ b/ACCodeSnippetRepository Tests/ACGitRepositoryTests.m @@ -6,10 +6,10 @@ // Copyright (c) 2014 Arnaud Coomans. All rights reserved. // -#import +#import #import "ACGitRepository.h" -@interface ACGitRepositoryTests : SenTestCase +@interface ACGitRepositoryTests : XCTestCase @end @implementation ACGitRepositoryTests diff --git a/ACCodeSnippetRepository Tests/NSDictionary+MergeTests.m b/ACCodeSnippetRepository Tests/NSDictionary+MergeTests.m index f8137c0..161d0ab 100644 --- a/ACCodeSnippetRepository Tests/NSDictionary+MergeTests.m +++ b/ACCodeSnippetRepository Tests/NSDictionary+MergeTests.m @@ -6,10 +6,10 @@ // Copyright (c) 2014 Arnaud Coomans. All rights reserved. // -#import +#import #import "NSDictionary+Merge.h" -@interface NSDictionary_MergeTests : SenTestCase +@interface NSDictionary_MergeTests : XCTestCase @end @implementation NSDictionary_MergeTests @@ -25,9 +25,9 @@ - (void)testExample { @"c": @"c" }]; - STAssertTrue([r[@"a"] isEqualToString:@"a"], nil); - STAssertTrue([r[@"b"] isEqualToString:@"b"], nil); - STAssertTrue([r[@"c"] isEqualToString:@"c"], nil); + XCTAssertTrue([r[@"a"] isEqualToString:@"a"]); + XCTAssertTrue([r[@"b"] isEqualToString:@"b"]); + XCTAssertTrue([r[@"c"] isEqualToString:@"c"]); } @end diff --git a/ACCodeSnippetRepository.xcodeproj/project.pbxproj b/ACCodeSnippetRepository.xcodeproj/project.pbxproj index b052723..7410ac5 100644 --- a/ACCodeSnippetRepository.xcodeproj/project.pbxproj +++ b/ACCodeSnippetRepository.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 5153BAA918B3406D00C1E75B /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 5153BAA818B3406D00C1E75B /* NSDictionary+Merge.m */; }; 5153BAAA18B3406D00C1E75B /* NSDictionary+Merge.m in Sources */ = {isa = PBXBuildFile; fileRef = 5153BAA818B3406D00C1E75B /* NSDictionary+Merge.m */; }; 5153BAAC18B3410C00C1E75B /* NSDictionary+MergeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5153BAAB18B3410C00C1E75B /* NSDictionary+MergeTests.m */; }; - 5154068518AC4B500065CA33 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5154068418AC4B500065CA33 /* SenTestingKit.framework */; }; 5154068B18AC4B500065CA33 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5154068918AC4B500065CA33 /* InfoPlist.strings */; }; 515CE9DA18B1DCAA000962EA /* GitHub-Mark-120px-plus.png in Resources */ = {isa = PBXBuildFile; fileRef = 515CE9D718B1DCAA000962EA /* GitHub-Mark-120px-plus.png */; }; 515CE9DB18B1DCAA000962EA /* GitHub-Mark-32px.png in Resources */ = {isa = PBXBuildFile; fileRef = 515CE9D818B1DCAA000962EA /* GitHub-Mark-32px.png */; }; @@ -60,8 +59,7 @@ 5153BAA718B3406D00C1E75B /* NSDictionary+Merge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Merge.h"; sourceTree = ""; }; 5153BAA818B3406D00C1E75B /* NSDictionary+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Merge.m"; sourceTree = ""; }; 5153BAAB18B3410C00C1E75B /* NSDictionary+MergeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+MergeTests.m"; sourceTree = ""; }; - 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ACCodeSnippetRepository Tests.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5154068418AC4B500065CA33 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ACCodeSnippetRepository Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 5154068818AC4B500065CA33 /* ACCodeSnippetRepository Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ACCodeSnippetRepository Tests-Info.plist"; sourceTree = ""; }; 5154068A18AC4B500065CA33 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 5154068E18AC4B500065CA33 /* ACCodeSnippetRepository Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ACCodeSnippetRepository Tests-Prefix.pch"; sourceTree = ""; }; @@ -104,7 +102,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5154068518AC4B500065CA33 /* SenTestingKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -247,7 +244,7 @@ isa = PBXGroup; children = ( 518E699F18AC4A8900C57456 /* ACCodeSnippetRepository.xcplugin */, - 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.octest */, + 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.xctest */, ); name = Products; sourceTree = ""; @@ -257,7 +254,6 @@ children = ( 518E69A218AC4A8900C57456 /* AppKit.framework */, 518E69A418AC4A8900C57456 /* Foundation.framework */, - 5154068418AC4B500065CA33 /* SenTestingKit.framework */, ); name = Frameworks; sourceTree = ""; @@ -318,8 +314,8 @@ ); name = "ACCodeSnippetRepository Tests"; productName = "ACCodeSnippetRepository Tests"; - productReference = 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.octest */; - productType = "com.apple.product-type.bundle"; + productReference = 5154068318AC4B500065CA33 /* ACCodeSnippetRepository Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; 518E699E18AC4A8900C57456 /* ACCodeSnippetRepository */ = { isa = PBXNativeTarget; @@ -344,6 +340,7 @@ 518E699718AC4A8900C57456 /* Project object */ = { isa = PBXProject; attributes = { + LastTestingUpgradeCheck = 0700; LastUpgradeCheck = 0500; ORGANIZATIONNAME = "Arnaud Coomans"; TargetAttributes = { @@ -475,7 +472,6 @@ ); INFOPLIST_FILE = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; }; name = Debug; }; @@ -490,7 +486,6 @@ GCC_PREFIX_HEADER = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Prefix.pch"; INFOPLIST_FILE = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = octest; }; name = Release; }; From 27e53dc20e194c57d32e03277638447e54c05f45 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:17:57 +0200 Subject: [PATCH 2/8] Updated to Xcode 7 recommended settings. --- .../ACCodeSnippetRepository Tests-Info.plist | 2 +- ACCodeSnippetRepository.xcodeproj/project.pbxproj | 9 ++++++++- .../ACCodeSnippetRepository-Info.plist | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist b/ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist index 17c7d4b..169b6f7 100644 --- a/ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist +++ b/ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.acoomans.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/ACCodeSnippetRepository.xcodeproj/project.pbxproj b/ACCodeSnippetRepository.xcodeproj/project.pbxproj index 7410ac5..57a7aa9 100644 --- a/ACCodeSnippetRepository.xcodeproj/project.pbxproj +++ b/ACCodeSnippetRepository.xcodeproj/project.pbxproj @@ -341,7 +341,7 @@ isa = PBXProject; attributes = { LastTestingUpgradeCheck = 0700; - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Arnaud Coomans"; TargetAttributes = { 5154068218AC4B500065CA33 = { @@ -460,6 +460,7 @@ 5154069118AC4B500065CA33 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", @@ -471,6 +472,7 @@ "$(inherited)", ); INFOPLIST_FILE = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.acoomans.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -478,6 +480,7 @@ 5154069218AC4B500065CA33 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", @@ -485,6 +488,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Prefix.pch"; INFOPLIST_FILE = "ACCodeSnippetRepository Tests/ACCodeSnippetRepository Tests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "com.acoomans.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -505,6 +509,7 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -568,6 +573,7 @@ INFOPLIST_FILE = "ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist"; INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "com.acoomans.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = xcplugin; }; @@ -584,6 +590,7 @@ INFOPLIST_FILE = "ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist"; INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "com.acoomans.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = xcplugin; }; diff --git a/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist b/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist index ee568a4..50d472d 100644 --- a/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist +++ b/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile CFBundleIdentifier - com.acoomans.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 9bf5922f2928a14e0e73ed4f1cc3ffcb5a09a183 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:19:51 +0200 Subject: [PATCH 3/8] API usage fix. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Warning: “Null passed to a callee that requires a non-null argument”. Replaced nil by an empty string per API docs. --- .../ACCodeSnippetRepositoryConfigurationWindowController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m index 104a5d1..d771d98 100644 --- a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m +++ b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m @@ -242,7 +242,7 @@ - (IBAction)restoreSystemSnippets:(id)sender { } - (IBAction)openSystemSnippetsDirectoryAction:(id)sender { - [[NSWorkspace sharedWorkspace] selectFile:[self systemSnippetsPath] inFileViewerRootedAtPath:nil]; + [[NSWorkspace sharedWorkspace] selectFile:[self systemSnippetsPath] inFileViewerRootedAtPath: @""]; } - (NSString*)systemSnippetsPath { From 1fdea08590924f5b4f12ae7bdeddb5d798c99ec0 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:28:52 +0200 Subject: [PATCH 4/8] Various refactoring. --- ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m b/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m index 80b1b44..2739fd6 100644 --- a/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m +++ b/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m @@ -97,7 +97,7 @@ - (NSMenu*)pluginMenu { if (!pluginMenu) { pluginMenu = [[NSMenu alloc] initWithTitle:pluginMenuTitle]; - NSMenuItem *pluginMenuItem = [[NSMenuItem alloc] initWithTitle:pluginMenuTitle action:nil keyEquivalent:@""]; + NSMenuItem *pluginMenuItem = [[NSMenuItem alloc] initWithTitle:pluginMenuTitle action: NULL keyEquivalent:@""]; pluginMenuItem.submenu = pluginMenu; [[NSApp mainMenu] addItem:pluginMenuItem]; From 8e93599f8f82c40182b9decda873c0813bb68509 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:29:28 +0200 Subject: [PATCH 5/8] Added Xcode 7 key. --- ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist b/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist index 50d472d..60629a9 100644 --- a/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist +++ b/ACCodeSnippetRepository/ACCodeSnippetRepository-Info.plist @@ -31,6 +31,7 @@ FEC992CC-CA4A-4CFD-8881-77300FCB848A A16FF353-8441-459E-A50C-B071F53F51B7 9F75337B-21B4-4ADC-B558-F9CADF7073A7 + AABB7188-E14E-4433-AD3B-5CD791EAD9A3 NSPrincipalClass ACCodeSnippetRepositoryPlugin From b05810440b436c41bfe326d68708bf30accbfaaf Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 16:47:12 +0200 Subject: [PATCH 6/8] Fixed "Plug-ins" menu not appearing. --- .../ACCodeSnippetRepositoryPlugin.m | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m b/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m index 2739fd6..c6ce400 100644 --- a/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m +++ b/ACCodeSnippetRepository/ACCodeSnippetRepositoryPlugin.m @@ -39,7 +39,12 @@ - (id)initWithBundle:(NSBundle *)plugin { // reference to plugin's bundle, for resource acccess self.bundle = plugin; - + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(applicationDidFinishLaunching:) + name: NSApplicationDidFinishLaunchingNotification + object: nil]; + // add data stores to Xcode's snippet repository ACCodeSnippetGitDataStore *gitDataStore = [[ACCodeSnippetGitDataStore alloc] init]; [gitDataStore addObserver:self forKeyPath:@"mainQueue.operationCount" options:0 context:NULL]; @@ -58,29 +63,30 @@ - (id)initWithBundle:(NSBundle *)plugin { [self startTimer]; } - // Create menu items, initialize UI, etc. - NSMenu *pluginMenu = [self pluginMenu]; - pluginMenu.autoenablesItems = NO; - - if (pluginMenu) { - - NSMenuItem *actionMenuItem = nil; - - self.updateMenuItem = actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Update snippets" action:@selector(updateAction:) keyEquivalent:@""]; - actionMenuItem.target = self; - [pluginMenu addItem:actionMenuItem]; - - actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Configure snippets repository" action:@selector(configureAction:) keyEquivalent:@""]; - actionMenuItem.target = self; - [pluginMenu addItem:actionMenuItem]; - - //[pluginMenu addItem:[NSMenuItem separatorItem]]; - } - } return self; } +- (void) applicationDidFinishLaunching: (NSNotification *) notification +{ + // Create menu items, initialize UI, etc. + NSMenu *pluginMenu = [self pluginMenu]; + pluginMenu.autoenablesItems = NO; + + if (pluginMenu) { + + NSMenuItem *actionMenuItem = nil; + + self.updateMenuItem = actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Update snippets" action:@selector(updateAction:) keyEquivalent:@""]; + actionMenuItem.target = self; + [pluginMenu addItem:actionMenuItem]; + + actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Configure snippets repository" action:@selector(configureAction:) keyEquivalent:@""]; + actionMenuItem.target = self; + [pluginMenu addItem:actionMenuItem]; + } +} + - (id)init { return [self initWithBundle:nil]; } @@ -99,8 +105,12 @@ - (NSMenu*)pluginMenu { NSMenuItem *pluginMenuItem = [[NSMenuItem alloc] initWithTitle:pluginMenuTitle action: NULL keyEquivalent:@""]; pluginMenuItem.submenu = pluginMenu; - - [[NSApp mainMenu] addItem:pluginMenuItem]; + + NSMenu *appMenu = [NSApp menu]; + + NSMenuItem *helpMenuItem = [appMenu itemWithTitle: @"Help"]; + + [appMenu insertItem: pluginMenuItem atIndex: [appMenu indexOfItem: helpMenuItem]]; } return pluginMenu; } From a1589037e61b72aaed48e811f02c4fe68edfa248 Mon Sep 17 00:00:00 2001 From: Clement Padovani Date: Sun, 26 Jul 2015 17:29:39 +0200 Subject: [PATCH 7/8] Fixed accessing AppKit element from background thread. When forking a new code snippet repo (Plug-ins -> Configure snippets repo) when checking the console logs AppKit outputs the following entry: NSAlert is being used from a background thread, which is not safe. This is probably going to crash sometimes. Break on void _NSAlertWarnUnsafeBackgroundThreadUsage() to debug. This will be logged only once. This may break in the future. --- .../ACCodeSnippetRepositoryConfigurationWindowController.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m index d771d98..6309e22 100644 --- a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m +++ b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m @@ -120,8 +120,10 @@ - (IBAction)forkRemoteRepositoryAction:(id)sender { [weakSelf.window endSheet:weakSelf.progressPanel]; [weakSelf.progressIndicator stopAnimation:weakSelf]; }); - - [weakSelf importUserSnippetsAction:weakSelf]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf importUserSnippetsAction:weakSelf]; + }); }); break; From 9f2fc7290f4c51239f45e5901b939c77f0bcbda4 Mon Sep 17 00:00:00 2001 From: Clement Date: Tue, 28 Jul 2015 13:39:23 +0200 Subject: [PATCH 8/8] Fix empty repo URL crash. --- .../ACCodeSnippetRepositoryConfigurationWindowController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m index 6309e22..e21cd7e 100644 --- a/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m +++ b/ACCodeSnippetRepository/Controllers/ACCodeSnippetRepositoryConfigurationWindowController.m @@ -57,7 +57,9 @@ - (ACCodeSnippetGitDataStore*)gitDataStore { - (void)controlTextDidChange:(NSNotification *)notification { NSTextField *textField = [notification object]; - if (![[NSURL URLWithString:textField.stringValue] isEqualTo:self.gitDataStore.remoteRepositoryURL]) { + if (([textField stringValue] && + [[textField stringValue] length]) && + ![[NSURL URLWithString:textField.stringValue] isEqualTo:self.gitDataStore.remoteRepositoryURL]) { self.forkRemoteRepositoryButton.enabled = YES; } else { self.forkRemoteRepositoryButton.enabled = NO;