From 0e2519fe023b47eccb434108de3b628cb01dc0a1 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 27 Jun 2016 23:02:55 +0100 Subject: [PATCH 01/48] Moved the code to an OSX project --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 355 ++++++++---------- .../contents.xcworkspacedata | 2 +- BuildTimeAnalyzer/AppDelegate.swift | 27 ++ .../AppIcon.appiconset/Contents.json | 58 +++ .../Contents.json | 0 .../ScreenShot.imageset/Contents.json | 0 .../ScreenShot.imageset/Screen Shot.png | Bin BuildTimeAnalyzer/CMLogProcessor.swift | 30 +- BuildTimeAnalyzer/CMPlugin.swift | 67 ---- ...wController.swift => CMResultWindow.swift} | 133 ++++--- BuildTimeAnalyzer/CMResultWindow.xib | 35 +- BuildTimeAnalyzer/Info.plist | 25 +- BuildTimeAnalyzerTests-Bridging-Header.h | 5 + .../CMCompileMeasureTests.swift | 2 + 14 files changed, 352 insertions(+), 387 deletions(-) create mode 100644 BuildTimeAnalyzer/AppDelegate.swift create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json rename BuildTimeAnalyzer/{Icons.xcassets => Assets.xcassets}/Contents.json (100%) rename BuildTimeAnalyzer/{Icons.xcassets => Assets.xcassets}/ScreenShot.imageset/Contents.json (100%) rename BuildTimeAnalyzer/{Icons.xcassets => Assets.xcassets}/ScreenShot.imageset/Screen Shot.png (100%) delete mode 100644 BuildTimeAnalyzer/CMPlugin.swift rename BuildTimeAnalyzer/{CMResultWindowController.swift => CMResultWindow.swift} (62%) create mode 100644 BuildTimeAnalyzerTests-Bridging-Header.h diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 6e0d641..d3a493c 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -7,75 +7,61 @@ objects = { /* Begin PBXBuildFile section */ - 2A14D30B1CDA4F380079BFF0 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A69BFFB1CD513D700A554A3 /* NSData+GZIP.m */; }; - 2A1682C31CD4039300014B7F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1682C21CD4039300014B7F /* Cocoa.framework */; }; - 2A1682C51CD403FB00014B7F /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1682C41CD403FB00014B7F /* AppKit.framework */; }; - 2A1682C71CD4040900014B7F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1682C61CD4040900014B7F /* Foundation.framework */; }; - 2A1682CA1CD4042800014B7F /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A1682C91CD4042800014B7F /* CoreData.framework */; }; - 2A71846E1CDA483E00E8B7D3 /* NSNotificationCenter+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A71846D1CDA483E00E8B7D3 /* NSNotificationCenter+Extensions.swift */; }; - 2A71846F1CDA48AB00E8B7D3 /* CMCompileMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1B1E7F1CD768C300ADD414 /* CMCompileMeasure.swift */; }; - 2A74ACC51CD5733B0057B819 /* CMResultWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A74ACC41CD5733B0057B819 /* CMResultWindow.xib */; }; - 2A7DBBF51CD8E5D1009E9B49 /* CMCompileMeasureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A7DBBF41CD8E5D1009E9B49 /* CMCompileMeasureTests.swift */; }; - 2A9BDFEB1CD95196000E5862 /* Icons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2A9BDFEA1CD95196000E5862 /* Icons.xcassets */; }; - 2ABB72011CDA4680001FDC32 /* CMBuildOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1854A31CD8BB74005498BF /* CMBuildOperation.swift */; }; - 2ABB72021CDA4680001FDC32 /* CMCompileMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1B1E7F1CD768C300ADD414 /* CMCompileMeasure.swift */; }; - 2ABB72031CDA4680001FDC32 /* CMPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1682C01CD3FBCC00014B7F /* CMPlugin.swift */; }; - 2ABB72041CDA4680001FDC32 /* CMLogProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A74ACC11CD571470057B819 /* CMLogProcessor.swift */; }; - 2ABB72051CDA4680001FDC32 /* CMProcessingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5A07241CD64DCA009F0ECE /* CMProcessingState.swift */; }; - 2ABB72061CDA4680001FDC32 /* CMResultWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A74ACCB1CD573CD0057B819 /* CMResultWindowController.swift */; }; - 2ABB72071CDA4680001FDC32 /* CMXcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A69BFFD1CD5179200A554A3 /* CMXcodeWorkspace.swift */; }; - 2AE38C571CDA8222008B65AE /* CMRawMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE38C561CDA8222008B65AE /* CMRawMeasure.swift */; }; + 2A3164C71D21D73F00064045 /* CMBuildOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164BF1D21D73F00064045 /* CMBuildOperation.swift */; }; + 2A3164C81D21D73F00064045 /* CMCompileMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C01D21D73F00064045 /* CMCompileMeasure.swift */; }; + 2A3164C91D21D73F00064045 /* CMLogProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C11D21D73F00064045 /* CMLogProcessor.swift */; }; + 2A3164CB1D21D73F00064045 /* CMProcessingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C31D21D73F00064045 /* CMProcessingState.swift */; }; + 2A3164CC1D21D73F00064045 /* CMRawMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C41D21D73F00064045 /* CMRawMeasure.swift */; }; + 2A3164CD1D21D73F00064045 /* CMResultWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C51D21D73F00064045 /* CMResultWindow.swift */; }; + 2A3164CE1D21D73F00064045 /* CMResultWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A3164C61D21D73F00064045 /* CMResultWindow.xib */; }; + 2A3164D01D21D74A00064045 /* CMCompileMeasureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164CF1D21D74A00064045 /* CMCompileMeasureTests.swift */; }; + 2A3164D51D21D77500064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; + 2A3164D91D21D7F800064045 /* CMXcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */; }; + 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; + 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AF821431D21D6B900D65186 /* AppDelegate.swift */; }; + 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2AF821451D21D6B900D65186 /* Assets.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2A7DBBFA1CD8E705009E9B49 /* PBXContainerItemProxy */ = { + 2AF821501D21D6B900D65186 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 2A1682AB1CD3F73900014B7F /* Project object */; + containerPortal = 2AF821381D21D6B900D65186 /* Project object */; proxyType = 1; - remoteGlobalIDString = 2A1682B21CD3F73900014B7F; + remoteGlobalIDString = 2AF8213F1D21D6B900D65186; remoteInfo = BuildTimeAnalyzer; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 2A1682B31CD3F73900014B7F /* BuildTimeAnalyzer.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BuildTimeAnalyzer.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; }; - 2A1682B61CD3F73900014B7F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2A1682BD1CD3FB5D00014B7F /* BuildTimeAnalyzer-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BuildTimeAnalyzer-Bridging-Header.h"; sourceTree = ""; }; - 2A1682C01CD3FBCC00014B7F /* CMPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMPlugin.swift; sourceTree = ""; }; - 2A1682C21CD4039300014B7F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 2A1682C41CD403FB00014B7F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; - 2A1682C61CD4040900014B7F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 2A1682C91CD4042800014B7F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 2A1854A31CD8BB74005498BF /* CMBuildOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMBuildOperation.swift; sourceTree = ""; }; - 2A1B1E7F1CD768C300ADD414 /* CMCompileMeasure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMCompileMeasure.swift; sourceTree = ""; }; - 2A5A07241CD64DCA009F0ECE /* CMProcessingState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMProcessingState.swift; sourceTree = ""; }; - 2A69BFFA1CD513D700A554A3 /* NSData+GZIP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GZIP.h"; path = "../GZIP/NSData+GZIP.h"; sourceTree = ""; }; - 2A69BFFB1CD513D700A554A3 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "../GZIP/NSData+GZIP.m"; sourceTree = ""; }; - 2A69BFFD1CD5179200A554A3 /* CMXcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMXcodeWorkspace.swift; sourceTree = ""; }; - 2A71846D1CDA483E00E8B7D3 /* NSNotificationCenter+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSNotificationCenter+Extensions.swift"; sourceTree = ""; }; - 2A74ACC11CD571470057B819 /* CMLogProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMLogProcessor.swift; sourceTree = ""; }; - 2A74ACC41CD5733B0057B819 /* CMResultWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CMResultWindow.xib; sourceTree = ""; }; - 2A74ACCB1CD573CD0057B819 /* CMResultWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMResultWindowController.swift; sourceTree = ""; }; - 2A7DBBF21CD8E5D0009E9B49 /* BuildTimeAnalyzer.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BuildTimeAnalyzer.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 2A7DBBF41CD8E5D1009E9B49 /* CMCompileMeasureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CMCompileMeasureTests.swift; sourceTree = ""; }; - 2A7DBBF61CD8E5D1009E9B49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = BuildTimeAnalyzerTests/Info.plist; sourceTree = ""; }; - 2A9BDFEA1CD95196000E5862 /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = ""; }; - 2AE38C561CDA8222008B65AE /* CMRawMeasure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMRawMeasure.swift; sourceTree = ""; }; + 2A3164BF1D21D73F00064045 /* CMBuildOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMBuildOperation.swift; sourceTree = ""; }; + 2A3164C01D21D73F00064045 /* CMCompileMeasure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMCompileMeasure.swift; sourceTree = ""; }; + 2A3164C11D21D73F00064045 /* CMLogProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMLogProcessor.swift; sourceTree = ""; }; + 2A3164C31D21D73F00064045 /* CMProcessingState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMProcessingState.swift; sourceTree = ""; }; + 2A3164C41D21D73F00064045 /* CMRawMeasure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMRawMeasure.swift; sourceTree = ""; }; + 2A3164C51D21D73F00064045 /* CMResultWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMResultWindow.swift; sourceTree = ""; }; + 2A3164C61D21D73F00064045 /* CMResultWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CMResultWindow.xib; sourceTree = ""; }; + 2A3164CF1D21D74A00064045 /* CMCompileMeasureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMCompileMeasureTests.swift; sourceTree = ""; }; + 2A3164D21D21D77500064045 /* BuildTimeAnalyzerTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BuildTimeAnalyzerTests-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; + 2A3164D31D21D77500064045 /* NSData+GZIP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GZIP.h"; path = "GZIP/NSData+GZIP.h"; sourceTree = ""; }; + 2A3164D41D21D77500064045 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "GZIP/NSData+GZIP.m"; sourceTree = ""; }; + 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMXcodeWorkspace.swift; sourceTree = ""; }; + 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BuildTimeAnalyzer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2AF821431D21D6B900D65186 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 2AF821451D21D6B900D65186 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = BuildTimeAnalyzer/Assets.xcassets; sourceTree = ""; }; + 2AF8214A1D21D6B900D65186 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2AF8214F1D21D6B900D65186 /* BuildTimeAnalyzerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BuildTimeAnalyzerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2AF821551D21D6B900D65186 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2A1682B01CD3F73900014B7F /* Frameworks */ = { + 2AF8213D1D21D6B900D65186 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2A1682CA1CD4042800014B7F /* CoreData.framework in Frameworks */, - 2A1682C71CD4040900014B7F /* Foundation.framework in Frameworks */, - 2A1682C51CD403FB00014B7F /* AppKit.framework in Frameworks */, - 2A1682C31CD4039300014B7F /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2A7DBBEF1CD8E5D0009E9B49 /* Frameworks */ = { + 2AF8214C1D21D6B900D65186 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -85,111 +71,88 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2A1682AA1CD3F73900014B7F = { + 2A3164D11D21D74F00064045 /* Supporting Files */ = { isa = PBXGroup; children = ( - 2A1682B51CD3F73900014B7F /* BuildTimeAnalyzer */, - 2A7DBBF31CD8E5D1009E9B49 /* BuildTimeAnalyzerTests */, - 2A1682C81CD4041200014B7F /* Frameworks */, - 2A74ACC31CD571A40057B819 /* GZIP */, - 2A1682B41CD3F73900014B7F /* Products */, + 2A3164D21D21D77500064045 /* BuildTimeAnalyzerTests-Bridging-Header.h */, + 2AF8214A1D21D6B900D65186 /* Info.plist */, ); + name = "Supporting Files"; sourceTree = ""; }; - 2A1682B41CD3F73900014B7F /* Products */ = { + 2A3164D61D21D77E00064045 /* GZIP */ = { isa = PBXGroup; children = ( - 2A1682B31CD3F73900014B7F /* BuildTimeAnalyzer.xcplugin */, - 2A7DBBF21CD8E5D0009E9B49 /* BuildTimeAnalyzer.xctest */, + 2A3164D31D21D77500064045 /* NSData+GZIP.h */, + 2A3164D41D21D77500064045 /* NSData+GZIP.m */, ); - name = Products; + name = GZIP; sourceTree = ""; }; - 2A1682B51CD3F73900014B7F /* BuildTimeAnalyzer */ = { + 2A3164D71D21D7A800064045 /* Supporting Files */ = { isa = PBXGroup; children = ( - 2A1854A31CD8BB74005498BF /* CMBuildOperation.swift */, - 2A1B1E7F1CD768C300ADD414 /* CMCompileMeasure.swift */, - 2A74ACC11CD571470057B819 /* CMLogProcessor.swift */, - 2A1682C01CD3FBCC00014B7F /* CMPlugin.swift */, - 2A5A07241CD64DCA009F0ECE /* CMProcessingState.swift */, - 2AE38C561CDA8222008B65AE /* CMRawMeasure.swift */, - 2A74ACC41CD5733B0057B819 /* CMResultWindow.xib */, - 2A74ACCB1CD573CD0057B819 /* CMResultWindowController.swift */, - 2A69BFFD1CD5179200A554A3 /* CMXcodeWorkspace.swift */, - 2A9BDFEA1CD95196000E5862 /* Icons.xcassets */, - 2A1682BC1CD3FAA800014B7F /* Supporting Files */, - 2AC835061CD664B200314A5A /* System Extensions */, + 2AF821551D21D6B900D65186 /* Info.plist */, ); - path = BuildTimeAnalyzer; + name = "Supporting Files"; sourceTree = ""; }; - 2A1682BC1CD3FAA800014B7F /* Supporting Files */ = { + 2AF821371D21D6B900D65186 = { isa = PBXGroup; children = ( - 2A1682BD1CD3FB5D00014B7F /* BuildTimeAnalyzer-Bridging-Header.h */, - 2A1682B61CD3F73900014B7F /* Info.plist */, + 2AF821421D21D6B900D65186 /* BuildTimeAnalyzer */, + 2AF821451D21D6B900D65186 /* Assets.xcassets */, + 2AF821521D21D6B900D65186 /* BuildTimeAnalyzerTests */, + 2A3164D61D21D77E00064045 /* GZIP */, + 2AF821411D21D6B900D65186 /* Products */, ); - name = "Supporting Files"; sourceTree = ""; }; - 2A1682C81CD4041200014B7F /* Frameworks */ = { + 2AF821411D21D6B900D65186 /* Products */ = { isa = PBXGroup; children = ( - 2A1682C41CD403FB00014B7F /* AppKit.framework */, - 2A1682C91CD4042800014B7F /* CoreData.framework */, - 2A1682C61CD4040900014B7F /* Foundation.framework */, - 2A1682C21CD4039300014B7F /* Cocoa.framework */, + 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */, + 2AF8214F1D21D6B900D65186 /* BuildTimeAnalyzerTests.xctest */, ); - name = Frameworks; + name = Products; sourceTree = ""; }; - 2A74ACC31CD571A40057B819 /* GZIP */ = { + 2AF821421D21D6B900D65186 /* BuildTimeAnalyzer */ = { isa = PBXGroup; children = ( - 2A69BFFA1CD513D700A554A3 /* NSData+GZIP.h */, - 2A69BFFB1CD513D700A554A3 /* NSData+GZIP.m */, + 2AF821431D21D6B900D65186 /* AppDelegate.swift */, + 2A3164BF1D21D73F00064045 /* CMBuildOperation.swift */, + 2A3164C01D21D73F00064045 /* CMCompileMeasure.swift */, + 2A3164C11D21D73F00064045 /* CMLogProcessor.swift */, + 2A3164C31D21D73F00064045 /* CMProcessingState.swift */, + 2A3164C41D21D73F00064045 /* CMRawMeasure.swift */, + 2A3164C51D21D73F00064045 /* CMResultWindow.swift */, + 2A3164C61D21D73F00064045 /* CMResultWindow.xib */, + 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */, + 2A3164D11D21D74F00064045 /* Supporting Files */, ); - name = GZIP; path = BuildTimeAnalyzer; sourceTree = ""; }; - 2A7DBBF31CD8E5D1009E9B49 /* BuildTimeAnalyzerTests */ = { + 2AF821521D21D6B900D65186 /* BuildTimeAnalyzerTests */ = { isa = PBXGroup; children = ( - 2A7DBBF41CD8E5D1009E9B49 /* CMCompileMeasureTests.swift */, - 2A7DBBFD1CD91D8F009E9B49 /* Supporting Files */, + 2A3164CF1D21D74A00064045 /* CMCompileMeasureTests.swift */, + 2A3164D71D21D7A800064045 /* Supporting Files */, ); path = BuildTimeAnalyzerTests; sourceTree = ""; }; - 2A7DBBFD1CD91D8F009E9B49 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 2A7DBBF61CD8E5D1009E9B49 /* Info.plist */, - ); - name = "Supporting Files"; - path = "BuildTimeAnalyzerTests/Supporting Files"; - sourceTree = ""; - }; - 2AC835061CD664B200314A5A /* System Extensions */ = { - isa = PBXGroup; - children = ( - 2A71846D1CDA483E00E8B7D3 /* NSNotificationCenter+Extensions.swift */, - ); - name = "System Extensions"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2A1682B21CD3F73900014B7F /* BuildTimeAnalyzer */ = { + 2AF8213F1D21D6B900D65186 /* BuildTimeAnalyzer */ = { isa = PBXNativeTarget; - buildConfigurationList = 2A1682B91CD3F73900014B7F /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzer" */; + buildConfigurationList = 2AF821581D21D6B900D65186 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzer" */; buildPhases = ( - 2A1682AF1CD3F73900014B7F /* Sources */, - 2A1682B01CD3F73900014B7F /* Frameworks */, - 2A1682B11CD3F73900014B7F /* Resources */, + 2AF8213C1D21D6B900D65186 /* Sources */, + 2AF8213D1D21D6B900D65186 /* Frameworks */, + 2AF8213E1D21D6B900D65186 /* Resources */, ); buildRules = ( ); @@ -197,74 +160,76 @@ ); name = BuildTimeAnalyzer; productName = BuildTimeAnalyzer; - productReference = 2A1682B31CD3F73900014B7F /* BuildTimeAnalyzer.xcplugin */; - productType = "com.apple.product-type.bundle"; + productReference = 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */; + productType = "com.apple.product-type.application"; }; - 2A7DBBF11CD8E5D0009E9B49 /* BuildTimeAnalyzerTests */ = { + 2AF8214E1D21D6B900D65186 /* BuildTimeAnalyzerTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 2A7DBBF91CD8E5D1009E9B49 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzerTests" */; + buildConfigurationList = 2AF8215B1D21D6B900D65186 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzerTests" */; buildPhases = ( - 2A7DBBEE1CD8E5D0009E9B49 /* Sources */, - 2A7DBBEF1CD8E5D0009E9B49 /* Frameworks */, - 2A7DBBF01CD8E5D0009E9B49 /* Resources */, + 2AF8214B1D21D6B900D65186 /* Sources */, + 2AF8214C1D21D6B900D65186 /* Frameworks */, + 2AF8214D1D21D6B900D65186 /* Resources */, ); buildRules = ( ); dependencies = ( - 2A7DBBFB1CD8E705009E9B49 /* PBXTargetDependency */, + 2AF821511D21D6B900D65186 /* PBXTargetDependency */, ); name = BuildTimeAnalyzerTests; productName = BuildTimeAnalyzerTests; - productReference = 2A7DBBF21CD8E5D0009E9B49 /* BuildTimeAnalyzer.xctest */; + productReference = 2AF8214F1D21D6B900D65186 /* BuildTimeAnalyzerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2A1682AB1CD3F73900014B7F /* Project object */ = { + 2AF821381D21D6B900D65186 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; LastUpgradeCheck = 0730; - ORGANIZATIONNAME = "Robert Gummesson"; + ORGANIZATIONNAME = "Cane Media Ltd"; TargetAttributes = { - 2A1682B21CD3F73900014B7F = { - CreatedOnToolsVersion = 7.3; + 2AF8213F1D21D6B900D65186 = { + CreatedOnToolsVersion = 7.3.1; }; - 2A7DBBF11CD8E5D0009E9B49 = { - CreatedOnToolsVersion = 7.3; + 2AF8214E1D21D6B900D65186 = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = 2AF8213F1D21D6B900D65186; }; }; }; - buildConfigurationList = 2A1682AE1CD3F73900014B7F /* Build configuration list for PBXProject "BuildTimeAnalyzer" */; + buildConfigurationList = 2AF8213B1D21D6B900D65186 /* Build configuration list for PBXProject "BuildTimeAnalyzer" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); - mainGroup = 2A1682AA1CD3F73900014B7F; - productRefGroup = 2A1682B41CD3F73900014B7F /* Products */; + mainGroup = 2AF821371D21D6B900D65186; + productRefGroup = 2AF821411D21D6B900D65186 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 2A1682B21CD3F73900014B7F /* BuildTimeAnalyzer */, - 2A7DBBF11CD8E5D0009E9B49 /* BuildTimeAnalyzerTests */, + 2AF8213F1D21D6B900D65186 /* BuildTimeAnalyzer */, + 2AF8214E1D21D6B900D65186 /* BuildTimeAnalyzerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2A1682B11CD3F73900014B7F /* Resources */ = { + 2AF8213E1D21D6B900D65186 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2A9BDFEB1CD95196000E5862 /* Icons.xcassets in Resources */, - 2A74ACC51CD5733B0057B819 /* CMResultWindow.xib in Resources */, + 2A3164CE1D21D73F00064045 /* CMResultWindow.xib in Resources */, + 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2A7DBBF01CD8E5D0009E9B49 /* Resources */ = { + 2AF8214D1D21D6B900D65186 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -274,44 +239,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2A1682AF1CD3F73900014B7F /* Sources */ = { + 2AF8213C1D21D6B900D65186 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2ABB72011CDA4680001FDC32 /* CMBuildOperation.swift in Sources */, - 2ABB72021CDA4680001FDC32 /* CMCompileMeasure.swift in Sources */, - 2ABB72031CDA4680001FDC32 /* CMPlugin.swift in Sources */, - 2ABB72041CDA4680001FDC32 /* CMLogProcessor.swift in Sources */, - 2A71846E1CDA483E00E8B7D3 /* NSNotificationCenter+Extensions.swift in Sources */, - 2ABB72051CDA4680001FDC32 /* CMProcessingState.swift in Sources */, - 2ABB72061CDA4680001FDC32 /* CMResultWindowController.swift in Sources */, - 2A14D30B1CDA4F380079BFF0 /* NSData+GZIP.m in Sources */, - 2ABB72071CDA4680001FDC32 /* CMXcodeWorkspace.swift in Sources */, - 2AE38C571CDA8222008B65AE /* CMRawMeasure.swift in Sources */, + 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */, + 2A3164C71D21D73F00064045 /* CMBuildOperation.swift in Sources */, + 2A3164C91D21D73F00064045 /* CMLogProcessor.swift in Sources */, + 2A3164CB1D21D73F00064045 /* CMProcessingState.swift in Sources */, + 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, + 2A3164CC1D21D73F00064045 /* CMRawMeasure.swift in Sources */, + 2A3164CD1D21D73F00064045 /* CMResultWindow.swift in Sources */, + 2A3164C81D21D73F00064045 /* CMCompileMeasure.swift in Sources */, + 2A3164D91D21D7F800064045 /* CMXcodeWorkspace.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2A7DBBEE1CD8E5D0009E9B49 /* Sources */ = { + 2AF8214B1D21D6B900D65186 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2A71846F1CDA48AB00E8B7D3 /* CMCompileMeasure.swift in Sources */, - 2A7DBBF51CD8E5D1009E9B49 /* CMCompileMeasureTests.swift in Sources */, + 2A3164D51D21D77500064045 /* NSData+GZIP.m in Sources */, + 2A3164D01D21D74A00064045 /* CMCompileMeasureTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 2A7DBBFB1CD8E705009E9B49 /* PBXTargetDependency */ = { + 2AF821511D21D6B900D65186 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 2A1682B21CD3F73900014B7F /* BuildTimeAnalyzer */; - targetProxy = 2A7DBBFA1CD8E705009E9B49 /* PBXContainerItemProxy */; + target = 2AF8213F1D21D6B900D65186 /* BuildTimeAnalyzer */; + targetProxy = 2AF821501D21D6B900D65186 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 2A1682B71CD3F73900014B7F /* Debug */ = { + 2AF821561D21D6B900D65186 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -332,7 +296,6 @@ CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - DEPLOYMENT_LOCATION = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -349,16 +312,15 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Application Support/Developer/Shared/Xcode/Plug-ins"; - MACH_O_TYPE = mh_bundle; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; - 2A1682B81CD3F73900014B7F /* Release */ = { + 2AF821571D21D6B900D65186 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -379,7 +341,6 @@ CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -390,110 +351,100 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Application Support/Developer/Shared/Xcode/Plug-ins"; - MACH_O_TYPE = mh_bundle; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; }; name = Release; }; - 2A1682BA1CD3F73900014B7F /* Debug */ = { + 2AF821591D21D6B900D65186 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; - DSTROOT = "$(HOME)"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; INFOPLIST_FILE = BuildTimeAnalyzer/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Application Support/Developer/Shared/Xcode/Plug-ins"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - OTHER_SWIFT_FLAGS = "-Xfrontend -debug-time-function-bodies"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzer; - PRODUCT_NAME = BuildTimeAnalyzer; - SKIP_INSTALL = NO; - SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzer/BuildTimeAnalyzer-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - WRAPPER_EXTENSION = xcplugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; }; name = Debug; }; - 2A1682BB1CD3F73900014B7F /* Release */ = { + 2AF8215A1D21D6B900D65186 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DSTROOT = "$(HOME)"; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; INFOPLIST_FILE = BuildTimeAnalyzer/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Application Support/Developer/Shared/Xcode/Plug-ins"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - OTHER_SWIFT_FLAGS = "-Xfrontend -debug-time-function-bodies"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzer; - PRODUCT_NAME = BuildTimeAnalyzer; - SKIP_INSTALL = NO; - SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzer/BuildTimeAnalyzer-Bridging-Header.h"; - WRAPPER_EXTENSION = xcplugin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; }; name = Release; }; - 2A7DBBF71CD8E5D1009E9B49 /* Debug */ = { + 2AF8215C1D21D6B900D65186 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = BuildTimeAnalyzerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzerTests; - PRODUCT_NAME = BuildTimeAnalyzer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BuildTimeAnalyzer.app/Contents/MacOS/BuildTimeAnalyzer"; }; name = Debug; }; - 2A7DBBF81CD8E5D1009E9B49 /* Release */ = { + 2AF8215D1D21D6B900D65186 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = BuildTimeAnalyzerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzerTests; - PRODUCT_NAME = BuildTimeAnalyzer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BuildTimeAnalyzer.app/Contents/MacOS/BuildTimeAnalyzer"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2A1682AE1CD3F73900014B7F /* Build configuration list for PBXProject "BuildTimeAnalyzer" */ = { + 2AF8213B1D21D6B900D65186 /* Build configuration list for PBXProject "BuildTimeAnalyzer" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2A1682B71CD3F73900014B7F /* Debug */, - 2A1682B81CD3F73900014B7F /* Release */, + 2AF821561D21D6B900D65186 /* Debug */, + 2AF821571D21D6B900D65186 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2A1682B91CD3F73900014B7F /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzer" */ = { + 2AF821581D21D6B900D65186 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzer" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2A1682BA1CD3F73900014B7F /* Debug */, - 2A1682BB1CD3F73900014B7F /* Release */, + 2AF821591D21D6B900D65186 /* Debug */, + 2AF8215A1D21D6B900D65186 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2A7DBBF91CD8E5D1009E9B49 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzerTests" */ = { + 2AF8215B1D21D6B900D65186 /* Build configuration list for PBXNativeTarget "BuildTimeAnalyzerTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2A7DBBF71CD8E5D1009E9B49 /* Debug */, - 2A7DBBF81CD8E5D1009E9B49 /* Release */, + 2AF8215C1D21D6B900D65186 /* Debug */, + 2AF8215D1D21D6B900D65186 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 2A1682AB1CD3F73900014B7F /* Project object */; + rootObject = 2AF821381D21D6B900D65186 /* Project object */; } diff --git a/BuildTimeAnalyzer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BuildTimeAnalyzer.xcodeproj/project.xcworkspace/contents.xcworkspacedata index b48bd57..3637b15 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/BuildTimeAnalyzer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:BuildTimeAnalyzer.xcodeproj"> diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift new file mode 100644 index 0000000..06e1ab0 --- /dev/null +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -0,0 +1,27 @@ +// +// AppDelegate.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 27/06/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + @IBOutlet weak var window: NSWindow! + + + func applicationDidFinishLaunching(aNotification: NSNotification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(aNotification: NSNotification) { + // Insert code here to tear down your application + } + + +} + diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2db2b1c --- /dev/null +++ b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BuildTimeAnalyzer/Icons.xcassets/Contents.json b/BuildTimeAnalyzer/Assets.xcassets/Contents.json similarity index 100% rename from BuildTimeAnalyzer/Icons.xcassets/Contents.json rename to BuildTimeAnalyzer/Assets.xcassets/Contents.json diff --git a/BuildTimeAnalyzer/Icons.xcassets/ScreenShot.imageset/Contents.json b/BuildTimeAnalyzer/Assets.xcassets/ScreenShot.imageset/Contents.json similarity index 100% rename from BuildTimeAnalyzer/Icons.xcassets/ScreenShot.imageset/Contents.json rename to BuildTimeAnalyzer/Assets.xcassets/ScreenShot.imageset/Contents.json diff --git a/BuildTimeAnalyzer/Icons.xcassets/ScreenShot.imageset/Screen Shot.png b/BuildTimeAnalyzer/Assets.xcassets/ScreenShot.imageset/Screen Shot.png similarity index 100% rename from BuildTimeAnalyzer/Icons.xcassets/ScreenShot.imageset/Screen Shot.png rename to BuildTimeAnalyzer/Assets.xcassets/ScreenShot.imageset/Screen Shot.png diff --git a/BuildTimeAnalyzer/CMLogProcessor.swift b/BuildTimeAnalyzer/CMLogProcessor.swift index 14c7999..e3877e2 100644 --- a/BuildTimeAnalyzer/CMLogProcessor.swift +++ b/BuildTimeAnalyzer/CMLogProcessor.swift @@ -6,12 +6,14 @@ // Copyright © 2016 Robert Gummesson. All rights reserved. // +import Foundation + typealias CMUpdateClosure = (result: [CMCompileMeasure], didComplete: Bool) -> () protocol CMLogProcessorProtocol: class { var rawMeasures: [String: CMRawMeasure] { get set } var updateHandler: CMUpdateClosure? { get set } - var workspace: CMXcodeWorkSpace? { get set } +// var workspace: CMXcodeWorkSpace? { get set } var shouldCancel: Bool { get set } func processingDidStart() @@ -20,18 +22,18 @@ protocol CMLogProcessorProtocol: class { extension CMLogProcessorProtocol { func process(productName: String, buildCompletionDate: NSDate?, updateHandler: CMUpdateClosure?) { - workspace = CMXcodeWorkSpace(productName: productName, buildCompletionDate: buildCompletionDate) - workspace?.logTextForProduct() { [weak self] (text) in - guard let text = text else { - updateHandler?(result: [], didComplete: true) - return - } - - self?.updateHandler = updateHandler - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { - self?.process(text: text) - } - } +// workspace = CMXcodeWorkSpace(productName: productName, buildCompletionDate: buildCompletionDate) +// workspace?.logTextForProduct() { [weak self] (text) in +// guard let text = text else { +// updateHandler?(result: [], didComplete: true) +// return +// } +// +// self?.updateHandler = updateHandler +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { +// self?.process(text: text) +// } +// } } // MARK: Private methods @@ -111,7 +113,7 @@ class CMLogProcessor: NSObject, CMLogProcessorProtocol { var rawMeasures: [String: CMRawMeasure] = [:] var updateHandler: CMUpdateClosure? - var workspace: CMXcodeWorkSpace? +// var workspace: CMXcodeWorkSpace? var shouldCancel = false var timer: NSTimer? diff --git a/BuildTimeAnalyzer/CMPlugin.swift b/BuildTimeAnalyzer/CMPlugin.swift deleted file mode 100644 index 4ad85ea..0000000 --- a/BuildTimeAnalyzer/CMPlugin.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// CMPlugin.swift -// CMPlugin -// -// Created by Robert Gummesson on 29/04/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// - -import AppKit - -class CMPlugin: NSObject { - - static var sharedPlugin: CMPlugin? - var windowController: CMResultWindowController? - - var applicationDidFinishLaunchingObserver: AnyObject? - var startStateDescription = "" - - class func pluginDidLoad(bundle: NSBundle) { - let appName = NSBundle.mainBundle().infoDictionary?["CFBundleName"] as? String - if appName == "Xcode" && sharedPlugin == nil { - sharedPlugin = CMPlugin() - } - } - - override init() { - super.init() - - applicationDidFinishLaunchingObserver = NSNotificationCenter.addObserverForName(NSApplicationDidFinishLaunchingNotification, usingBlock: { [unowned self] _ in - self.createMenuItem() - }) - } - - deinit { - NSNotificationCenter.removeObserver(applicationDidFinishLaunchingObserver, name: NSApplicationDidFinishLaunchingNotification) - } - - func createMenuItem() { - guard let submenu = NSApp.mainMenu?.itemWithTitle("View")?.submenu else { return } - - let title = NSLocalizedString("Build Time Analyzer", comment: "") - let menuItem = NSMenuItem(title: title, action: #selector(showWindow), keyEquivalent: "") - menuItem.target = self - menuItem.keyEquivalent = "b" - menuItem.keyEquivalentModifierMask = Int(NSEventModifierFlags.ShiftKeyMask.rawValue | NSEventModifierFlags.ControlKeyMask.rawValue) - submenu.addItem(menuItem) - } - - func showWindow() { - guard windowController == nil else { - windowController?.resultWindow.close() - return - } - - windowController = CMResultWindowController(windowNibName: "CMResultWindow") - windowController?.show() - - if let window = windowController?.resultWindow { - NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(windowWillClose(_:)), name: NSWindowWillCloseNotification, object: window) - } - } - - func windowWillClose(notification: NSNotification) { - NSNotificationCenter.defaultCenter().removeObserver(self, name: NSWindowWillCloseNotification, object: notification.object as? NSWindow) - windowController = nil - } -} \ No newline at end of file diff --git a/BuildTimeAnalyzer/CMResultWindowController.swift b/BuildTimeAnalyzer/CMResultWindow.swift similarity index 62% rename from BuildTimeAnalyzer/CMResultWindowController.swift rename to BuildTimeAnalyzer/CMResultWindow.swift index ff5e909..1e6f7bd 100644 --- a/BuildTimeAnalyzer/CMResultWindowController.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -8,7 +8,7 @@ import Cocoa -class CMResultWindowController: NSWindowController { +class CMResultWindow: NSWindow { let IDEBuildOperationWillStartNotification = "IDEBuildOperationWillStartNotification" let IDEBuildOperationDidGenerateOutputFilesNotification = "IDEBuildOperationDidGenerateOutputFilesNotification" @@ -17,7 +17,6 @@ class CMResultWindowController: NSWindowController { @IBOutlet weak var instructionsView: NSView! @IBOutlet weak var statusTextField: NSTextField! @IBOutlet weak var progressIndicator: NSProgressIndicator! - @IBOutlet weak var resultWindow: NSWindow! @IBOutlet weak var tableViewContainerView: NSScrollView! @IBOutlet weak var buildDurationTextField: NSTextField! @IBOutlet weak var cancelButton: NSButton! @@ -27,8 +26,8 @@ class CMResultWindowController: NSWindowController { var filteredData: [CMCompileMeasure]? = nil var processor: CMLogProcessor = CMLogProcessor() - var buildOperationWillStartObserver: AnyObject? - var buildOperationDidGenerateOutputFilesObserver: AnyObject? +// var buildOperationWillStartObserver: AnyObject? +// var buildOperationDidGenerateOutputFilesObserver: AnyObject? var processingState: CMProcessingState = .completed(stateName: CMProcessingState.completedString) { didSet { @@ -36,30 +35,30 @@ class CMResultWindowController: NSWindowController { } } - override func windowDidLoad() { - super.windowDidLoad() + override func awakeFromNib() { + super.awakeFromNib() statusTextField.stringValue = CMProcessingState.waitingForBuildString } - - deinit { - removeObservers() - } - - func show() { - showWindow(self) - addObservers() - - // Get currentProduct needs to be run before resultWindow.makeMainWindow() - if let currentProduct = CMXcodeWorkSpace.currentProductName() { - processLog(currentProduct) - } - - if let window = resultWindow { - window.makeMainWindow() - window.level = Int(CGWindowLevelKey.OverlayWindowLevelKey.rawValue) - updateViewForState() - } - } +// +// deinit { +// removeObservers() +// } +// +// func show() { +// showWindow(self) +// addObservers() +// +// // Get currentProduct needs to be run before resultWindow.makeMainWindow() +// if let currentProduct = CMXcodeWorkSpace.currentProductName() { +// processLog(currentProduct) +// } +// +// if let window = resultWindow { +// window.makeMainWindow() +// window.level = Int(CGWindowLevelKey.OverlayWindowLevelKey.rawValue) +// updateViewForState() +// } +// } func processLog(productName: String, buildCompletionDate: NSDate? = nil) { guard processingState != .processing else { return } @@ -118,7 +117,7 @@ class CMResultWindowController: NSWindowController { progressIndicator.hidden = show tableViewContainerView.hidden = show } - + // MARK: Actions @IBAction func clipboardButtonClicked(sender: AnyObject) { @@ -127,36 +126,36 @@ class CMResultWindowController: NSWindowController { } @IBAction func cancelButtonClicked(sender: AnyObject) { - processor.shouldCancel = true - } - // MARK: Observers - - func addObservers() { - buildOperationWillStartObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationWillStartNotification, usingBlock: { [weak self] (note) in - if let stateDescription = note.object?.valueForKeyPath("_buildStatus._stateDescription") as? String { - self?.processingState = .waiting(shouldIndicate: stateDescription == "Build") - } - }) - - buildOperationDidGenerateOutputFilesObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationDidGenerateOutputFilesNotification, usingBlock: { [weak self] (note) in - guard let buildOperation = CMXcodeWorkSpace.buildOperation(fromData: note.object) else { return } - let result = buildOperation.result - let action = buildOperation.actionName - - guard (action == "Build" || action == "Compile") && (result == .success || result == .failed || result == .cancelled) else { - self?.processingState = .waiting(shouldIndicate: false) - return - } - - self?.buildDurationTextField.stringValue = String(format: "%.0fs", round(buildOperation.duration)) - self?.processLog(buildOperation.productName, buildCompletionDate: buildOperation.endTime) - }) - } - - func removeObservers() { - NSNotificationCenter.removeObserver(buildOperationWillStartObserver, name: IDEBuildOperationWillStartNotification) - NSNotificationCenter.removeObserver(buildOperationDidGenerateOutputFilesObserver, name: IDEBuildOperationWillStartNotification) +// processor.shouldCancel = true } +// // MARK: Observers +// +// func addObservers() { +// buildOperationWillStartObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationWillStartNotification, usingBlock: { [weak self] (note) in +// if let stateDescription = note.object?.valueForKeyPath("_buildStatus._stateDescription") as? String { +// self?.processingState = .waiting(shouldIndicate: stateDescription == "Build") +// } +// }) +// +// buildOperationDidGenerateOutputFilesObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationDidGenerateOutputFilesNotification, usingBlock: { [weak self] (note) in +// guard let buildOperation = CMXcodeWorkSpace.buildOperation(fromData: note.object) else { return } +// let result = buildOperation.result +// let action = buildOperation.actionName +// +// guard (action == "Build" || action == "Compile") && (result == .success || result == .failed || result == .cancelled) else { +// self?.processingState = .waiting(shouldIndicate: false) +// return +// } +// +// self?.buildDurationTextField.stringValue = String(format: "%.0fs", round(buildOperation.duration)) +// self?.processLog(buildOperation.productName, buildCompletionDate: buildOperation.endTime) +// }) +// } +// +// func removeObservers() { +// NSNotificationCenter.removeObserver(buildOperationWillStartObserver, name: IDEBuildOperationWillStartNotification) +// NSNotificationCenter.removeObserver(buildOperationDidGenerateOutputFilesObserver, name: IDEBuildOperationWillStartNotification) +// } override func controlTextDidChange(obj: NSNotification) { guard let field = obj.object as? NSSearchField where field == searchField else { return } @@ -164,19 +163,19 @@ class CMResultWindowController: NSWindowController { filteredData = field.stringValue.isEmpty ? nil : dataSource.filter{ textContains($0.code) || textContains($0.filename) } tableView.reloadData() } - + func textContains(text: String) -> Bool { return text.lowercaseString.containsString(searchField.stringValue.lowercaseString) } } -extension CMResultWindowController: NSTableViewDataSource { +extension CMResultWindow: NSTableViewDataSource { func numberOfRowsInTableView(tableView: NSTableView) -> Int { return filteredData?.count ?? dataSource.count } } -extension CMResultWindowController: NSTableViewDelegate { +extension CMResultWindow: NSTableViewDelegate { func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { guard let tableColumn = tableColumn, columnIndex = tableView.tableColumns.indexOf(tableColumn) else { return nil } @@ -188,19 +187,19 @@ extension CMResultWindowController: NSTableViewDelegate { } func tableView(tableView: NSTableView, shouldSelectRow row: Int) -> Bool { - let item = filteredData?[row] ?? dataSource[row] - processor.workspace?.openFile(atPath: item.path, andLineNumber: item.location, focusLostHandler: { [weak self] in - self?.resultWindow.makeKeyWindow() - }) +// let item = filteredData?[row] ?? dataSource[row] +// processor.workspace?.openFile(atPath: item.path, andLineNumber: item.location, focusLostHandler: { [weak self] in +// self?.resultWindow.makeKeyWindow() +// }) return true } } -extension CMResultWindowController: NSWindowDelegate { +extension CMResultWindow: NSWindowDelegate { func windowWillClose(notification: NSNotification) { - processor.shouldCancel = true - processingState = .completed(stateName: CMProcessingState.cancelledString) - removeObservers() +// processor.shouldCancel = true +// processingState = .completed(stateName: CMProcessingState.cancelledString) +// removeObservers() } } diff --git a/BuildTimeAnalyzer/CMResultWindow.xib b/BuildTimeAnalyzer/CMResultWindow.xib index f70a9ed..564fc52 100644 --- a/BuildTimeAnalyzer/CMResultWindow.xib +++ b/BuildTimeAnalyzer/CMResultWindow.xib @@ -5,22 +5,10 @@ - - - - - - - - - - - - - + - + @@ -195,8 +183,8 @@ - - + + @@ -244,7 +232,7 @@ Gw - + @@ -300,7 +288,7 @@ Gw - + @@ -338,7 +326,7 @@ Gw - + @@ -371,7 +359,14 @@ Gw - + + + + + + + + diff --git a/BuildTimeAnalyzer/Info.plist b/BuildTimeAnalyzer/Info.plist index d6396a2..bd4b6d9 100644 --- a/BuildTimeAnalyzer/Info.plist +++ b/BuildTimeAnalyzer/Info.plist @@ -6,6 +6,8 @@ en CFBundleExecutable $(EXECUTABLE_NAME) + CFBundleIconFile + CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -13,29 +15,20 @@ CFBundleName $(PRODUCT_NAME) CFBundlePackageType - BNDL + APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 - DVTPlugInCompatibilityUUIDs - - ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C - F41BD31E-2683-44B8-AE7F-5F09E919790E - + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright - Copyright © 2016 Cane Media. All rights reserved. + Copyright © 2016 Cane Media Ltd. All rights reserved. + NSMainNibFile + CMResultWindow NSPrincipalClass - CompileTime - LSApplicationCategoryType - - XC4Compatible - - XCGCReady - - XCPluginHasUI - + NSApplication diff --git a/BuildTimeAnalyzerTests-Bridging-Header.h b/BuildTimeAnalyzerTests-Bridging-Header.h new file mode 100644 index 0000000..299d190 --- /dev/null +++ b/BuildTimeAnalyzerTests-Bridging-Header.h @@ -0,0 +1,5 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "NSData+GZIP.h" \ No newline at end of file diff --git a/BuildTimeAnalyzerTests/CMCompileMeasureTests.swift b/BuildTimeAnalyzerTests/CMCompileMeasureTests.swift index 240c700..53d74c7 100644 --- a/BuildTimeAnalyzerTests/CMCompileMeasureTests.swift +++ b/BuildTimeAnalyzerTests/CMCompileMeasureTests.swift @@ -8,6 +8,8 @@ import XCTest +@testable import BuildTimeAnalyzer + class BuildTimeAnalyzerTests: XCTestCase { func testInit() { From 1dbbc1bf912de52fd523bc495a970f672118b3a7 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 28 Jun 2016 22:24:40 +0100 Subject: [PATCH 02/48] adjusting to accept derived data log files --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 8 ++ BuildTimeAnalyzer/CMFileManager.swift | 56 ++++++++ BuildTimeAnalyzer/CMLogProcessor.swift | 30 ++--- BuildTimeAnalyzer/CMResultWindow.swift | 44 ++++--- BuildTimeAnalyzer/CMXcodeWorkspace.swift | 138 ++++++++------------ BuildTimeAnalyzer/NSDate+Comparable.swift | 19 +++ 6 files changed, 177 insertions(+), 118 deletions(-) create mode 100644 BuildTimeAnalyzer/CMFileManager.swift create mode 100644 BuildTimeAnalyzer/NSDate+Comparable.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index d3a493c..19ec79a 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ 2A3164D51D21D77500064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; 2A3164D91D21D7F800064045 /* CMXcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */; }; 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; + 2AE775121D225D5D00D1A744 /* CMFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775111D225D5D00D1A744 /* CMFileManager.swift */; }; + 2AE775141D227D6C00D1A744 /* NSDate+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */; }; 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AF821431D21D6B900D65186 /* AppDelegate.swift */; }; 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2AF821451D21D6B900D65186 /* Assets.xcassets */; }; /* End PBXBuildFile section */ @@ -45,6 +47,8 @@ 2A3164D31D21D77500064045 /* NSData+GZIP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GZIP.h"; path = "GZIP/NSData+GZIP.h"; sourceTree = ""; }; 2A3164D41D21D77500064045 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "GZIP/NSData+GZIP.m"; sourceTree = ""; }; 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMXcodeWorkspace.swift; sourceTree = ""; }; + 2AE775111D225D5D00D1A744 /* CMFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMFileManager.swift; sourceTree = ""; }; + 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDate+Comparable.swift"; sourceTree = ""; }; 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BuildTimeAnalyzer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 2AF821431D21D6B900D65186 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 2AF821451D21D6B900D65186 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = BuildTimeAnalyzer/Assets.xcassets; sourceTree = ""; }; @@ -123,12 +127,14 @@ 2AF821431D21D6B900D65186 /* AppDelegate.swift */, 2A3164BF1D21D73F00064045 /* CMBuildOperation.swift */, 2A3164C01D21D73F00064045 /* CMCompileMeasure.swift */, + 2AE775111D225D5D00D1A744 /* CMFileManager.swift */, 2A3164C11D21D73F00064045 /* CMLogProcessor.swift */, 2A3164C31D21D73F00064045 /* CMProcessingState.swift */, 2A3164C41D21D73F00064045 /* CMRawMeasure.swift */, 2A3164C51D21D73F00064045 /* CMResultWindow.swift */, 2A3164C61D21D73F00064045 /* CMResultWindow.xib */, 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */, + 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */, 2A3164D11D21D74F00064045 /* Supporting Files */, ); path = BuildTimeAnalyzer; @@ -248,6 +254,8 @@ 2A3164C91D21D73F00064045 /* CMLogProcessor.swift in Sources */, 2A3164CB1D21D73F00064045 /* CMProcessingState.swift in Sources */, 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, + 2AE775141D227D6C00D1A744 /* NSDate+Comparable.swift in Sources */, + 2AE775121D225D5D00D1A744 /* CMFileManager.swift in Sources */, 2A3164CC1D21D73F00064045 /* CMRawMeasure.swift in Sources */, 2A3164CD1D21D73F00064045 /* CMResultWindow.swift in Sources */, 2A3164C81D21D73F00064045 /* CMCompileMeasure.swift in Sources */, diff --git a/BuildTimeAnalyzer/CMFileManager.swift b/BuildTimeAnalyzer/CMFileManager.swift new file mode 100644 index 0000000..6b49e3e --- /dev/null +++ b/BuildTimeAnalyzer/CMFileManager.swift @@ -0,0 +1,56 @@ +// +// CMFileManager.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 28/06/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Foundation + +struct CMFile { + let name: String + let path: String + let modificationDate: NSDate +} + +class CMFileManager { + + // TODO: Replace with a cache + static private let derivedDataLocation = "\(NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0])/Developer/Xcode/DerivedData" + + static func listCacheFiles() -> [CMFile] { + let cacheFiles = getCacheFiles(at: NSURL(fileURLWithPath: derivedDataLocation)) + let earliestDate = NSDate().dateByAddingTimeInterval(-24 * 60 * 60) + return filterFiles(cacheFiles, byEarliestDate: earliestDate) + } + + static private func getCacheFiles(at url: NSURL) -> [CMFile] { + let fileManager = NSFileManager.defaultManager() + let keys = [NSURLNameKey, NSURLIsDirectoryKey] + let options: NSDirectoryEnumerationOptions = [.SkipsHiddenFiles, .SkipsPackageDescendants, .SkipsSubdirectoryDescendants] + + guard let enumerator = fileManager.enumeratorAtURL(url, includingPropertiesForKeys: keys, options: options, errorHandler: nil) else { return [] } + var result: [CMFile] = [] + for case let fileURL as NSURL in enumerator { + if let cachePath = fileURL.URLByAppendingPathComponent("Logs/Build/Cache.db").path, + let name = fileURL.lastPathComponent, + let properties = try? fileManager.attributesOfItemAtPath(cachePath), + let modificationDate = properties[NSFileModificationDate] as? NSDate { + result.append(CMFile(name: name, path: cachePath, modificationDate: modificationDate)) + } + } + return result + } + + static private func filterFiles(files: [CMFile], byEarliestDate date: NSDate) -> [CMFile] { + guard files.count > 0 else { return [] } + + let sortedFiles = files.sort({ $0.modificationDate > $1.modificationDate }) + let recentFiles = sortedFiles.filter({ $0.modificationDate > date }) + if recentFiles.count == 0 { + return [sortedFiles[0]] + } + return recentFiles + } +} \ No newline at end of file diff --git a/BuildTimeAnalyzer/CMLogProcessor.swift b/BuildTimeAnalyzer/CMLogProcessor.swift index e3877e2..09adc99 100644 --- a/BuildTimeAnalyzer/CMLogProcessor.swift +++ b/BuildTimeAnalyzer/CMLogProcessor.swift @@ -13,7 +13,7 @@ typealias CMUpdateClosure = (result: [CMCompileMeasure], didComplete: Bool) -> ( protocol CMLogProcessorProtocol: class { var rawMeasures: [String: CMRawMeasure] { get set } var updateHandler: CMUpdateClosure? { get set } -// var workspace: CMXcodeWorkSpace? { get set } + var workspace: CMXcodeWorkSpace? { get set } var shouldCancel: Bool { get set } func processingDidStart() @@ -21,19 +21,19 @@ protocol CMLogProcessorProtocol: class { } extension CMLogProcessorProtocol { - func process(productName: String, buildCompletionDate: NSDate?, updateHandler: CMUpdateClosure?) { -// workspace = CMXcodeWorkSpace(productName: productName, buildCompletionDate: buildCompletionDate) -// workspace?.logTextForProduct() { [weak self] (text) in -// guard let text = text else { -// updateHandler?(result: [], didComplete: true) -// return -// } -// -// self?.updateHandler = updateHandler -// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { -// self?.process(text: text) -// } -// } + func processCacheFile(at path: String, updateHandler: CMUpdateClosure?) { + workspace = CMXcodeWorkSpace() + workspace?.logText(forCacheAtPath: path) { [weak self] (text) in + guard let text = text else { + updateHandler?(result: [], didComplete: true) + return + } + + self?.updateHandler = updateHandler + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + self?.process(text: text) + } + } } // MARK: Private methods @@ -113,7 +113,7 @@ class CMLogProcessor: NSObject, CMLogProcessorProtocol { var rawMeasures: [String: CMRawMeasure] = [:] var updateHandler: CMUpdateClosure? -// var workspace: CMXcodeWorkSpace? + var workspace: CMXcodeWorkSpace? var shouldCancel = false var timer: NSTimer? diff --git a/BuildTimeAnalyzer/CMResultWindow.swift b/BuildTimeAnalyzer/CMResultWindow.swift index 1e6f7bd..4239db7 100644 --- a/BuildTimeAnalyzer/CMResultWindow.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -35,9 +35,32 @@ class CMResultWindow: NSWindow { } } + static var odd = true + override func awakeFromNib() { super.awakeFromNib() statusTextField.stringValue = CMProcessingState.waitingForBuildString + + if CMResultWindow.odd { + CMResultWindow.odd = false + self.start() + } + } + + func start() { + let cacheFiles = CMFileManager.listCacheFiles() + processingState = .processing + processor.processCacheFile(at: cacheFiles[1].path) { [weak self] (result, didComplete) in + guard let strongSelf = self else { return } + + strongSelf.dataSource = result + strongSelf.tableView.reloadData() + + if didComplete { + let stateName = strongSelf.dataSource.isEmpty ? CMProcessingState.failedString : CMProcessingState.completedString + strongSelf.processingState = .completed(stateName: stateName) + } + } } // // deinit { @@ -60,27 +83,6 @@ class CMResultWindow: NSWindow { // } // } - func processLog(productName: String, buildCompletionDate: NSDate? = nil) { - guard processingState != .processing else { return } - processingState = .processing - - dataSource.removeAll() - searchField.stringValue = "" - tableView.reloadData() - - processor.process(productName, buildCompletionDate: buildCompletionDate, updateHandler: { [weak self] (result, didComplete) in - guard let strongSelf = self else { return } - - strongSelf.dataSource = result - strongSelf.tableView.reloadData() - - if didComplete { - let stateName = strongSelf.dataSource.isEmpty ? CMProcessingState.failedString : CMProcessingState.completedString - strongSelf.processingState = .completed(stateName: stateName) - } - }) - } - func updateViewForState() { switch processingState { case .processing: diff --git a/BuildTimeAnalyzer/CMXcodeWorkspace.swift b/BuildTimeAnalyzer/CMXcodeWorkspace.swift index 1b729ee..87021ba 100644 --- a/BuildTimeAnalyzer/CMXcodeWorkspace.swift +++ b/BuildTimeAnalyzer/CMXcodeWorkspace.swift @@ -10,51 +10,44 @@ import Cocoa protocol CMXcodeWorkspaceProtocol { var retryAttempts: Int { get } - var productName: String { get set } - var buildCompletionDate: NSDate? { get set } var focusLostHandler: (() -> ())? { get set } - init(productName: String, buildCompletionDate: NSDate?) func willOpenDocument(atLineNumber lineNumber: Int, usingTextView textView: NSTextView?) } extension CMXcodeWorkspaceProtocol { - func logTextForProduct(attemptIndex: Int = 0, completionHandler: ((text: String?) -> ())) { - guard let buildFolderPath = buildFolderPath(), - let buildFolderURL = NSURL(string: buildFolderPath), - let filenames = filesAtURL(buildFolderURL) else { - completionHandler(text: nil) - return - } - - var keyFilename: String? - var creationDates: [String: NSDate] = [:] - parseFiles(filenames, buildFolderURL: buildFolderURL, keyFilename: &keyFilename, creationDates: &creationDates) - - var lastLogPath: String? - var lastLogCreationDate: NSDate? - if let keyFilename = keyFilename, filename = buildFolderURL.URLByAppendingPathComponent(keyFilename).path { - lastLogPath = filename - lastLogCreationDate = creationDates[keyFilename] - } - validatePath(lastLogPath, creationDate: lastLogCreationDate, attemptIndex: attemptIndex, completionHandler: completionHandler) - } - - func productWorkspace() -> AnyObject? { - guard let windowControllers = Self.workspaceWindowControllers() else { return nil } - guard let keyWindow = windowControllers.filter({ ($0.valueForKeyPath("_workspace.name") as? String) == productName }).first else { - return locateWorkspace(fromWindowControllers: windowControllers) + func logText(forCacheAtPath path: String, completionHandler: ((text: String?) -> ())) { + guard let lastBuild = lastBuildKey(fromPath: path), + let folderURL = NSURL(fileURLWithPath: path).URLByDeletingLastPathComponent, + let logFile = folderURL.URLByAppendingPathComponent(lastBuild).URLByAppendingPathExtension("xcactivitylog").path else { + completionHandler(text: nil) + return } - return keyWindow.valueForKey("_workspace") - } - - func buildFolderFromWorkspace(workspace: AnyObject?) -> NSURL? { - return (workspace?.valueForKeyPath("_workspaceArena.logFolderPath.fileURL") as? NSURL)?.URLByAppendingPathComponent("Build") + completionHandler(text: contentsOfFile(logFile)) } - func buildFolderPath() -> String? { - return buildFolderFromWorkspace(productWorkspace())?.path + func logTextForProduct(attemptIndex: Int = 0, completionHandler: ((text: String?) -> ())) { +// guard let buildFolderPath = buildFolderPath(), +// let buildFolderURL = NSURL(string: buildFolderPath) else { +// completionHandler(text: nil) +// return +// } +// +// let files = CMFileManager.listFiles(at: buildFolderURL) +// guard files.count > 0 else { return } +// +// var keyFilename: String? +// var creationDates: [String: NSDate] = [:] +// parseFiles(files.map{ $0.path }, buildFolderURL: buildFolderURL, keyFilename: &keyFilename, creationDates: &creationDates) +// +// var lastLogPath: String? +// var lastLogCreationDate: NSDate? +// if let keyFilename = keyFilename, filename = buildFolderURL.URLByAppendingPathComponent(keyFilename).path { +// lastLogPath = filename +// lastLogCreationDate = creationDates[keyFilename] +// } +// validatePath(lastLogPath, creationDate: lastLogCreationDate, attemptIndex: attemptIndex, completionHandler: completionHandler) } mutating func openFile(atPath path: String, andLineNumber lineNumber: Int, focusLostHandler: () -> ()) { @@ -129,50 +122,38 @@ extension CMXcodeWorkspaceProtocol { // MARK: Private methods private func locateWorkspace(fromWindowControllers windowControllers: [AnyObject]) -> AnyObject? { - if windowControllers.count == 1 { - return windowControllers.first?.valueForKey("_workspace") - } else { - for controller in windowControllers { - if let workspace = controller.valueForKey("_workspace"), - let logFolderURL = buildFolderFromWorkspace(workspace), - let files = filesAtURL(logFolderURL), - let filename = files.filter({ $0.hasSuffix(".db") }).first, - let path = logFolderURL.URLByAppendingPathComponent(filename).path, - let schemeName = lastSchemeName(fromPath: path) where schemeName == productName { - return workspace - } - } - } +// if windowControllers.count == 1 { +// return windowControllers.first?.valueForKey("_workspace") +// } else { +// for controller in windowControllers { +// if let workspace = controller.valueForKey("_workspace"), +// let logFolderURL = buildFolderFromWorkspace(workspace), +// let files = CMFileManager.listFiles(at: logFolderURL), +// let filename = files.filter({ $0.path.hasSuffix(".db") }).first, +// let path = logFolderURL.URLByAppendingPathComponent(filename.path).path, +// let schemeName = lastSchemeName(fromPath: path) where schemeName == productName { +// return workspace +// } +// } +// } return nil } - private func filesAtURL(url: NSURL) -> [String]? { - guard let path = url.path, enumerator = NSFileManager.defaultManager().enumeratorAtPath(path) else { return nil } - - var result: [String] = [] - for file in enumerator { - if let filename = file as? String { - result.append(filename) - } - } - return result - } - private func validatePath(path: String?, creationDate: NSDate?, attemptIndex: Int, completionHandler: ((text: String?) -> ())) { - if let path = path, creationDate = creationDate where buildCompletionDate == nil || buildCompletionDate?.compare(creationDate) == .OrderedAscending || buildCompletionDate?.compare(creationDate) == .OrderedSame { - completionHandler(text: contentsOfFile(path)) - return - } else if buildCompletionDate != nil { - let attemptIndex = attemptIndex + 1 - if attemptIndex < retryAttempts { - let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC)) - dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { - self.logTextForProduct(attemptIndex, completionHandler: completionHandler) - } - return - } - } - completionHandler(text: nil) +// if let path = path, creationDate = creationDate where buildCompletionDate == nil || buildCompletionDate?.compare(creationDate) == .OrderedAscending || buildCompletionDate?.compare(creationDate) == .OrderedSame { +// completionHandler(text: contentsOfFile(path)) +// return +// } else if buildCompletionDate != nil { +// let attemptIndex = attemptIndex + 1 +// if attemptIndex < retryAttempts { +// let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC)) +// dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { +// self.logTextForProduct(attemptIndex, completionHandler: completionHandler) +// } +// return +// } +// } +// completionHandler(text: nil) } private func parseFiles(filenames: [String], buildFolderURL: NSURL, inout keyFilename: String?, inout creationDates: [String: NSDate]) { @@ -242,16 +223,9 @@ class CMXcodeWorkSpace: NSObject, CMXcodeWorkspaceProtocol { let notificationName = "IDESourceCodeEditorDidFinishSetup" var retryAttempts = 10 - var productName: String - var buildCompletionDate: NSDate? var lineNumber = 0 var focusLostHandler: (() -> ())? - required init(productName: String, buildCompletionDate: NSDate?) { - self.productName = productName - self.buildCompletionDate = buildCompletionDate - } - deinit { NSNotificationCenter.defaultCenter().removeObserver(self, name: notificationName, object: nil) } diff --git a/BuildTimeAnalyzer/NSDate+Comparable.swift b/BuildTimeAnalyzer/NSDate+Comparable.swift new file mode 100644 index 0000000..1881598 --- /dev/null +++ b/BuildTimeAnalyzer/NSDate+Comparable.swift @@ -0,0 +1,19 @@ +// +// NSDate+Comparable.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 28/06/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Foundation + +extension NSDate: Comparable { } + +public func ==(lhs: NSDate, rhs: NSDate) -> Bool { + return lhs.compare(rhs) == .OrderedSame +} + +public func <(lhs: NSDate, rhs: NSDate) -> Bool { + return lhs.compare(rhs) == .OrderedAscending +} \ No newline at end of file From 92b1194f7b9278540060917da04b955ef440a66b Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 13:58:08 +0100 Subject: [PATCH 03/48] cache derived data location --- BuildTimeAnalyzer/CMFileManager.swift | 20 +++++- BuildTimeAnalyzer/CMResultWindow.swift | 96 ++++++-------------------- BuildTimeAnalyzer/CMResultWindow.xib | 2 +- 3 files changed, 42 insertions(+), 76 deletions(-) diff --git a/BuildTimeAnalyzer/CMFileManager.swift b/BuildTimeAnalyzer/CMFileManager.swift index 6b49e3e..b3b45c1 100644 --- a/BuildTimeAnalyzer/CMFileManager.swift +++ b/BuildTimeAnalyzer/CMFileManager.swift @@ -16,8 +16,24 @@ struct CMFile { class CMFileManager { - // TODO: Replace with a cache - static private let derivedDataLocation = "\(NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0])/Developer/Xcode/DerivedData" + static private var _derivedDataLocation: String? + static private let DerivedDataLocationKey = "DerivedDataLocationKey" + + static var derivedDataLocation: String { + get { + if _derivedDataLocation == nil { + _derivedDataLocation = NSUserDefaults.standardUserDefaults().stringForKey(DerivedDataLocationKey) + } + if _derivedDataLocation == nil, let libraryFolder = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true).first { + _derivedDataLocation = "\(libraryFolder)/Developer/Xcode/DerivedData" + } + return _derivedDataLocation ?? "" + } + set { + NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: DerivedDataLocationKey) + NSUserDefaults.standardUserDefaults().synchronize() + } + } static func listCacheFiles() -> [CMFile] { let cacheFiles = getCacheFiles(at: NSURL(fileURLWithPath: derivedDataLocation)) diff --git a/BuildTimeAnalyzer/CMResultWindow.swift b/BuildTimeAnalyzer/CMResultWindow.swift index 4239db7..d2b8c9c 100644 --- a/BuildTimeAnalyzer/CMResultWindow.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -22,12 +22,10 @@ class CMResultWindow: NSWindow { @IBOutlet weak var cancelButton: NSButton! @IBOutlet weak var searchField: NSSearchField! - var dataSource: [CMCompileMeasure] = [] - var filteredData: [CMCompileMeasure]? = nil - var processor: CMLogProcessor = CMLogProcessor() - -// var buildOperationWillStartObserver: AnyObject? -// var buildOperationDidGenerateOutputFilesObserver: AnyObject? + private var dataSource: [CMCompileMeasure] = [] + private var filteredData: [CMCompileMeasure]? = nil + private var processor: CMLogProcessor = CMLogProcessor() + private var cacheFiles: [CMFile]? var processingState: CMProcessingState = .completed(stateName: CMProcessingState.completedString) { didSet { @@ -35,53 +33,34 @@ class CMResultWindow: NSWindow { } } - static var odd = true - override func awakeFromNib() { super.awakeFromNib() + guard self.cacheFiles == nil else { return } + statusTextField.stringValue = CMProcessingState.waitingForBuildString - if CMResultWindow.odd { - CMResultWindow.odd = false - self.start() + let cacheFiles = CMFileManager.listCacheFiles() + if let cacheFile = cacheFiles.first { + processCacheFile(cacheFile) } + self.cacheFiles = cacheFiles } - func start() { - let cacheFiles = CMFileManager.listCacheFiles() + func processCacheFile(cacheFile: CMFile) { processingState = .processing - processor.processCacheFile(at: cacheFiles[1].path) { [weak self] (result, didComplete) in - guard let strongSelf = self else { return } + + processor.processCacheFile(at: cacheFile.path) { [weak self] (result, didComplete) in + guard let `self` = self else { return } - strongSelf.dataSource = result - strongSelf.tableView.reloadData() + self.dataSource = result + self.tableView.reloadData() if didComplete { - let stateName = strongSelf.dataSource.isEmpty ? CMProcessingState.failedString : CMProcessingState.completedString - strongSelf.processingState = .completed(stateName: stateName) + let stateName = self.dataSource.isEmpty ? CMProcessingState.failedString : CMProcessingState.completedString + self.processingState = .completed(stateName: stateName) } } } -// -// deinit { -// removeObservers() -// } -// -// func show() { -// showWindow(self) -// addObservers() -// -// // Get currentProduct needs to be run before resultWindow.makeMainWindow() -// if let currentProduct = CMXcodeWorkSpace.currentProductName() { -// processLog(currentProduct) -// } -// -// if let window = resultWindow { -// window.makeMainWindow() -// window.level = Int(CGWindowLevelKey.OverlayWindowLevelKey.rawValue) -// updateViewForState() -// } -// } func updateViewForState() { switch processingState { @@ -128,36 +107,8 @@ class CMResultWindow: NSWindow { } @IBAction func cancelButtonClicked(sender: AnyObject) { -// processor.shouldCancel = true + processor.shouldCancel = true } -// // MARK: Observers -// -// func addObservers() { -// buildOperationWillStartObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationWillStartNotification, usingBlock: { [weak self] (note) in -// if let stateDescription = note.object?.valueForKeyPath("_buildStatus._stateDescription") as? String { -// self?.processingState = .waiting(shouldIndicate: stateDescription == "Build") -// } -// }) -// -// buildOperationDidGenerateOutputFilesObserver = NSNotificationCenter.addObserverForName(IDEBuildOperationDidGenerateOutputFilesNotification, usingBlock: { [weak self] (note) in -// guard let buildOperation = CMXcodeWorkSpace.buildOperation(fromData: note.object) else { return } -// let result = buildOperation.result -// let action = buildOperation.actionName -// -// guard (action == "Build" || action == "Compile") && (result == .success || result == .failed || result == .cancelled) else { -// self?.processingState = .waiting(shouldIndicate: false) -// return -// } -// -// self?.buildDurationTextField.stringValue = String(format: "%.0fs", round(buildOperation.duration)) -// self?.processLog(buildOperation.productName, buildCompletionDate: buildOperation.endTime) -// }) -// } -// -// func removeObservers() { -// NSNotificationCenter.removeObserver(buildOperationWillStartObserver, name: IDEBuildOperationWillStartNotification) -// NSNotificationCenter.removeObserver(buildOperationDidGenerateOutputFilesObserver, name: IDEBuildOperationWillStartNotification) -// } override func controlTextDidChange(obj: NSNotification) { guard let field = obj.object as? NSSearchField where field == searchField else { return } @@ -189,10 +140,9 @@ extension CMResultWindow: NSTableViewDelegate { } func tableView(tableView: NSTableView, shouldSelectRow row: Int) -> Bool { -// let item = filteredData?[row] ?? dataSource[row] -// processor.workspace?.openFile(atPath: item.path, andLineNumber: item.location, focusLostHandler: { [weak self] in -// self?.resultWindow.makeKeyWindow() -// }) + let item = filteredData?[row] ?? dataSource[row] + NSApp.delegate?.application?(NSApp, openFile: item.path) + return true } } @@ -200,7 +150,7 @@ extension CMResultWindow: NSTableViewDelegate { extension CMResultWindow: NSWindowDelegate { func windowWillClose(notification: NSNotification) { -// processor.shouldCancel = true + processor.shouldCancel = true // processingState = .completed(stateName: CMProcessingState.cancelledString) // removeObservers() } diff --git a/BuildTimeAnalyzer/CMResultWindow.xib b/BuildTimeAnalyzer/CMResultWindow.xib index 564fc52..8f668c1 100644 --- a/BuildTimeAnalyzer/CMResultWindow.xib +++ b/BuildTimeAnalyzer/CMResultWindow.xib @@ -1,5 +1,5 @@ - + From 2440700da38e27bf38ed869047f330e690c8a5b2 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 14:19:24 +0100 Subject: [PATCH 04/48] omit self --- BuildTimeAnalyzer/CMResultWindow.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/BuildTimeAnalyzer/CMResultWindow.swift b/BuildTimeAnalyzer/CMResultWindow.swift index d878dc7..2c990ea 100755 --- a/BuildTimeAnalyzer/CMResultWindow.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -127,12 +127,8 @@ class CMResultWindow: NSWindow { // MARK: Actions @IBAction func perFileCheckboxClicked(sender: NSButton) { - if sender.state == 0 { - self.dataSource = self.perFunctionTimes - } else { - self.dataSource = self.perFileTimes - } - self.tableView.reloadData() + dataSource = sender.state == 0 ? perFunctionTimes : perFileTimes + tableView.reloadData() } @IBAction func clipboardButtonClicked(sender: AnyObject) { From 091b171a77bb9f960fac32fd5214f9652883f631 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 14:54:21 +0100 Subject: [PATCH 05/48] converted to Swift 3 --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 17 +- BuildTimeAnalyzer/AppDelegate.swift | 4 +- BuildTimeAnalyzer/CMBuildOperation.swift | 8 +- BuildTimeAnalyzer/CMCompileMeasure.swift | 20 +- BuildTimeAnalyzer/CMFileManager.swift | 45 ++--- BuildTimeAnalyzer/CMLogProcessor.swift | 48 ++--- BuildTimeAnalyzer/CMResultWindow.swift | 72 +++---- BuildTimeAnalyzer/CMXcodeWorkspace.swift | 205 +++----------------- BuildTimeAnalyzer/NSDate+Comparable.swift | 19 -- 9 files changed, 134 insertions(+), 304 deletions(-) delete mode 100644 BuildTimeAnalyzer/NSDate+Comparable.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 19ec79a..a64eb38 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 2A3164D91D21D7F800064045 /* CMXcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */; }; 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; 2AE775121D225D5D00D1A744 /* CMFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775111D225D5D00D1A744 /* CMFileManager.swift */; }; - 2AE775141D227D6C00D1A744 /* NSDate+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */; }; 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AF821431D21D6B900D65186 /* AppDelegate.swift */; }; 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2AF821451D21D6B900D65186 /* Assets.xcassets */; }; /* End PBXBuildFile section */ @@ -48,7 +47,6 @@ 2A3164D41D21D77500064045 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "GZIP/NSData+GZIP.m"; sourceTree = ""; }; 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMXcodeWorkspace.swift; sourceTree = ""; }; 2AE775111D225D5D00D1A744 /* CMFileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMFileManager.swift; sourceTree = ""; }; - 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSDate+Comparable.swift"; sourceTree = ""; }; 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BuildTimeAnalyzer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 2AF821431D21D6B900D65186 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 2AF821451D21D6B900D65186 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = BuildTimeAnalyzer/Assets.xcassets; sourceTree = ""; }; @@ -134,7 +132,6 @@ 2A3164C51D21D73F00064045 /* CMResultWindow.swift */, 2A3164C61D21D73F00064045 /* CMResultWindow.xib */, 2A3164D81D21D7F800064045 /* CMXcodeWorkspace.swift */, - 2AE775131D227D6C00D1A744 /* NSDate+Comparable.swift */, 2A3164D11D21D74F00064045 /* Supporting Files */, ); path = BuildTimeAnalyzer; @@ -194,14 +191,16 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Cane Media Ltd"; TargetAttributes = { 2AF8213F1D21D6B900D65186 = { CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 0800; }; 2AF8214E1D21D6B900D65186 = { CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 0800; TestTargetID = 2AF8213F1D21D6B900D65186; }; }; @@ -254,7 +253,6 @@ 2A3164C91D21D73F00064045 /* CMLogProcessor.swift in Sources */, 2A3164CB1D21D73F00064045 /* CMProcessingState.swift in Sources */, 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, - 2AE775141D227D6C00D1A744 /* NSDate+Comparable.swift in Sources */, 2AE775121D225D5D00D1A744 /* CMFileManager.swift in Sources */, 2A3164CC1D21D73F00064045 /* CMRawMeasure.swift in Sources */, 2A3164CD1D21D73F00064045 /* CMResultWindow.swift in Sources */, @@ -297,8 +295,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -342,8 +342,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; @@ -362,6 +364,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; }; name = Release; }; @@ -375,6 +378,7 @@ PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -388,6 +392,7 @@ PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzer; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -403,6 +408,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BuildTimeAnalyzer.app/Contents/MacOS/BuildTimeAnalyzer"; }; name = Debug; @@ -418,6 +424,7 @@ PRODUCT_BUNDLE_IDENTIFIER = uk.co.canemedia.BuildTimeAnalyzerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "BuildTimeAnalyzerTests-Bridging-Header.h"; + SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BuildTimeAnalyzer.app/Contents/MacOS/BuildTimeAnalyzer"; }; name = Release; diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index 06e1ab0..eba0232 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -14,11 +14,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! - func applicationDidFinishLaunching(aNotification: NSNotification) { + func applicationDidFinishLaunching(_ aNotification: Notification) { // Insert code here to initialize your application } - func applicationWillTerminate(aNotification: NSNotification) { + func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application } diff --git a/BuildTimeAnalyzer/CMBuildOperation.swift b/BuildTimeAnalyzer/CMBuildOperation.swift index 69b22fb..99ce2ca 100644 --- a/BuildTimeAnalyzer/CMBuildOperation.swift +++ b/BuildTimeAnalyzer/CMBuildOperation.swift @@ -20,11 +20,11 @@ struct CMBuildOperation { var productName: String var duration: Double var result: CMBuildResult - var startTime: NSDate + var startTime: Date - var endTime: NSDate { + var endTime: Date { // We will be looking for log files created after this date // Let's subtract a second to be on the safe side - return startTime.dateByAddingTimeInterval(duration - 1) + return startTime.addingTimeInterval(duration - 1) } -} \ No newline at end of file +} diff --git a/BuildTimeAnalyzer/CMCompileMeasure.swift b/BuildTimeAnalyzer/CMCompileMeasure.swift index 19c8746..0e7b356 100755 --- a/BuildTimeAnalyzer/CMCompileMeasure.swift +++ b/BuildTimeAnalyzer/CMCompileMeasure.swift @@ -16,7 +16,7 @@ struct CMCompileMeasure { var filename: String var references: Int - private var locationArray: [Int] + fileprivate var locationArray: [Int] var fileAndLine: String { return "\(filename):\(locationArray[0])" @@ -35,13 +35,13 @@ struct CMCompileMeasure { } init?(time: Double, rawPath: String, code: String, references: Int) { - let untrimmedFilename = rawPath.characters.split("/").map(String.init).last + let untrimmedFilename = rawPath.characters.split(separator: "/").map(String.init).last - guard let filepath = rawPath.characters.split(":").map(String.init).first else { return nil } - guard let filename = untrimmedFilename?.characters.split(":").map(String.init).first else { return nil } + guard let filepath = rawPath.characters.split(separator: ":").map(String.init).first else { return nil } + guard let filename = untrimmedFilename?.characters.split(separator: ":").map(String.init).first else { return nil } - let locationString = String(rawPath.substringFromIndex(filepath.endIndex).characters.dropFirst()) - let locations = locationString.characters.split(":").flatMap{ Int(String.init($0)) } + let locationString = String(rawPath.substring(from: filepath.endIndex).characters.dropFirst()) + let locations = locationString.characters.split(separator: ":").flatMap{ Int(String.init($0)) } guard locations.count == 2 else { return nil } self.time = time @@ -53,10 +53,10 @@ struct CMCompileMeasure { } init?(rawPath: String, time: Double) { - let untrimmedFilename = rawPath.characters.split("/").map(String.init).last + let untrimmedFilename = rawPath.characters.split(separator: "/").map(String.init).last - guard let filepath = rawPath.characters.split(":").map(String.init).first else { return nil } - guard let filename = untrimmedFilename?.characters.split(":").map(String.init).first else { return nil } + guard let filepath = rawPath.characters.split(separator: ":").map(String.init).first else { return nil } + guard let filename = untrimmedFilename?.characters.split(separator: ":").map(String.init).first else { return nil } self.time = time self.code = "" @@ -81,4 +81,4 @@ struct CMCompileMeasure { } } } -} \ No newline at end of file +} diff --git a/BuildTimeAnalyzer/CMFileManager.swift b/BuildTimeAnalyzer/CMFileManager.swift index b3b45c1..41d72fb 100644 --- a/BuildTimeAnalyzer/CMFileManager.swift +++ b/BuildTimeAnalyzer/CMFileManager.swift @@ -11,62 +11,63 @@ import Foundation struct CMFile { let name: String let path: String - let modificationDate: NSDate + let modificationDate: Date } class CMFileManager { - static private var _derivedDataLocation: String? - static private let DerivedDataLocationKey = "DerivedDataLocationKey" + static fileprivate var _derivedDataLocation: String? + static fileprivate let DerivedDataLocationKey = "DerivedDataLocationKey" static var derivedDataLocation: String { get { if _derivedDataLocation == nil { - _derivedDataLocation = NSUserDefaults.standardUserDefaults().stringForKey(DerivedDataLocationKey) + _derivedDataLocation = UserDefaults.standard.string(forKey: DerivedDataLocationKey) } - if _derivedDataLocation == nil, let libraryFolder = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true).first { + if _derivedDataLocation == nil, let libraryFolder = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first { _derivedDataLocation = "\(libraryFolder)/Developer/Xcode/DerivedData" } return _derivedDataLocation ?? "" } set { - NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: DerivedDataLocationKey) - NSUserDefaults.standardUserDefaults().synchronize() + UserDefaults.standard.set(newValue, forKey: DerivedDataLocationKey) + UserDefaults.standard.synchronize() } } static func listCacheFiles() -> [CMFile] { - let cacheFiles = getCacheFiles(at: NSURL(fileURLWithPath: derivedDataLocation)) - let earliestDate = NSDate().dateByAddingTimeInterval(-24 * 60 * 60) + let cacheFiles = getCacheFiles(at: URL(fileURLWithPath: derivedDataLocation)) + let earliestDate = Date().addingTimeInterval(-24 * 60 * 60) return filterFiles(cacheFiles, byEarliestDate: earliestDate) } - static private func getCacheFiles(at url: NSURL) -> [CMFile] { - let fileManager = NSFileManager.defaultManager() - let keys = [NSURLNameKey, NSURLIsDirectoryKey] - let options: NSDirectoryEnumerationOptions = [.SkipsHiddenFiles, .SkipsPackageDescendants, .SkipsSubdirectoryDescendants] + static fileprivate func getCacheFiles(at url: URL) -> [CMFile] { + let fileManager = FileManager.default + let keys = [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey] + let options: FileManager.DirectoryEnumerationOptions = [.skipsHiddenFiles, .skipsPackageDescendants, .skipsSubdirectoryDescendants] - guard let enumerator = fileManager.enumeratorAtURL(url, includingPropertiesForKeys: keys, options: options, errorHandler: nil) else { return [] } + guard let enumerator = fileManager.enumerator(at: url, includingPropertiesForKeys: keys, options: options, errorHandler: nil) else { return [] } var result: [CMFile] = [] - for case let fileURL as NSURL in enumerator { - if let cachePath = fileURL.URLByAppendingPathComponent("Logs/Build/Cache.db").path, - let name = fileURL.lastPathComponent, - let properties = try? fileManager.attributesOfItemAtPath(cachePath), - let modificationDate = properties[NSFileModificationDate] as? NSDate { + for case let fileURL as URL in enumerator { + let name = fileURL.lastPathComponent + let cachePath = fileURL.appendingPathComponent("Logs/Build/Cache.db").path + + if let properties = try? fileManager.attributesOfItem(atPath: cachePath), + let modificationDate = properties[FileAttributeKey.modificationDate] as? Date { result.append(CMFile(name: name, path: cachePath, modificationDate: modificationDate)) } } return result } - static private func filterFiles(files: [CMFile], byEarliestDate date: NSDate) -> [CMFile] { + static fileprivate func filterFiles(_ files: [CMFile], byEarliestDate date: Date) -> [CMFile] { guard files.count > 0 else { return [] } - let sortedFiles = files.sort({ $0.modificationDate > $1.modificationDate }) + let sortedFiles = files.sorted(by: { $0.modificationDate > $1.modificationDate }) let recentFiles = sortedFiles.filter({ $0.modificationDate > date }) if recentFiles.count == 0 { return [sortedFiles[0]] } return recentFiles } -} \ No newline at end of file +} diff --git a/BuildTimeAnalyzer/CMLogProcessor.swift b/BuildTimeAnalyzer/CMLogProcessor.swift index 09adc99..c0a6505 100644 --- a/BuildTimeAnalyzer/CMLogProcessor.swift +++ b/BuildTimeAnalyzer/CMLogProcessor.swift @@ -8,7 +8,7 @@ import Foundation -typealias CMUpdateClosure = (result: [CMCompileMeasure], didComplete: Bool) -> () +typealias CMUpdateClosure = (_ result: [CMCompileMeasure], _ didComplete: Bool) -> () protocol CMLogProcessorProtocol: class { var rawMeasures: [String: CMRawMeasure] { get set } @@ -25,12 +25,12 @@ extension CMLogProcessorProtocol { workspace = CMXcodeWorkSpace() workspace?.logText(forCacheAtPath: path) { [weak self] (text) in guard let text = text else { - updateHandler?(result: [], didComplete: true) + updateHandler?([], true) return } self?.updateHandler = updateHandler - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + DispatchQueue.global().async { self?.process(text: text) } } @@ -38,8 +38,8 @@ extension CMLogProcessorProtocol { // MARK: Private methods - private func process(text text: String) { - let characterSet = NSCharacterSet(charactersInString:"\r\"") + fileprivate func process(text: String) { + let characterSet = CharacterSet(charactersIn:"\r\"") var remainingRange = text.startIndex.. 10 }) if filteredResults.count < 20 { filteredResults = rawMeasures.values.filter({ $0.time > 0.1 }) } - let sortedResults = filteredResults.sort({ $0.time > $1.time }) - updateHandler?(result: processResult(sortedResults), didComplete: didComplete) + let sortedResults = filteredResults.sorted(by: { $0.time > $1.time }) + updateHandler?(processResult(sortedResults), didComplete) if didComplete { rawMeasures.removeAll() } } - private func processResult(unprocessedResult: [CMRawMeasure]) -> [CMCompileMeasure] { + fileprivate func processResult(_ unprocessedResult: [CMRawMeasure]) -> [CMCompileMeasure] { var result: [CMCompileMeasure] = [] for entry in unprocessedResult { - let code = entry.text.characters.split("\t").map(String.init) + let code = entry.text.characters.split(separator: "\t").map(String.init) if code.count >= 2, let measure = CMCompileMeasure(time: entry.time, rawPath: code[0], code: trimPrefixes(code[1]), references: entry.references) { result.append(measure) } @@ -98,11 +98,11 @@ extension CMLogProcessorProtocol { return result } - private func trimPrefixes(code: String) -> String { + fileprivate func trimPrefixes(_ code: String) -> String { var code = code ["@objc ", "final ", "@IBAction "].forEach { (prefix) in if code.hasPrefix(prefix) { - code = code.substringFromIndex(code.startIndex.advancedBy(prefix.characters.count)) + code = code.substring(from: code.index(code.startIndex, offsetBy: prefix.characters.count)) } } return code @@ -115,16 +115,16 @@ class CMLogProcessor: NSObject, CMLogProcessorProtocol { var updateHandler: CMUpdateClosure? var workspace: CMXcodeWorkSpace? var shouldCancel = false - var timer: NSTimer? + var timer: Timer? func processingDidStart() { - dispatch_async(dispatch_get_main_queue()) { - self.timer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: #selector(self.timerCallback(_:)), userInfo: nil, repeats: true) + DispatchQueue.main.async { + self.timer = Timer.scheduledTimer(timeInterval: 1.5, target: self, selector: #selector(self.timerCallback(_:)), userInfo: nil, repeats: true) } } func processingDidFinish() { - dispatch_async(dispatch_get_main_queue()) { + DispatchQueue.main.async { self.timer?.invalidate() self.timer = nil self.shouldCancel = false @@ -132,7 +132,7 @@ class CMLogProcessor: NSObject, CMLogProcessorProtocol { } } - func timerCallback(timer: NSTimer) { + func timerCallback(_ timer: Timer) { updateResults(false) } -} \ No newline at end of file +} diff --git a/BuildTimeAnalyzer/CMResultWindow.swift b/BuildTimeAnalyzer/CMResultWindow.swift index 2c990ea..cbc6e07 100755 --- a/BuildTimeAnalyzer/CMResultWindow.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -22,13 +22,13 @@ class CMResultWindow: NSWindow { @IBOutlet weak var cancelButton: NSButton! @IBOutlet weak var searchField: NSSearchField! - private var dataSource: [CMCompileMeasure] = [] - private var filteredData: [CMCompileMeasure]? = nil - private var processor: CMLogProcessor = CMLogProcessor() - private var cacheFiles: [CMFile]? + fileprivate var dataSource: [CMCompileMeasure] = [] + fileprivate var filteredData: [CMCompileMeasure]? = nil + fileprivate var processor: CMLogProcessor = CMLogProcessor() + fileprivate var cacheFiles: [CMFile]? - private var perFunctionTimes: [CMCompileMeasure] = [] - private var perFileTimes: [CMCompileMeasure] = [] + fileprivate var perFunctionTimes: [CMCompileMeasure] = [] + fileprivate var perFileTimes: [CMCompileMeasure] = [] var processingState: CMProcessingState = .completed(stateName: CMProcessingState.completedString) { didSet { @@ -49,7 +49,7 @@ class CMResultWindow: NSWindow { self.cacheFiles = cacheFiles } - func processCacheFile(cacheFile: CMFile) { + func processCacheFile(_ cacheFile: CMFile) { processingState = .processing processor.processCacheFile(at: cacheFile.path) { [weak self] (result, didComplete) in @@ -70,7 +70,7 @@ class CMResultWindow: NSWindow { /* * Aggregates all function times by file */ - func aggregateTimesByFile(functionTimes: [CMCompileMeasure]) -> [CMCompileMeasure] { + func aggregateTimesByFile(_ functionTimes: [CMCompileMeasure]) -> [CMCompileMeasure] { var fileTimes = [String: CMCompileMeasure]() for measure in functionTimes { @@ -84,24 +84,24 @@ class CMResultWindow: NSWindow { } } // Sort by time - return Array(fileTimes.values).sort({ $0.time > $1.time }) + return Array(fileTimes.values).sorted(by: { $0.time > $1.time }) } func updateViewForState() { switch processingState { case .processing: - progressIndicator.hidden = false + progressIndicator.isHidden = false progressIndicator.startAnimation(self) statusTextField.stringValue = CMProcessingState.processingString showInstructions(false) - cancelButton.hidden = false + cancelButton.isHidden = false case .completed(let stateName): progressIndicator.stopAnimation(self) statusTextField.stringValue = stateName showInstructions(stateName == CMProcessingState.failedString) - progressIndicator.hidden = true - cancelButton.hidden = true + progressIndicator.isHidden = true + cancelButton.isHidden = true case .waiting(let shouldIndicate): if shouldIndicate { @@ -112,66 +112,66 @@ class CMResultWindow: NSWindow { progressIndicator.stopAnimation(self) statusTextField.stringValue = CMProcessingState.waitingForBuildString } - progressIndicator.hidden = !shouldIndicate - cancelButton.hidden = true + progressIndicator.isHidden = !shouldIndicate + cancelButton.isHidden = true } - searchField.hidden = !cancelButton.hidden + searchField.isHidden = !cancelButton.isHidden } - func showInstructions(show: Bool) { - instructionsView.hidden = !show - progressIndicator.hidden = show - tableViewContainerView.hidden = show + func showInstructions(_ show: Bool) { + instructionsView.isHidden = !show + progressIndicator.isHidden = show + tableViewContainerView.isHidden = show } // MARK: Actions - @IBAction func perFileCheckboxClicked(sender: NSButton) { + @IBAction func perFileCheckboxClicked(_ sender: NSButton) { dataSource = sender.state == 0 ? perFunctionTimes : perFileTimes tableView.reloadData() } - @IBAction func clipboardButtonClicked(sender: AnyObject) { - NSPasteboard.generalPasteboard().clearContents() - NSPasteboard.generalPasteboard().writeObjects(["-Xfrontend -debug-time-function-bodies"]) + @IBAction func clipboardButtonClicked(_ sender: AnyObject) { + NSPasteboard.general().clearContents() + NSPasteboard.general().writeObjects(["-Xfrontend -debug-time-function-bodies" as NSPasteboardWriting]) } - @IBAction func cancelButtonClicked(sender: AnyObject) { + @IBAction func cancelButtonClicked(_ sender: AnyObject) { processor.shouldCancel = true } - override func controlTextDidChange(obj: NSNotification) { - guard let field = obj.object as? NSSearchField where field == searchField else { return } + override func controlTextDidChange(_ obj: Notification) { + guard let field = obj.object as? NSSearchField , field == searchField else { return } filteredData = field.stringValue.isEmpty ? nil : dataSource.filter{ textContains($0.code) || textContains($0.filename) } tableView.reloadData() } - func textContains(text: String) -> Bool { - return text.lowercaseString.containsString(searchField.stringValue.lowercaseString) + func textContains(_ text: String) -> Bool { + return text.lowercased().contains(searchField.stringValue.lowercased()) } } extension CMResultWindow: NSTableViewDataSource { - func numberOfRowsInTableView(tableView: NSTableView) -> Int { + func numberOfRows(in tableView: NSTableView) -> Int { return filteredData?.count ?? dataSource.count } } extension CMResultWindow: NSTableViewDelegate { - func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { - guard let tableColumn = tableColumn, columnIndex = tableView.tableColumns.indexOf(tableColumn) else { return nil } + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + guard let tableColumn = tableColumn, let columnIndex = tableView.tableColumns.index(of: tableColumn) else { return nil } - let result = tableView.makeViewWithIdentifier("Cell\(columnIndex)", owner: self) as? NSTableCellView + let result = tableView.make(withIdentifier: "Cell\(columnIndex)", owner: self) as? NSTableCellView result?.textField?.stringValue = filteredData?[row][columnIndex] ?? dataSource[row][columnIndex] return result } - func tableView(tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { let item = filteredData?[row] ?? dataSource[row] - NSApp.delegate?.application?(NSApp, openFile: item.path) + _ = NSApp.delegate?.application?(NSApp, openFile: item.path) return true } @@ -179,7 +179,7 @@ extension CMResultWindow: NSTableViewDelegate { extension CMResultWindow: NSWindowDelegate { - func windowWillClose(notification: NSNotification) { + func windowWillClose(_ notification: Notification) { processor.shouldCancel = true // processingState = .completed(stateName: CMProcessingState.cancelledString) // removeObservers() diff --git a/BuildTimeAnalyzer/CMXcodeWorkspace.swift b/BuildTimeAnalyzer/CMXcodeWorkspace.swift index 87021ba..7a8ebe2 100644 --- a/BuildTimeAnalyzer/CMXcodeWorkspace.swift +++ b/BuildTimeAnalyzer/CMXcodeWorkspace.swift @@ -9,7 +9,6 @@ import Cocoa protocol CMXcodeWorkspaceProtocol { - var retryAttempts: Int { get } var focusLostHandler: (() -> ())? { get set } func willOpenDocument(atLineNumber lineNumber: Int, usingTextView textView: NSTextView?) @@ -17,184 +16,44 @@ protocol CMXcodeWorkspaceProtocol { extension CMXcodeWorkspaceProtocol { - func logText(forCacheAtPath path: String, completionHandler: ((text: String?) -> ())) { + func logText(forCacheAtPath path: String, completionHandler: ((_ text: String?) -> ())) { guard let lastBuild = lastBuildKey(fromPath: path), - let folderURL = NSURL(fileURLWithPath: path).URLByDeletingLastPathComponent, - let logFile = folderURL.URLByAppendingPathComponent(lastBuild).URLByAppendingPathExtension("xcactivitylog").path else { - completionHandler(text: nil) + let folderURL = NSURL(fileURLWithPath: path).deletingLastPathComponent else { + completionHandler(nil) return } - completionHandler(text: contentsOfFile(logFile)) + let logFile = folderURL.appendingPathComponent(lastBuild).appendingPathExtension("xcactivitylog").path + completionHandler(contentsOfFile(logFile)) } - func logTextForProduct(attemptIndex: Int = 0, completionHandler: ((text: String?) -> ())) { -// guard let buildFolderPath = buildFolderPath(), -// let buildFolderURL = NSURL(string: buildFolderPath) else { -// completionHandler(text: nil) -// return -// } -// -// let files = CMFileManager.listFiles(at: buildFolderURL) -// guard files.count > 0 else { return } -// -// var keyFilename: String? -// var creationDates: [String: NSDate] = [:] -// parseFiles(files.map{ $0.path }, buildFolderURL: buildFolderURL, keyFilename: &keyFilename, creationDates: &creationDates) -// -// var lastLogPath: String? -// var lastLogCreationDate: NSDate? -// if let keyFilename = keyFilename, filename = buildFolderURL.URLByAppendingPathComponent(keyFilename).path { -// lastLogPath = filename -// lastLogCreationDate = creationDates[keyFilename] -// } -// validatePath(lastLogPath, creationDate: lastLogCreationDate, attemptIndex: attemptIndex, completionHandler: completionHandler) + mutating func openFile(atPath path: String, andLineNumber lineNumber: Int, focusLostHandler: (() -> ())) { + _ = NSApp.delegate?.application?(NSApp, openFile: path) } - mutating func openFile(atPath path: String, andLineNumber lineNumber: Int, focusLostHandler: () -> ()) { - if let textView = Self.editorForFilepath(path) { - willOpenDocument(atLineNumber: lineNumber, usingTextView: textView) - } else { - self.focusLostHandler = focusLostHandler - willOpenDocument(atLineNumber: lineNumber, usingTextView: nil) - NSApp.delegate?.application?(NSApp, openFile: path) - } - } - - // MARK: Public static methods - - static func buildOperation(fromData data: AnyObject?) -> CMBuildOperation? { - guard let actionName = data?.valueForKeyPath("_buildOperationDescription._actionName") as? String, - var productName = data?.valueForKeyPath("_buildOperationDescription._objectToBuildName") as? String, - let duration = data?.valueForKey("duration") as? Double, - let intResult = data?.valueForKey("_result") as? Int, - let cmResult = CMBuildResult(rawValue: intResult), - let startTime = data?.valueForKey("_startTime") as? NSDate else { - return nil - } - - if actionName == "Compile", let product = currentProductName() { - productName = product - } - - return CMBuildOperation(actionName: actionName, productName: productName, duration: duration, result: cmResult, startTime: startTime) - } - - static func currentProductName() -> String? { - guard let workSpaceControllers = workspaceWindowControllers() else { return nil } - - for controller in workSpaceControllers { - guard - let window = controller.valueForKey("window") as? NSWindow where window.keyWindow, - let workspace = controller.valueForKey("_workspace"), projectName = workspace.valueForKey("name") as? String - else { - continue - } - return projectName - } - return nil - } - - // MARK: Private static methods - - private static func editorForFilepath(filepath: String) -> NSTextView? { - guard let workSpaceControllers = workspaceWindowControllers() else { return nil } - - for controller in workSpaceControllers { - guard - let editor = controller.valueForKeyPath("editorArea.lastActiveEditorContext.editor"), - let IDESourceCodeEditor = NSClassFromString("IDESourceCodeEditor") where editor.isKindOfClass(IDESourceCodeEditor), - let url = editor.valueForKeyPath("sourceCodeDocument.fileURL") as? NSURL, - let path = url.path where path == filepath, - let textView = editor.valueForKey("_textView") - else { - continue - } - return textView as? NSTextView - } - return nil - } - - private static func workspaceWindowControllers() -> [AnyObject]? { - guard let windowController = NSClassFromString("IDEWorkspaceWindowController") else { return nil } - return windowController.valueForKey("workspaceWindowControllers") as? [AnyObject] - } - - // MARK: Private methods - - private func locateWorkspace(fromWindowControllers windowControllers: [AnyObject]) -> AnyObject? { -// if windowControllers.count == 1 { -// return windowControllers.first?.valueForKey("_workspace") -// } else { -// for controller in windowControllers { -// if let workspace = controller.valueForKey("_workspace"), -// let logFolderURL = buildFolderFromWorkspace(workspace), -// let files = CMFileManager.listFiles(at: logFolderURL), -// let filename = files.filter({ $0.path.hasSuffix(".db") }).first, -// let path = logFolderURL.URLByAppendingPathComponent(filename.path).path, -// let schemeName = lastSchemeName(fromPath: path) where schemeName == productName { -// return workspace -// } -// } -// } - return nil - } - - private func validatePath(path: String?, creationDate: NSDate?, attemptIndex: Int, completionHandler: ((text: String?) -> ())) { -// if let path = path, creationDate = creationDate where buildCompletionDate == nil || buildCompletionDate?.compare(creationDate) == .OrderedAscending || buildCompletionDate?.compare(creationDate) == .OrderedSame { -// completionHandler(text: contentsOfFile(path)) -// return -// } else if buildCompletionDate != nil { -// let attemptIndex = attemptIndex + 1 -// if attemptIndex < retryAttempts { -// let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC)) -// dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { -// self.logTextForProduct(attemptIndex, completionHandler: completionHandler) -// } -// return -// } -// } -// completionHandler(text: nil) - } - - private func parseFiles(filenames: [String], buildFolderURL: NSURL, inout keyFilename: String?, inout creationDates: [String: NSDate]) { - let activityLogExtension = ".xcactivitylog" - for filename in filenames { - if filename.hasSuffix(".db"), - let path = buildFolderURL.URLByAppendingPathComponent(filename).path, - let lastBuild = lastBuildKey(fromPath: path) { - keyFilename = "\(lastBuild)\(activityLogExtension)" - } else if filename.hasSuffix(activityLogExtension), - let path = buildFolderURL.URLByAppendingPathComponent(filename).path, - let creationDate = creationDateForFile(path) { - creationDates[filename] = creationDate - } - } - } - - private func lastBuildKey(fromPath path: String) -> String? { + fileprivate func lastBuildKey(fromPath path: String) -> String? { return lastDatabaseEntry(fromPath: path, usingFunction: { (key, value) -> String? in - if let title = value["title"] as? String where title.hasPrefix("Build ") || title.hasPrefix("Compile "){ + if let title = value["title"] as? String , title.hasPrefix("Build ") || title.hasPrefix("Compile "){ return key } return nil }) } - private func lastSchemeName(fromPath path: String) -> String? { + fileprivate func lastSchemeName(fromPath path: String) -> String? { return lastDatabaseEntry(fromPath: path, usingFunction: { (key, value) -> String? in return value["schemeIdentifier-schemeName"] as? String }) } - private func lastDatabaseEntry(fromPath path: String, usingFunction f: (key: String, value: [String : AnyObject]) -> String?) -> String? { + fileprivate func lastDatabaseEntry(fromPath path: String, usingFunction f: (_ key: String, _ value: [String : AnyObject]) -> String?) -> String? { guard let data = NSDictionary(contentsOfFile: path)?["logs"] as? [String: AnyObject], let key = sortKeys(usingData: data).last?.key, let value = data[key] as? [String : AnyObject] else { return nil } - return f(key: key, value: value) + return f(key, value) } - private func sortKeys(usingData data: [String: AnyObject]) -> [(UInt, key: String)] { + fileprivate func sortKeys(usingData data: [String: AnyObject]) -> [(UInt, key: String)] { var sortedKeys: [(UInt, key: String)] = [] for key in data.keys { if let value = data[key] as? [String: AnyObject], @@ -202,57 +61,39 @@ extension CMXcodeWorkspaceProtocol { sortedKeys.append((timeStoppedRecording, key)) } } - return sortedKeys.sort{ $0.0 < $1.0 } + return sortedKeys.sorted{ $0.0 < $1.0 } } - private func contentsOfFile(path: String) -> String? { - if let data = NSData(contentsOfFile: path)?.gunzippedData() { - return String(data: data, encoding: NSUTF8StringEncoding) + fileprivate func contentsOfFile(_ path: String) -> String? { + if let rawData = try? Data(contentsOf: URL(fileURLWithPath: path)), + let data = (rawData as NSData).gunzipped() { + return String(data: data, encoding: String.Encoding.utf8) } return nil } - private func creationDateForFile(path: String) -> NSDate? { - let fileAttributes = try? NSFileManager.defaultManager().attributesOfItemAtPath(path) - return fileAttributes?[NSFileCreationDate] as? NSDate + fileprivate func creationDateForFile(_ path: String) -> Date? { + let fileAttributes = try? FileManager.default.attributesOfItem(atPath: path) + return fileAttributes?[FileAttributeKey.creationDate] as? Date } } class CMXcodeWorkSpace: NSObject, CMXcodeWorkspaceProtocol { - let notificationName = "IDESourceCodeEditorDidFinishSetup" - - var retryAttempts = 10 var lineNumber = 0 var focusLostHandler: (() -> ())? - deinit { - NSNotificationCenter.defaultCenter().removeObserver(self, name: notificationName, object: nil) - } - func willOpenDocument(atLineNumber lineNumber: Int, usingTextView textView: NSTextView?) { self.lineNumber = lineNumber if let textView = textView { adjustSelection(forTextView: textView) - } else { - NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(sourceCodeEditorDidFinishSetup(_:)), name: notificationName, object: nil) - } - } - - func sourceCodeEditorDidFinishSetup(notification: NSNotification) { - NSNotificationCenter.defaultCenter().removeObserver(self, name: notificationName, object: nil) - - dispatch_async(dispatch_get_main_queue()) { - self.adjustSelection(forTextView: notification.object?.valueForKeyPath("_textView") as? NSTextView) - self.focusLostHandler?() - self.focusLostHandler = nil } } func adjustSelection(forTextView textView: NSTextView?) { - guard let textView = textView, text = textView.textStorage?.string else { return } + guard let textView = textView, let text = textView.textStorage?.string else { return } - let subSequences = text.characters.split("\n", allowEmptySlices: true) + let subSequences = text.characters.split(separator: "\n", omittingEmptySubsequences: false) let lineCount = subSequences.count > lineNumber ? lineNumber : subSequences.count var characterCount = 0 diff --git a/BuildTimeAnalyzer/NSDate+Comparable.swift b/BuildTimeAnalyzer/NSDate+Comparable.swift deleted file mode 100644 index 1881598..0000000 --- a/BuildTimeAnalyzer/NSDate+Comparable.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// NSDate+Comparable.swift -// BuildTimeAnalyzer -// -// Created by Robert Gummesson on 28/06/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// - -import Foundation - -extension NSDate: Comparable { } - -public func ==(lhs: NSDate, rhs: NSDate) -> Bool { - return lhs.compare(rhs) == .OrderedSame -} - -public func <(lhs: NSDate, rhs: NSDate) -> Bool { - return lhs.compare(rhs) == .OrderedAscending -} \ No newline at end of file From 052042e9d237e6c93eef6a796e09993d91dc1d01 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 15:14:50 +0100 Subject: [PATCH 06/48] removed the build duration field --- BuildTimeAnalyzer/CMResultWindow.swift | 1 - BuildTimeAnalyzer/CMResultWindow.xib | 40 +++++--------------------- 2 files changed, 7 insertions(+), 34 deletions(-) diff --git a/BuildTimeAnalyzer/CMResultWindow.swift b/BuildTimeAnalyzer/CMResultWindow.swift index cbc6e07..e48e19c 100755 --- a/BuildTimeAnalyzer/CMResultWindow.swift +++ b/BuildTimeAnalyzer/CMResultWindow.swift @@ -18,7 +18,6 @@ class CMResultWindow: NSWindow { @IBOutlet weak var statusTextField: NSTextField! @IBOutlet weak var progressIndicator: NSProgressIndicator! @IBOutlet weak var tableViewContainerView: NSScrollView! - @IBOutlet weak var buildDurationTextField: NSTextField! @IBOutlet weak var cancelButton: NSButton! @IBOutlet weak var searchField: NSSearchField! diff --git a/BuildTimeAnalyzer/CMResultWindow.xib b/BuildTimeAnalyzer/CMResultWindow.xib index 0f8e4b6..ffb4c93 100755 --- a/BuildTimeAnalyzer/CMResultWindow.xib +++ b/BuildTimeAnalyzer/CMResultWindow.xib @@ -1,8 +1,9 @@ - + - + + @@ -184,11 +185,10 @@ - + - + + + + + + From 3172ec95de14ca8b699dabc0a52e2716bd563f44 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 17:53:20 +0100 Subject: [PATCH 09/48] removed constraint --- BuildTimeAnalyzer/ResultWindow.xib | 1 - 1 file changed, 1 deletion(-) diff --git a/BuildTimeAnalyzer/ResultWindow.xib b/BuildTimeAnalyzer/ResultWindow.xib index d8515b8..c032d28 100755 --- a/BuildTimeAnalyzer/ResultWindow.xib +++ b/BuildTimeAnalyzer/ResultWindow.xib @@ -418,7 +418,6 @@ Gw - From d89bbe82b150bf8545edfbf1e143acc03aed849d Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 18:05:36 +0100 Subject: [PATCH 10/48] format the dates --- BuildTimeAnalyzer/ProjectSelection.swift | 13 +++++++++++-- BuildTimeAnalyzer/ResultWindow.xib | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/BuildTimeAnalyzer/ProjectSelection.swift b/BuildTimeAnalyzer/ProjectSelection.swift index d8f8ff2..a741d22 100644 --- a/BuildTimeAnalyzer/ProjectSelection.swift +++ b/BuildTimeAnalyzer/ProjectSelection.swift @@ -22,6 +22,13 @@ class ProjectSelection: NSObject { private var directoryMonitor: DirectoryMonitor? fileprivate var dataSource: [SourceType] = [] + static fileprivate let dateFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.timeStyle = .short + dateFormatter.dateStyle = .medium + return dateFormatter + }() + func startMonitoringDerivedData() { if directoryMonitor == nil { directoryMonitor = DirectoryMonitor(path: DerivedDataManager.derivedDataLocation) @@ -42,7 +49,8 @@ class ProjectSelection: NSObject { let fileManager = FileManager.default dataSource = folders.flatMap{ (url) -> SourceType? in - if let properties = try? fileManager.attributesOfItem(atPath: url.path), + if url.lastPathComponent != "ModuleCache", + let properties = try? fileManager.attributesOfItem(atPath: url.path), let modificationDate = properties[FileAttributeKey.modificationDate] as? Date { return SourceType(date: modificationDate, url: url) } @@ -76,7 +84,7 @@ extension ProjectSelection: NSTableViewDelegate { case 0: value = source.url.lastPathComponent default: - value = source.date.description + value = ProjectSelection.dateFormatter.string(from: source.date) } cellView?.textField?.stringValue = value @@ -84,6 +92,7 @@ extension ProjectSelection: NSTableViewDelegate { } func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + stopMonitoringDerivedData() delegate?.didSelectProject(with: dataSource[row].url) return true diff --git a/BuildTimeAnalyzer/ResultWindow.xib b/BuildTimeAnalyzer/ResultWindow.xib index c032d28..1b9ccb1 100755 --- a/BuildTimeAnalyzer/ResultWindow.xib +++ b/BuildTimeAnalyzer/ResultWindow.xib @@ -281,8 +281,8 @@ Gw - - + + From f4cbc8e693f592c20f6aeda59853d62beb5b0acc Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 19:18:09 +0100 Subject: [PATCH 11/48] terminate app when closing the window --- BuildTimeAnalyzer/ResultWindow.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BuildTimeAnalyzer/ResultWindow.swift b/BuildTimeAnalyzer/ResultWindow.swift index 81667cf..41f7e14 100755 --- a/BuildTimeAnalyzer/ResultWindow.swift +++ b/BuildTimeAnalyzer/ResultWindow.swift @@ -43,6 +43,7 @@ class ResultWindow: NSWindow { guard preventMultipleRunsDeleteMe == false else { return } preventMultipleRunsDeleteMe = true + delegate = self projectSelection.listFolders() projectSelection.startMonitoringDerivedData() @@ -194,7 +195,6 @@ extension ResultWindow: NSWindowDelegate { func windowWillClose(_ notification: Notification) { processor.shouldCancel = true -// processingState = .completed(stateName: ProcessingState.cancelledString) -// removeObservers() + NSApp.terminate(self) } } From f826088f4a0b788b0ab4a4ed0371250fb1c9addb Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 19:21:28 +0100 Subject: [PATCH 12/48] correct the initial status --- BuildTimeAnalyzer/ResultWindow.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/BuildTimeAnalyzer/ResultWindow.swift b/BuildTimeAnalyzer/ResultWindow.swift index 41f7e14..945059b 100755 --- a/BuildTimeAnalyzer/ResultWindow.swift +++ b/BuildTimeAnalyzer/ResultWindow.swift @@ -24,7 +24,7 @@ class ResultWindow: NSWindow { fileprivate var dataSource: [CompileMeasure] = [] fileprivate var filteredData: [CompileMeasure]? = nil - fileprivate var processor: LogProcessor = LogProcessor() + fileprivate var processor = LogProcessor() fileprivate var cacheFiles: [CacheFile]? fileprivate var perFunctionTimes: [CompileMeasure] = [] @@ -32,7 +32,7 @@ class ResultWindow: NSWindow { private var preventMultipleRunsDeleteMe = false - var processingState: ProcessingState = .completed(stateName: ProcessingState.completedString) { + var processingState: ProcessingState = .waiting(shouldIndicate: false) { didSet { updateViewForState() } @@ -43,8 +43,11 @@ class ResultWindow: NSWindow { guard preventMultipleRunsDeleteMe == false else { return } preventMultipleRunsDeleteMe = true + delegate = self + updateViewForState() + projectSelection.listFolders() projectSelection.startMonitoringDerivedData() } From 52464c54534bd232f66b017ff3e78f54a9706619 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Sun, 4 Sep 2016 19:38:59 +0100 Subject: [PATCH 13/48] removed unnecessary code --- BuildTimeAnalyzer/ResultWindow.swift | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/BuildTimeAnalyzer/ResultWindow.swift b/BuildTimeAnalyzer/ResultWindow.swift index 945059b..cfca5a2 100755 --- a/BuildTimeAnalyzer/ResultWindow.swift +++ b/BuildTimeAnalyzer/ResultWindow.swift @@ -10,9 +10,6 @@ import Cocoa class ResultWindow: NSWindow { - let IDEBuildOperationWillStartNotification = "IDEBuildOperationWillStartNotification" - let IDEBuildOperationDidGenerateOutputFilesNotification = "IDEBuildOperationDidGenerateOutputFilesNotification" - @IBOutlet weak var tableView: NSTableView! @IBOutlet weak var instructionsView: NSView! @IBOutlet weak var statusTextField: NSTextField! @@ -41,7 +38,7 @@ class ResultWindow: NSWindow { override func awakeFromNib() { super.awakeFromNib() - guard preventMultipleRunsDeleteMe == false else { return } + guard !preventMultipleRunsDeleteMe else { return } preventMultipleRunsDeleteMe = true delegate = self @@ -87,7 +84,7 @@ class ResultWindow: NSWindow { } } // Sort by time - return Array(fileTimes.values).sorted(by: { $0.time > $1.time }) + return Array(fileTimes.values).sorted{ $0.time > $1.time } } func updateViewForState() { From 1487a59fe611e377933350ad2f586d218a4c25ef Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 5 Sep 2016 17:12:12 +0100 Subject: [PATCH 14/48] Improved layout --- BuildTimeAnalyzer/DerivedDataManager.swift | 1 + BuildTimeAnalyzer/DirectoryMonitor.swift | 1 + BuildTimeAnalyzer/ResultWindow.swift | 40 ++++--- BuildTimeAnalyzer/ResultWindow.xib | 119 +++++++++++++-------- 4 files changed, 103 insertions(+), 58 deletions(-) diff --git a/BuildTimeAnalyzer/DerivedDataManager.swift b/BuildTimeAnalyzer/DerivedDataManager.swift index 868901b..dabd4e4 100644 --- a/BuildTimeAnalyzer/DerivedDataManager.swift +++ b/BuildTimeAnalyzer/DerivedDataManager.swift @@ -30,6 +30,7 @@ class DerivedDataManager { return _derivedDataLocation ?? "" } set { + _derivedDataLocation = newValue UserDefaults.standard.set(newValue, forKey: DerivedDataLocationKey) UserDefaults.standard.synchronize() } diff --git a/BuildTimeAnalyzer/DirectoryMonitor.swift b/BuildTimeAnalyzer/DirectoryMonitor.swift index fe93c57..2184294 100644 --- a/BuildTimeAnalyzer/DirectoryMonitor.swift +++ b/BuildTimeAnalyzer/DirectoryMonitor.swift @@ -29,6 +29,7 @@ class DirectoryMonitor { guard dispatchSource == nil && fileDescriptor == -1 else { return } fileDescriptor = open(path, O_EVTONLY) + guard fileDescriptor != -1 else { return } dispatchSource = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fileDescriptor, eventMask: .all, queue: dispatchQueue) dispatchSource?.setEventHandler { diff --git a/BuildTimeAnalyzer/ResultWindow.swift b/BuildTimeAnalyzer/ResultWindow.swift index cfca5a2..6c650fa 100755 --- a/BuildTimeAnalyzer/ResultWindow.swift +++ b/BuildTimeAnalyzer/ResultWindow.swift @@ -12,10 +12,13 @@ class ResultWindow: NSWindow { @IBOutlet weak var tableView: NSTableView! @IBOutlet weak var instructionsView: NSView! + @IBOutlet weak var statusLabel: NSTextField! @IBOutlet weak var statusTextField: NSTextField! @IBOutlet weak var progressIndicator: NSProgressIndicator! @IBOutlet weak var tableViewContainerView: NSScrollView! + @IBOutlet weak var derivedDataTextField: NSTextField! @IBOutlet weak var cancelButton: NSButton! + @IBOutlet weak var perFileButton: NSButton! @IBOutlet weak var searchField: NSSearchField! @IBOutlet weak var projectSelection: ProjectSelection! @@ -42,13 +45,27 @@ class ResultWindow: NSWindow { preventMultipleRunsDeleteMe = true delegate = self + derivedDataTextField.stringValue = DerivedDataManager.derivedDataLocation updateViewForState() + showInstructions(true) + projectSelection.listFolders() projectSelection.startMonitoringDerivedData() } + func showInstructions(_ show: Bool) { + instructionsView.isHidden = !show + + perFileButton.isHidden = show + progressIndicator.isHidden = show + searchField.isHidden = show + statusLabel.isHidden = show + statusTextField.isHidden = show + tableViewContainerView.isHidden = show + } + func processFile(at url: URL) { processingState = .processing @@ -118,12 +135,6 @@ class ResultWindow: NSWindow { searchField.isHidden = !cancelButton.isHidden } - func showInstructions(_ show: Bool) { - instructionsView.isHidden = !show - progressIndicator.isHidden = show - tableViewContainerView.isHidden = show - } - func textContains(_ text: String) -> Bool { return text.lowercased().contains(searchField.stringValue.lowercased()) } @@ -145,10 +156,17 @@ class ResultWindow: NSWindow { } override func controlTextDidChange(_ obj: Notification) { - guard let field = obj.object as? NSSearchField , field == searchField else { return } - - filteredData = field.stringValue.isEmpty ? nil : dataSource.filter{ textContains($0.code) || textContains($0.filename) } - tableView.reloadData() + if let field = obj.object as? NSSearchField, field == searchField { + filteredData = field.stringValue.isEmpty ? nil : dataSource.filter{ textContains($0.code) || textContains($0.filename) } + tableView.reloadData() + } else if let field = obj.object as? NSTextField, field == derivedDataTextField { + projectSelection.stopMonitoringDerivedData() + + DerivedDataManager.derivedDataLocation = field.stringValue + + projectSelection.listFolders() + projectSelection.startMonitoringDerivedData() + } } } @@ -163,7 +181,6 @@ extension ResultWindow: NSTableViewDataSource { // MARK: NSTableViewDelegate extension ResultWindow: NSTableViewDelegate { - func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { guard let tableColumn = tableColumn, let columnIndex = tableView.tableColumns.index(of: tableColumn) else { return nil } @@ -192,7 +209,6 @@ extension ResultWindow: ProjectSelectionDelegate { // MARK: NSWindowDelegate extension ResultWindow: NSWindowDelegate { - func windowWillClose(_ notification: Notification) { processor.shouldCancel = true NSApp.terminate(self) diff --git a/BuildTimeAnalyzer/ResultWindow.xib b/BuildTimeAnalyzer/ResultWindow.xib index 1b9ccb1..a4fa707 100755 --- a/BuildTimeAnalyzer/ResultWindow.xib +++ b/BuildTimeAnalyzer/ResultWindow.xib @@ -219,6 +219,17 @@ + + + + + + + + + + + @@ -252,12 +263,30 @@ Gw + + + + + + + + + - + - + @@ -265,7 +294,7 @@ Gw - + @@ -273,7 +302,7 @@ Gw - + @@ -281,39 +310,21 @@ Gw - + - - - - - - - - - - + - + - + @@ -352,7 +363,7 @@ Gw - + @@ -366,11 +377,11 @@ Gw - + - + @@ -405,56 +416,69 @@ Gw - + + + + + + + + + + + + + + + + + + + + - + + + - + + - + + - - - - - - - - - - - - + + + - @@ -468,10 +492,13 @@ Gw + + + From c809e076d60325e45adf2b5415faaf3b20fce6e8 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 7 Sep 2016 21:12:29 +0100 Subject: [PATCH 15/48] Moved to a storyboard --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 16 +- BuildTimeAnalyzer/AppDelegate.swift | 5 - BuildTimeAnalyzer/Info.plist | 4 +- BuildTimeAnalyzer/Main.storyboard | 1183 +++++++++++++++++ BuildTimeAnalyzer/ResultWindow.xib | 518 -------- ...esultWindow.swift => ViewController.swift} | 128 +- 6 files changed, 1255 insertions(+), 599 deletions(-) create mode 100644 BuildTimeAnalyzer/Main.storyboard delete mode 100755 BuildTimeAnalyzer/ResultWindow.xib rename BuildTimeAnalyzer/{ResultWindow.swift => ViewController.swift} (84%) mode change 100755 => 100644 diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index c68f813..5dfee47 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -11,12 +11,12 @@ 2A3164C91D21D73F00064045 /* LogProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C11D21D73F00064045 /* LogProcessor.swift */; }; 2A3164CB1D21D73F00064045 /* ProcessingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C31D21D73F00064045 /* ProcessingState.swift */; }; 2A3164CC1D21D73F00064045 /* RawMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C41D21D73F00064045 /* RawMeasure.swift */; }; - 2A3164CD1D21D73F00064045 /* ResultWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C51D21D73F00064045 /* ResultWindow.swift */; }; - 2A3164CE1D21D73F00064045 /* ResultWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A3164C61D21D73F00064045 /* ResultWindow.xib */; }; 2A3164D01D21D74A00064045 /* CompileMeasureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164CF1D21D74A00064045 /* CompileMeasureTests.swift */; }; 2A3164D51D21D77500064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; 2A3164D91D21D7F800064045 /* XcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */; }; 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; + 2A3698AA1D80A1AC002C5CDA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A3698A91D80A1AC002C5CDA /* Main.storyboard */; }; + 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3698AB1D80A33B002C5CDA /* ViewController.swift */; }; 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */; }; 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */; }; 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */; }; @@ -39,13 +39,13 @@ 2A3164C11D21D73F00064045 /* LogProcessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LogProcessor.swift; sourceTree = ""; }; 2A3164C31D21D73F00064045 /* ProcessingState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProcessingState.swift; sourceTree = ""; }; 2A3164C41D21D73F00064045 /* RawMeasure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RawMeasure.swift; sourceTree = ""; }; - 2A3164C51D21D73F00064045 /* ResultWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultWindow.swift; sourceTree = ""; }; - 2A3164C61D21D73F00064045 /* ResultWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ResultWindow.xib; sourceTree = ""; }; 2A3164CF1D21D74A00064045 /* CompileMeasureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompileMeasureTests.swift; sourceTree = ""; }; 2A3164D21D21D77500064045 /* BuildTimeAnalyzerTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BuildTimeAnalyzerTests-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; 2A3164D31D21D77500064045 /* NSData+GZIP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GZIP.h"; path = "GZIP/NSData+GZIP.h"; sourceTree = ""; }; 2A3164D41D21D77500064045 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "GZIP/NSData+GZIP.m"; sourceTree = ""; }; 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XcodeWorkspace.swift; sourceTree = ""; }; + 2A3698A91D80A1AC002C5CDA /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 2A3698AB1D80A33B002C5CDA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryMonitor.swift; sourceTree = ""; }; 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectSelection.swift; sourceTree = ""; }; 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DerivedDataManager.swift; sourceTree = ""; }; @@ -126,6 +126,7 @@ children = ( 2A3164D11D21D74F00064045 /* Supporting Files */, 2AF821431D21D6B900D65186 /* AppDelegate.swift */, + 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, @@ -133,9 +134,8 @@ 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, 2A3164C41D21D73F00064045 /* RawMeasure.swift */, - 2A3164C51D21D73F00064045 /* ResultWindow.swift */, - 2A3164C61D21D73F00064045 /* ResultWindow.xib */, 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, + 2A3698AB1D80A33B002C5CDA /* ViewController.swift */, ); path = BuildTimeAnalyzer; sourceTree = ""; @@ -232,7 +232,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2A3164CE1D21D73F00064045 /* ResultWindow.xib in Resources */, + 2A3698AA1D80A1AC002C5CDA /* Main.storyboard in Resources */, 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -257,8 +257,8 @@ 2A3164CB1D21D73F00064045 /* ProcessingState.swift in Sources */, 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */, + 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */, 2A3164CC1D21D73F00064045 /* RawMeasure.swift in Sources */, - 2A3164CD1D21D73F00064045 /* ResultWindow.swift in Sources */, 2A3164C81D21D73F00064045 /* CompileMeasure.swift in Sources */, 2A3164D91D21D7F800064045 /* XcodeWorkspace.swift in Sources */, 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */, diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index eba0232..e4e3044 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -11,9 +11,6 @@ import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { - @IBOutlet weak var window: NSWindow! - - func applicationDidFinishLaunching(_ aNotification: Notification) { // Insert code here to initialize your application } @@ -21,7 +18,5 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application } - - } diff --git a/BuildTimeAnalyzer/Info.plist b/BuildTimeAnalyzer/Info.plist index bdb978f..9e3f71a 100644 --- a/BuildTimeAnalyzer/Info.plist +++ b/BuildTimeAnalyzer/Info.plist @@ -26,8 +26,8 @@ $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright Copyright © 2016 Cane Media Ltd. All rights reserved. - NSMainNibFile - ResultWindow + NSMainStoryboardFile + Main NSPrincipalClass NSApplication diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard new file mode 100644 index 0000000..80b721a --- /dev/null +++ b/BuildTimeAnalyzer/Main.storyboard @@ -0,0 +1,1183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BuildTimeAnalyzer/ResultWindow.xib b/BuildTimeAnalyzer/ResultWindow.xib deleted file mode 100755 index a4fa707..0000000 --- a/BuildTimeAnalyzer/ResultWindow.xib +++ /dev/null @@ -1,518 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BuildTimeAnalyzer/ResultWindow.swift b/BuildTimeAnalyzer/ViewController.swift old mode 100755 new mode 100644 similarity index 84% rename from BuildTimeAnalyzer/ResultWindow.swift rename to BuildTimeAnalyzer/ViewController.swift index 6c650fa..a06fed5 --- a/BuildTimeAnalyzer/ResultWindow.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -1,14 +1,14 @@ // -// ResultWindowController.swift +// ViewController.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 01/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. +// Created by Robert Gummesson on 07/09/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. // import Cocoa -class ResultWindow: NSWindow { +class ViewController: NSViewController { @IBOutlet weak var tableView: NSTableView! @IBOutlet weak var instructionsView: NSView! @@ -23,14 +23,11 @@ class ResultWindow: NSWindow { @IBOutlet weak var projectSelection: ProjectSelection! fileprivate var dataSource: [CompileMeasure] = [] - fileprivate var filteredData: [CompileMeasure]? = nil - fileprivate var processor = LogProcessor() - fileprivate var cacheFiles: [CacheFile]? + fileprivate var filteredData: [CompileMeasure]? - fileprivate var perFunctionTimes: [CompileMeasure] = [] - fileprivate var perFileTimes: [CompileMeasure] = [] - - private var preventMultipleRunsDeleteMe = false + private var processor = LogProcessor() + private var perFunctionTimes: [CompileMeasure] = [] + private var perFileTimes: [CompileMeasure] = [] var processingState: ProcessingState = .waiting(shouldIndicate: false) { didSet { @@ -38,26 +35,35 @@ class ResultWindow: NSWindow { } } - override func awakeFromNib() { - super.awakeFromNib() + // MARK: Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() - guard !preventMultipleRunsDeleteMe else { return } - preventMultipleRunsDeleteMe = true + configureLayout() - delegate = self - derivedDataTextField.stringValue = DerivedDataManager.derivedDataLocation + projectSelection.listFolders() + projectSelection.startMonitoringDerivedData() + } + + override func viewDidDisappear() { + super.viewDidDisappear() + processor.shouldCancel = true + NSApp.terminate(self) + } + + // MARK: Layout + + func configureLayout() { + derivedDataTextField.stringValue = DerivedDataManager.derivedDataLocation updateViewForState() - showInstructions(true) - - projectSelection.listFolders() - projectSelection.startMonitoringDerivedData() } func showInstructions(_ show: Bool) { instructionsView.isHidden = !show - + perFileButton.isHidden = show progressIndicator.isHidden = show searchField.isHidden = show @@ -66,30 +72,9 @@ class ResultWindow: NSWindow { tableViewContainerView.isHidden = show } - func processFile(at url: URL) { - processingState = .processing - - processor.processCacheFile(at: url.path) { [weak self] (result, didComplete) in - guard let `self` = self else { return } - - self.dataSource = result - self.perFunctionTimes = result - self.perFileTimes = self.aggregateTimesByFile(self.perFunctionTimes) - self.tableView.reloadData() - - if didComplete { - let stateName = self.dataSource.isEmpty ? ProcessingState.failedString : ProcessingState.completedString - self.processingState = .completed(stateName: stateName) - } - } - } - - /* - * Aggregates all function times by file - */ func aggregateTimesByFile(_ functionTimes: [CompileMeasure]) -> [CompileMeasure] { var fileTimes = [String: CompileMeasure]() - + for measure in functionTimes { if var fileMeasure = fileTimes[measure.path] { // File exists, increment time @@ -135,17 +120,13 @@ class ResultWindow: NSWindow { searchField.isHidden = !cancelButton.isHidden } - func textContains(_ text: String) -> Bool { - return text.lowercased().contains(searchField.stringValue.lowercased()) - } - // MARK: Actions @IBAction func perFileCheckboxClicked(_ sender: NSButton) { dataSource = sender.state == 0 ? perFunctionTimes : perFileTimes tableView.reloadData() } - + @IBAction func clipboardButtonClicked(_ sender: AnyObject) { NSPasteboard.general().clearContents() NSPasteboard.general().writeObjects(["-Xfrontend -debug-time-function-bodies" as NSPasteboardWriting]) @@ -168,19 +149,43 @@ class ResultWindow: NSWindow { projectSelection.startMonitoringDerivedData() } } + + // MARK: Utilities + + func processFile(at url: URL) { + processingState = .processing + + processor.processCacheFile(at: url.path) { [weak self] (result, didComplete) in + guard let `self` = self else { return } + + self.dataSource = result + self.perFunctionTimes = result + self.perFileTimes = self.aggregateTimesByFile(self.perFunctionTimes) + self.tableView.reloadData() + + if didComplete { + let stateName = self.dataSource.isEmpty ? ProcessingState.failedString : ProcessingState.completedString + self.processingState = .completed(stateName: stateName) + } + } + } + + func textContains(_ text: String) -> Bool { + return text.lowercased().contains(searchField.stringValue.lowercased()) + } } // MARK: NSTableViewDataSource -extension ResultWindow: NSTableViewDataSource { - func numberOfRows(in tableView: NSTableView) -> Int { +extension ViewController: NSTableViewDataSource { + func numberOfRows(in tableView: NSTableView) -> Int { return filteredData?.count ?? dataSource.count - } + } } // MARK: NSTableViewDelegate -extension ResultWindow: NSTableViewDelegate { +extension ViewController: NSTableViewDelegate { func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { guard let tableColumn = tableColumn, let columnIndex = tableView.tableColumns.index(of: tableColumn) else { return nil } @@ -190,27 +195,18 @@ extension ResultWindow: NSTableViewDelegate { return result } - func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { let item = filteredData?[row] ?? dataSource[row] _ = NSApp.delegate?.application?(NSApp, openFile: item.path) - return true - } + return true + } } // MARK: ProjectSelectionDelegate -extension ResultWindow: ProjectSelectionDelegate { +extension ViewController: ProjectSelectionDelegate { func didSelectProject(with url: URL) { processFile(at: url.appendingPathComponent("Logs/Build/Cache.db")) } } - -// MARK: NSWindowDelegate - -extension ResultWindow: NSWindowDelegate { - func windowWillClose(_ notification: Notification) { - processor.shouldCancel = true - NSApp.terminate(self) - } -} From 4a8a773a667f1cc46470b0bb884b5e42bdc11cc1 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 7 Sep 2016 21:21:51 +0100 Subject: [PATCH 16/48] Got rid of menu items we don't need --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 4 +- BuildTimeAnalyzer/Main.storyboard | 334 +------------------- 2 files changed, 3 insertions(+), 335 deletions(-) diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 5dfee47..f42124c 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -126,16 +126,16 @@ children = ( 2A3164D11D21D74F00064045 /* Supporting Files */, 2AF821431D21D6B900D65186 /* AppDelegate.swift */, - 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, 2A3164C11D21D73F00064045 /* LogProcessor.swift */, + 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, 2A3164C41D21D73F00064045 /* RawMeasure.swift */, - 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, 2A3698AB1D80A33B002C5CDA /* ViewController.swift */, + 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, ); path = BuildTimeAnalyzer; sourceTree = ""; diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index 80b721a..a638ff4 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -22,13 +22,6 @@ - - - - - - - @@ -60,62 +53,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -338,280 +280,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -641,7 +309,7 @@ - + From 2349d380e214946715158e835fa830bc4c81007b Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 7 Sep 2016 22:49:03 +0100 Subject: [PATCH 17/48] menu navigation added --- BuildTimeAnalyzer/AppDelegate.swift | 31 ++++++++++++++++++++++++-- BuildTimeAnalyzer/Main.storyboard | 28 ++++++++++++++++++++--- BuildTimeAnalyzer/ViewController.swift | 29 +++++++++++++++++++++++- 3 files changed, 82 insertions(+), 6 deletions(-) diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index e4e3044..9ce9b0d 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -10,13 +10,40 @@ import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { - + + @IBOutlet weak var projectSelectionMenuItem: NSMenuItem! + @IBOutlet weak var buildTimesMenuItem: NSMenuItem! + + var viewController: ViewController? { + return NSApplication.shared().mainWindow?.contentViewController as? ViewController + } + func applicationDidFinishLaunching(_ aNotification: Notification) { // Insert code here to initialize your application + } - + func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application } + + // MARK: Actions + + @IBAction func navigateToProjectSelection(_ sender: NSMenuItem) { + sender.isEnabled = false + buildTimesMenuItem.isEnabled = true + + guard let viewController = viewController else { return } + + viewController.cancelProcessing() + viewController.showInstructions(true) + } + + @IBAction func navigateToBuildTimes(_ sender: NSMenuItem) { + sender.isEnabled = false + projectSelectionMenuItem.isEnabled = true + + viewController?.showInstructions(false) + } } diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index a638ff4..b1a077c 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -280,6 +280,23 @@ + + + + + + + + + + + + + + + + + @@ -320,10 +337,15 @@ - + - + + + + + + @@ -344,7 +366,7 @@ - + diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index a06fed5..607a6ee 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -24,6 +24,7 @@ class ViewController: NSViewController { fileprivate var dataSource: [CompileMeasure] = [] fileprivate var filteredData: [CompileMeasure]? + fileprivate var canUpdateViewForState = true private var processor = LogProcessor() private var perFunctionTimes: [CompileMeasure] = [] @@ -70,6 +71,11 @@ class ViewController: NSViewController { statusLabel.isHidden = show statusTextField.isHidden = show tableViewContainerView.isHidden = show + + if show && processingState == .processing { + processor.shouldCancel = true + cancelButton.isHidden = true + } } func aggregateTimesByFile(_ functionTimes: [CompileMeasure]) -> [CompileMeasure] { @@ -90,6 +96,8 @@ class ViewController: NSViewController { } func updateViewForState() { + guard canUpdateViewForState else { return } + switch processingState { case .processing: progressIndicator.isHidden = false @@ -117,7 +125,10 @@ class ViewController: NSViewController { progressIndicator.isHidden = !shouldIndicate cancelButton.isHidden = true } - searchField.isHidden = !cancelButton.isHidden + + if instructionsView.isHidden { + searchField.isHidden = !cancelButton.isHidden + } } // MARK: Actions @@ -150,11 +161,21 @@ class ViewController: NSViewController { } } + func cancelProcessing() { + guard processingState == .processing else { return } + + processor.shouldCancel = true + cancelButton.isHidden = true + canUpdateViewForState = false + } + // MARK: Utilities func processFile(at url: URL) { processingState = .processing + // TODO: Show an alert if invalid log file + processor.processCacheFile(at: url.path) { [weak self] (result, didComplete) in guard let `self` = self else { return } @@ -207,6 +228,12 @@ extension ViewController: NSTableViewDelegate { extension ViewController: ProjectSelectionDelegate { func didSelectProject(with url: URL) { + canUpdateViewForState = true + + let appDelegate = NSApp.delegate as? AppDelegate + appDelegate?.projectSelectionMenuItem.isEnabled = true + appDelegate?.buildTimesMenuItem.isEnabled = false + processFile(at: url.appendingPathComponent("Logs/Build/Cache.db")) } } From 4bfac86d1841fa6be42afb4abb3c88d18320fbaa Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Thu, 8 Sep 2016 20:30:42 +0100 Subject: [PATCH 18/48] Feedback when not locating valid logs --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 36 ++++++++++++++++--- BuildTimeAnalyzer/AppDelegate.swift | 17 +++------ BuildTimeAnalyzer/Main.storyboard | 11 +++--- BuildTimeAnalyzer/NSAlert+Extensions.swift | 19 +++++++++++ BuildTimeAnalyzer/ProcessingState.swift | 6 ++-- BuildTimeAnalyzer/ProjectSelection.swift | 14 ++++---- BuildTimeAnalyzer/ViewController.swift | 38 ++++++++++----------- 7 files changed, 91 insertions(+), 50 deletions(-) create mode 100644 BuildTimeAnalyzer/NSAlert+Extensions.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index f42124c..1a0be69 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3698AB1D80A33B002C5CDA /* ViewController.swift */; }; 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */; }; 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */; }; + 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */; }; 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */; }; 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AF821431D21D6B900D65186 /* AppDelegate.swift */; }; 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2AF821451D21D6B900D65186 /* Assets.xcassets */; }; @@ -48,6 +49,7 @@ 2A3698AB1D80A33B002C5CDA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryMonitor.swift; sourceTree = ""; }; 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectSelection.swift; sourceTree = ""; }; + 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAlert+Extensions.swift"; sourceTree = ""; }; 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DerivedDataManager.swift; sourceTree = ""; }; 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BuildTimeAnalyzer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 2AF821431D21D6B900D65186 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -101,6 +103,32 @@ name = "Supporting Files"; sourceTree = ""; }; + 2ABFB6CF1D81F34300D060BF /* Extensions */ = { + isa = PBXGroup; + children = ( + 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */, + ); + name = " Extensions"; + sourceTree = ""; + }; + 2ABFB6D01D81F35400D060BF /* Application */ = { + isa = PBXGroup; + children = ( + 2AF821431D21D6B900D65186 /* AppDelegate.swift */, + 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, + ); + name = " Application"; + sourceTree = ""; + }; + 2ABFB6D11D81F37300D060BF /* Models */ = { + isa = PBXGroup; + children = ( + 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, + 2A3164C41D21D73F00064045 /* RawMeasure.swift */, + ); + name = " Models"; + sourceTree = ""; + }; 2AF821371D21D6B900D65186 = { isa = PBXGroup; children = ( @@ -124,16 +152,15 @@ 2AF821421D21D6B900D65186 /* BuildTimeAnalyzer */ = { isa = PBXGroup; children = ( + 2ABFB6D01D81F35400D060BF /* Application */, + 2ABFB6CF1D81F34300D060BF /* Extensions */, + 2ABFB6D11D81F37300D060BF /* Models */, 2A3164D11D21D74F00064045 /* Supporting Files */, - 2AF821431D21D6B900D65186 /* AppDelegate.swift */, - 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, 2A3164C11D21D73F00064045 /* LogProcessor.swift */, - 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, - 2A3164C41D21D73F00064045 /* RawMeasure.swift */, 2A3698AB1D80A33B002C5CDA /* ViewController.swift */, 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, ); @@ -254,6 +281,7 @@ 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */, 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */, 2A3164C91D21D73F00064045 /* LogProcessor.swift in Sources */, + 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */, 2A3164CB1D21D73F00064045 /* ProcessingState.swift in Sources */, 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */, diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index 9ce9b0d..eced3af 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -18,20 +18,15 @@ class AppDelegate: NSObject, NSApplicationDelegate { return NSApplication.shared().mainWindow?.contentViewController as? ViewController } - func applicationDidFinishLaunching(_ aNotification: Notification) { - // Insert code here to initialize your application - - } - - func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application + func configureMenuItems(showBuildTimesMenuItem: Bool) { + projectSelectionMenuItem.isEnabled = !showBuildTimesMenuItem + buildTimesMenuItem.isEnabled = showBuildTimesMenuItem } // MARK: Actions @IBAction func navigateToProjectSelection(_ sender: NSMenuItem) { - sender.isEnabled = false - buildTimesMenuItem.isEnabled = true + configureMenuItems(showBuildTimesMenuItem: true) guard let viewController = viewController else { return } @@ -40,9 +35,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } @IBAction func navigateToBuildTimes(_ sender: NSMenuItem) { - sender.isEnabled = false - projectSelectionMenuItem.isEnabled = true - + configureMenuItems(showBuildTimesMenuItem: false) viewController?.showInstructions(false) } } diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index b1a077c..61f32ea 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -380,7 +380,7 @@ + + + + + + @@ -322,18 +328,6 @@ - - - - - - - - - - - - From c2e94b723ec8eb03545601da023562087749f8b9 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Thu, 8 Sep 2016 20:49:12 +0100 Subject: [PATCH 20/48] tidying up a bit --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 54 +++++++++++++-------- BuildTimeAnalyzer/AppDelegate.swift | 3 -- BuildTimeAnalyzer/CompileMeasure.swift | 3 -- BuildTimeAnalyzer/DerivedDataManager.swift | 3 -- BuildTimeAnalyzer/DirectoryMonitor.swift | 3 -- BuildTimeAnalyzer/LogProcessor.swift | 3 -- BuildTimeAnalyzer/NSAlert+Extensions.swift | 3 -- BuildTimeAnalyzer/ProcessingState.swift | 3 -- BuildTimeAnalyzer/ProjectSelection.swift | 3 -- BuildTimeAnalyzer/RawMeasure.swift | 3 -- BuildTimeAnalyzer/ViewController.swift | 3 -- BuildTimeAnalyzer/XcodeWorkspace.swift | 3 -- 12 files changed, 35 insertions(+), 52 deletions(-) diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 1a0be69..e6f7c03 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -77,13 +77,13 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2A3164D11D21D74F00064045 /* Supporting Files */ = { + 2A3164D11D21D74F00064045 /* Supporting Files */ = { isa = PBXGroup; children = ( 2A3164D21D21D77500064045 /* BuildTimeAnalyzerTests-Bridging-Header.h */, 2AF8214A1D21D6B900D65186 /* Info.plist */, ); - name = " Supporting Files"; + name = "Supporting Files"; sourceTree = ""; }; 2A3164D61D21D77E00064045 /* GZIP */ = { @@ -103,30 +103,51 @@ name = "Supporting Files"; sourceTree = ""; }; - 2ABFB6CF1D81F34300D060BF /* Extensions */ = { + 2ABFB6CF1D81F34300D060BF /* Extensions */ = { isa = PBXGroup; children = ( 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */, ); - name = " Extensions"; + name = Extensions; sourceTree = ""; }; - 2ABFB6D01D81F35400D060BF /* Application */ = { + 2ABFB6D01D81F35400D060BF /* Application */ = { isa = PBXGroup; children = ( 2AF821431D21D6B900D65186 /* AppDelegate.swift */, 2A3698A91D80A1AC002C5CDA /* Main.storyboard */, ); - name = " Application"; + name = Application; sourceTree = ""; }; - 2ABFB6D11D81F37300D060BF /* Models */ = { + 2ABFB6D11D81F37300D060BF /* Models */ = { isa = PBXGroup; children = ( 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, + 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A3164C41D21D73F00064045 /* RawMeasure.swift */, ); - name = " Models"; + name = Models; + sourceTree = ""; + }; + 2ABFB6D21D81F81400D060BF /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 2A3698AB1D80A33B002C5CDA /* ViewController.swift */, + ); + name = ViewControllers; + sourceTree = ""; + }; + 2ABFB6D31D81F82600D060BF /* Utilities */ = { + isa = PBXGroup; + children = ( + 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, + 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, + 2A3164C11D21D73F00064045 /* LogProcessor.swift */, + 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, + 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, + ); + name = Utilities; sourceTree = ""; }; 2AF821371D21D6B900D65186 = { @@ -152,17 +173,12 @@ 2AF821421D21D6B900D65186 /* BuildTimeAnalyzer */ = { isa = PBXGroup; children = ( - 2ABFB6D01D81F35400D060BF /* Application */, - 2ABFB6CF1D81F34300D060BF /* Extensions */, - 2ABFB6D11D81F37300D060BF /* Models */, - 2A3164D11D21D74F00064045 /* Supporting Files */, - 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, - 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, - 2A3164C11D21D73F00064045 /* LogProcessor.swift */, - 2A3164C31D21D73F00064045 /* ProcessingState.swift */, - 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, - 2A3698AB1D80A33B002C5CDA /* ViewController.swift */, - 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, + 2ABFB6D01D81F35400D060BF /* Application */, + 2ABFB6CF1D81F34300D060BF /* Extensions */, + 2ABFB6D11D81F37300D060BF /* Models */, + 2A3164D11D21D74F00064045 /* Supporting Files */, + 2ABFB6D31D81F82600D060BF /* Utilities */, + 2ABFB6D21D81F81400D060BF /* ViewControllers */, ); path = BuildTimeAnalyzer; sourceTree = ""; diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index a04fbea..47a9452 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -2,9 +2,6 @@ // AppDelegate.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 27/06/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Cocoa diff --git a/BuildTimeAnalyzer/CompileMeasure.swift b/BuildTimeAnalyzer/CompileMeasure.swift index e2ea0c4..b563c49 100755 --- a/BuildTimeAnalyzer/CompileMeasure.swift +++ b/BuildTimeAnalyzer/CompileMeasure.swift @@ -2,9 +2,6 @@ // CompileMeasure.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 02/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/DerivedDataManager.swift b/BuildTimeAnalyzer/DerivedDataManager.swift index dabd4e4..5ddcb59 100644 --- a/BuildTimeAnalyzer/DerivedDataManager.swift +++ b/BuildTimeAnalyzer/DerivedDataManager.swift @@ -2,9 +2,6 @@ // DerivedDataManager.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 28/06/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/DirectoryMonitor.swift b/BuildTimeAnalyzer/DirectoryMonitor.swift index 2184294..68a579c 100644 --- a/BuildTimeAnalyzer/DirectoryMonitor.swift +++ b/BuildTimeAnalyzer/DirectoryMonitor.swift @@ -2,9 +2,6 @@ // DirectoryMonitor.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 04/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/LogProcessor.swift b/BuildTimeAnalyzer/LogProcessor.swift index ef26b58..a0bf7ec 100644 --- a/BuildTimeAnalyzer/LogProcessor.swift +++ b/BuildTimeAnalyzer/LogProcessor.swift @@ -2,9 +2,6 @@ // LogProcessor.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 01/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/NSAlert+Extensions.swift b/BuildTimeAnalyzer/NSAlert+Extensions.swift index f98cafe..1824116 100644 --- a/BuildTimeAnalyzer/NSAlert+Extensions.swift +++ b/BuildTimeAnalyzer/NSAlert+Extensions.swift @@ -2,9 +2,6 @@ // NSAlert+Extensions.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 08/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Cocoa diff --git a/BuildTimeAnalyzer/ProcessingState.swift b/BuildTimeAnalyzer/ProcessingState.swift index 92d4b91..fbc7a00 100644 --- a/BuildTimeAnalyzer/ProcessingState.swift +++ b/BuildTimeAnalyzer/ProcessingState.swift @@ -2,9 +2,6 @@ // ProcessingState.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 01/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// enum ProcessingState { case processing diff --git a/BuildTimeAnalyzer/ProjectSelection.swift b/BuildTimeAnalyzer/ProjectSelection.swift index d963a43..c961412 100644 --- a/BuildTimeAnalyzer/ProjectSelection.swift +++ b/BuildTimeAnalyzer/ProjectSelection.swift @@ -2,9 +2,6 @@ // ProjectSelection.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 04/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Cocoa diff --git a/BuildTimeAnalyzer/RawMeasure.swift b/BuildTimeAnalyzer/RawMeasure.swift index b3fcc93..cad4f82 100644 --- a/BuildTimeAnalyzer/RawMeasure.swift +++ b/BuildTimeAnalyzer/RawMeasure.swift @@ -2,9 +2,6 @@ // RawMeasure.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 04/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index f748c4a..bf3b340 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -2,9 +2,6 @@ // ViewController.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 07/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Cocoa diff --git a/BuildTimeAnalyzer/XcodeWorkspace.swift b/BuildTimeAnalyzer/XcodeWorkspace.swift index 5cfcfb1..f58e70b 100644 --- a/BuildTimeAnalyzer/XcodeWorkspace.swift +++ b/BuildTimeAnalyzer/XcodeWorkspace.swift @@ -2,9 +2,6 @@ // XcodeWorkSpace.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 30/04/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// import Cocoa From 8203dea214b4cf35ee18774efe1f85a57cc05a44 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Thu, 8 Sep 2016 21:04:41 +0100 Subject: [PATCH 21/48] Added swift app icon --- .../AppIcon.appiconset/Contents.json | 30 ++++++++++++------ .../AppIcon.appiconset/logo128.png | Bin 0 -> 72032 bytes .../AppIcon.appiconset/logo16.png | Bin 0 -> 7403 bytes .../AppIcon.appiconset/logo256-1.png | Bin 0 -> 268803 bytes .../AppIcon.appiconset/logo256.png | Bin 0 -> 268803 bytes .../AppIcon.appiconset/logo32-1.png | Bin 0 -> 10491 bytes .../AppIcon.appiconset/logo32.png | Bin 0 -> 10491 bytes .../AppIcon.appiconset/logo512-1.png | Bin 0 -> 1055611 bytes .../AppIcon.appiconset/logo512.png | Bin 0 -> 1055611 bytes .../AppIcon.appiconset/logo512@2x.png | Bin 0 -> 4202331 bytes .../AppIcon.appiconset/logo64.png | Bin 0 -> 22811 bytes 11 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo128.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo16.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256-1.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo32-1.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo32.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo512-1.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo512.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo512@2x.png create mode 100644 BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo64.png diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json index 2db2b1c..97d3851 100644 --- a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,53 +1,63 @@ { "images" : [ { - "idiom" : "mac", "size" : "16x16", + "idiom" : "mac", + "filename" : "logo16.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "16x16", + "idiom" : "mac", + "filename" : "logo32-1.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "32x32", + "idiom" : "mac", + "filename" : "logo32.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "32x32", + "idiom" : "mac", + "filename" : "logo64.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "128x128", + "idiom" : "mac", + "filename" : "logo128.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "128x128", + "idiom" : "mac", + "filename" : "logo256-1.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "256x256", + "idiom" : "mac", + "filename" : "logo256.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "256x256", + "idiom" : "mac", + "filename" : "logo512-1.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "512x512", + "idiom" : "mac", + "filename" : "logo512.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "512x512", + "idiom" : "mac", + "filename" : "logo512@2x.png", "scale" : "2x" } ], diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo128.png b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo128.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa299cce3e6ce85fad32da3d2e5f9bc2027b7c1 GIT binary patch literal 72032 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 JWjFT(w&luLk%4Q64Ko< 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 literal 0 HcmV?d00001 diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256-1.png b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256-1.png new file mode 100644 index 0000000000000000000000000000000000000000..29834a2572b47c65fe96069936a8b1558cdabbd7 GIT binary patch literal 268803 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 literal 0 HcmV?d00001 diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256.png b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo256.png new file mode 100644 index 0000000000000000000000000000000000000000..29834a2572b47c65fe96069936a8b1558cdabbd7 GIT binary patch literal 268803 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 literal 0 HcmV?d00001 diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo32-1.png b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo32-1.png new file mode 100644 index 0000000000000000000000000000000000000000..07b69cdfc88732de0802a1ad631869b7cd4f294c GIT binary patch literal 10491 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

5t%zCXw>UpKNN5Bz?&a-vy31 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

5t%zCXw>UpKNN5Bz?&a-vy31 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 literal 0 HcmV?d00001 diff --git a/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo64.png b/BuildTimeAnalyzer/Assets.xcassets/AppIcon.appiconset/logo64.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe37c6a543a4e3bca90c6dade244783187a70d0 GIT binary patch literal 22811 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 Date: Sat, 10 Sep 2016 06:59:18 +0100 Subject: [PATCH 22/48] Changed version number --- BuildTimeAnalyzer/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/Info.plist b/BuildTimeAnalyzer/Info.plist index 9e3f71a..e060d65 100644 --- a/BuildTimeAnalyzer/Info.plist +++ b/BuildTimeAnalyzer/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 0.9 CFBundleSignature ???? CFBundleVersion From 66336177dc2e8c3424d33b69b4abe8cb9c592be1 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 12 Sep 2016 12:03:34 +0100 Subject: [PATCH 23/48] Changed the window name --- BuildTimeAnalyzer/Main.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index 5b7c355..03b1d0c 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -348,7 +348,7 @@ - + From 199693088c0773b7953956782ab339aa6bfd2d7b Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 12 Sep 2016 12:24:08 +0100 Subject: [PATCH 24/48] Tidied up a bit --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 4 +++ BuildTimeAnalyzer/AppDelegate.swift | 6 ++-- BuildTimeAnalyzer/CacheFile.swift | 12 +++++++ BuildTimeAnalyzer/CompileMeasure.swift | 2 +- BuildTimeAnalyzer/DerivedDataManager.swift | 6 ---- BuildTimeAnalyzer/ProcessingState.swift | 8 ++--- BuildTimeAnalyzer/ViewController.swift | 36 +++++++++------------ 7 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 BuildTimeAnalyzer/CacheFile.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index e6f7c03..9d0b751 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; 2A3698AA1D80A1AC002C5CDA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A3698A91D80A1AC002C5CDA /* Main.storyboard */; }; 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3698AB1D80A33B002C5CDA /* ViewController.swift */; }; + 2A5B32C21D86C629000705E1 /* CacheFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5B32C11D86C629000705E1 /* CacheFile.swift */; }; 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */; }; 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */; }; 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */; }; @@ -47,6 +48,7 @@ 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XcodeWorkspace.swift; sourceTree = ""; }; 2A3698A91D80A1AC002C5CDA /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 2A3698AB1D80A33B002C5CDA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 2A5B32C11D86C629000705E1 /* CacheFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheFile.swift; sourceTree = ""; }; 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryMonitor.swift; sourceTree = ""; }; 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectSelection.swift; sourceTree = ""; }; 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAlert+Extensions.swift"; sourceTree = ""; }; @@ -123,6 +125,7 @@ 2ABFB6D11D81F37300D060BF /* Models */ = { isa = PBXGroup; children = ( + 2A5B32C11D86C629000705E1 /* CacheFile.swift */, 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A3164C41D21D73F00064045 /* RawMeasure.swift */, @@ -296,6 +299,7 @@ files = ( 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */, 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */, + 2A5B32C21D86C629000705E1 /* CacheFile.swift in Sources */, 2A3164C91D21D73F00064045 /* LogProcessor.swift in Sources */, 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */, 2A3164CB1D21D73F00064045 /* ProcessingState.swift in Sources */, diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index 47a9452..cef7955 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -25,10 +25,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBAction func navigateToProjectSelection(_ sender: NSMenuItem) { configureMenuItems(showBuildTimesMenuItem: true) - guard let viewController = viewController else { return } - - viewController.cancelProcessing() - viewController.showInstructions(true) + viewController?.cancelProcessing() + viewController?.showInstructions(true) } @IBAction func navigateToBuildTimes(_ sender: NSMenuItem) { diff --git a/BuildTimeAnalyzer/CacheFile.swift b/BuildTimeAnalyzer/CacheFile.swift new file mode 100644 index 0000000..99f0e8e --- /dev/null +++ b/BuildTimeAnalyzer/CacheFile.swift @@ -0,0 +1,12 @@ +// +// CacheFile.swift +// BuildTimeAnalyzer +// + +import Foundation + +struct CacheFile { + let name: String + let path: String + let modificationDate: Date +} diff --git a/BuildTimeAnalyzer/CompileMeasure.swift b/BuildTimeAnalyzer/CompileMeasure.swift index b563c49..a1f9493 100755 --- a/BuildTimeAnalyzer/CompileMeasure.swift +++ b/BuildTimeAnalyzer/CompileMeasure.swift @@ -13,7 +13,7 @@ struct CompileMeasure { var filename: String var references: Int - fileprivate var locationArray: [Int] + private var locationArray: [Int] var fileAndLine: String { return "\(filename):\(locationArray[0])" diff --git a/BuildTimeAnalyzer/DerivedDataManager.swift b/BuildTimeAnalyzer/DerivedDataManager.swift index 5ddcb59..fcd56aa 100644 --- a/BuildTimeAnalyzer/DerivedDataManager.swift +++ b/BuildTimeAnalyzer/DerivedDataManager.swift @@ -5,12 +5,6 @@ import Foundation -struct CacheFile { - let name: String - let path: String - let modificationDate: Date -} - class DerivedDataManager { static fileprivate var _derivedDataLocation: String? diff --git a/BuildTimeAnalyzer/ProcessingState.swift b/BuildTimeAnalyzer/ProcessingState.swift index fbc7a00..588fa9c 100644 --- a/BuildTimeAnalyzer/ProcessingState.swift +++ b/BuildTimeAnalyzer/ProcessingState.swift @@ -5,7 +5,7 @@ enum ProcessingState { case processing - case waiting(shouldIndicate: Bool) + case waiting() case completed(didSucceed: Bool, stateName: String) static let cancelledString = "Cancelled" @@ -13,20 +13,16 @@ enum ProcessingState { static let failedString = "No valid logs found" static let processingString = "Processing log..." static let waitingForBuildString = "Waiting..." - static let buildString = "Building..." } extension ProcessingState : Equatable {} func ==(lhs: ProcessingState, rhs: ProcessingState) -> Bool { switch (lhs, rhs) { - case (let .waiting(shouldIndicate1), let .waiting(shouldIndicate2)): - return shouldIndicate1 == shouldIndicate2 - case (let .completed(didSucceed1, _), let .completed(didSucceed2, _)): return didSucceed1 == didSucceed2 - case (.processing, .processing): + case (.processing, .processing), (.waiting, .waiting): return true default: diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index bf3b340..6e25c0f 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -7,17 +7,17 @@ import Cocoa class ViewController: NSViewController { - @IBOutlet weak var tableView: NSTableView! + @IBOutlet weak var cancelButton: NSButton! + @IBOutlet weak var derivedDataTextField: NSTextField! @IBOutlet weak var instructionsView: NSView! + @IBOutlet weak var perFileButton: NSButton! + @IBOutlet weak var progressIndicator: NSProgressIndicator! + @IBOutlet weak var projectSelection: ProjectSelection! + @IBOutlet weak var searchField: NSSearchField! @IBOutlet weak var statusLabel: NSTextField! @IBOutlet weak var statusTextField: NSTextField! - @IBOutlet weak var progressIndicator: NSProgressIndicator! + @IBOutlet weak var tableView: NSTableView! @IBOutlet weak var tableViewContainerView: NSScrollView! - @IBOutlet weak var derivedDataTextField: NSTextField! - @IBOutlet weak var cancelButton: NSButton! - @IBOutlet weak var perFileButton: NSButton! - @IBOutlet weak var searchField: NSSearchField! - @IBOutlet weak var projectSelection: ProjectSelection! fileprivate var dataSource: [CompileMeasure] = [] fileprivate var filteredData: [CompileMeasure]? @@ -27,7 +27,7 @@ class ViewController: NSViewController { private var perFunctionTimes: [CompileMeasure] = [] private var perFileTimes: [CompileMeasure] = [] - var processingState: ProcessingState = .waiting(shouldIndicate: false) { + var processingState: ProcessingState = .waiting() { didSet { updateViewForState() } @@ -103,21 +103,15 @@ class ViewController: NSViewController { cancelButton.isHidden = false case .completed(_, let stateName): + progressIndicator.isHidden = true progressIndicator.stopAnimation(self) statusTextField.stringValue = stateName - progressIndicator.isHidden = true cancelButton.isHidden = true - case .waiting(let shouldIndicate): - if shouldIndicate { - progressIndicator.startAnimation(self) - statusTextField.stringValue = ProcessingState.buildString - showInstructions(false) - } else { - progressIndicator.stopAnimation(self) - statusTextField.stringValue = ProcessingState.waitingForBuildString - } - progressIndicator.isHidden = !shouldIndicate + case .waiting(): + progressIndicator.isHidden = true + progressIndicator.stopAnimation(self) + statusTextField.stringValue = ProcessingState.waitingForBuildString cancelButton.isHidden = true } @@ -156,6 +150,8 @@ class ViewController: NSViewController { } } + // MARK: Utilities + func cancelProcessing() { guard processingState == .processing else { return } @@ -164,8 +160,6 @@ class ViewController: NSViewController { canUpdateViewForState = false } - // MARK: Utilities - func configureMenuItems(showBuildTimesMenuItem: Bool) { if let appDelegate = NSApp.delegate as? AppDelegate { appDelegate.configureMenuItems(showBuildTimesMenuItem: showBuildTimesMenuItem) From 7d0ab60dc0f00883472b8e2df27108c459571606 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 12 Sep 2016 12:46:08 +0100 Subject: [PATCH 25/48] Ability to open file --- BuildTimeAnalyzer/ViewController.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index 6e25c0f..7a0eda5 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -203,6 +203,13 @@ extension ViewController: NSTableViewDataSource { func numberOfRows(in tableView: NSTableView) -> Int { return filteredData?.count ?? dataSource.count } + + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + let item = filteredData?[row] ?? dataSource[row] + NSWorkspace.shared().openFile(item.path) + + return true + } } // MARK: NSTableViewDelegate From 508bc034b1e7dddd690af1c5ca8e8b6eebe049c9 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 12 Sep 2016 19:42:34 +0100 Subject: [PATCH 26/48] Process the build files automatically --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 16 ++- BuildTimeAnalyzer/BuildManager.swift | 73 +++++++++++++ BuildTimeAnalyzer/DerivedDataManager.swift | 22 +++- BuildTimeAnalyzer/DirectoryMonitor.swift | 45 ++++++-- BuildTimeAnalyzer/File.swift | 14 +++ BuildTimeAnalyzer/LogProcessor.swift | 23 ++--- BuildTimeAnalyzer/Main.storyboard | 9 +- BuildTimeAnalyzer/NSAlert+Extensions.swift | 3 +- BuildTimeAnalyzer/ProjectSelection.swift | 39 +++---- BuildTimeAnalyzer/ViewController.swift | 50 +++++++-- BuildTimeAnalyzer/XcodeDatabase.swift | 76 ++++++++++++++ BuildTimeAnalyzer/XcodeWorkspace.swift | 107 -------------------- 12 files changed, 303 insertions(+), 174 deletions(-) create mode 100644 BuildTimeAnalyzer/BuildManager.swift create mode 100644 BuildTimeAnalyzer/File.swift create mode 100644 BuildTimeAnalyzer/XcodeDatabase.swift delete mode 100644 BuildTimeAnalyzer/XcodeWorkspace.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 9d0b751..8472dea 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -13,10 +13,12 @@ 2A3164CC1D21D73F00064045 /* RawMeasure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164C41D21D73F00064045 /* RawMeasure.swift */; }; 2A3164D01D21D74A00064045 /* CompileMeasureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164CF1D21D74A00064045 /* CompileMeasureTests.swift */; }; 2A3164D51D21D77500064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; - 2A3164D91D21D7F800064045 /* XcodeWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */; }; 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3164D41D21D77500064045 /* NSData+GZIP.m */; }; 2A3698AA1D80A1AC002C5CDA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A3698A91D80A1AC002C5CDA /* Main.storyboard */; }; 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3698AB1D80A33B002C5CDA /* ViewController.swift */; }; + 2A5404011D86D01700DBD44C /* BuildManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5404001D86D01700DBD44C /* BuildManager.swift */; }; + 2A5404031D86DE0C00DBD44C /* XcodeDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5404021D86DE0C00DBD44C /* XcodeDatabase.swift */; }; + 2A5404051D86F3C700DBD44C /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5404041D86F3C700DBD44C /* File.swift */; }; 2A5B32C21D86C629000705E1 /* CacheFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5B32C11D86C629000705E1 /* CacheFile.swift */; }; 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */; }; 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */; }; @@ -45,9 +47,11 @@ 2A3164D21D21D77500064045 /* BuildTimeAnalyzerTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BuildTimeAnalyzerTests-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; 2A3164D31D21D77500064045 /* NSData+GZIP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GZIP.h"; path = "GZIP/NSData+GZIP.h"; sourceTree = ""; }; 2A3164D41D21D77500064045 /* NSData+GZIP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+GZIP.m"; path = "GZIP/NSData+GZIP.m"; sourceTree = ""; }; - 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XcodeWorkspace.swift; sourceTree = ""; }; 2A3698A91D80A1AC002C5CDA /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; 2A3698AB1D80A33B002C5CDA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 2A5404001D86D01700DBD44C /* BuildManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BuildManager.swift; sourceTree = ""; }; + 2A5404021D86DE0C00DBD44C /* XcodeDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XcodeDatabase.swift; sourceTree = ""; }; + 2A5404041D86F3C700DBD44C /* File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; 2A5B32C11D86C629000705E1 /* CacheFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheFile.swift; sourceTree = ""; }; 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryMonitor.swift; sourceTree = ""; }; 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectSelection.swift; sourceTree = ""; }; @@ -127,8 +131,10 @@ children = ( 2A5B32C11D86C629000705E1 /* CacheFile.swift */, 2A3164C01D21D73F00064045 /* CompileMeasure.swift */, + 2A5404041D86F3C700DBD44C /* File.swift */, 2A3164C31D21D73F00064045 /* ProcessingState.swift */, 2A3164C41D21D73F00064045 /* RawMeasure.swift */, + 2A5404021D86DE0C00DBD44C /* XcodeDatabase.swift */, ); name = Models; sourceTree = ""; @@ -144,11 +150,11 @@ 2ABFB6D31D81F82600D060BF /* Utilities */ = { isa = PBXGroup; children = ( + 2A5404001D86D01700DBD44C /* BuildManager.swift */, 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */, 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, 2A3164C11D21D73F00064045 /* LogProcessor.swift */, 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, - 2A3164D81D21D7F800064045 /* XcodeWorkspace.swift */, ); name = Utilities; sourceTree = ""; @@ -301,14 +307,16 @@ 2A3164DA1D21D90100064045 /* NSData+GZIP.m in Sources */, 2A5B32C21D86C629000705E1 /* CacheFile.swift in Sources */, 2A3164C91D21D73F00064045 /* LogProcessor.swift in Sources */, + 2A5404011D86D01700DBD44C /* BuildManager.swift in Sources */, + 2A5404051D86F3C700DBD44C /* File.swift in Sources */, 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */, + 2A5404031D86DE0C00DBD44C /* XcodeDatabase.swift in Sources */, 2A3164CB1D21D73F00064045 /* ProcessingState.swift in Sources */, 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */, 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */, 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */, 2A3164CC1D21D73F00064045 /* RawMeasure.swift in Sources */, 2A3164C81D21D73F00064045 /* CompileMeasure.swift in Sources */, - 2A3164D91D21D7F800064045 /* XcodeWorkspace.swift in Sources */, 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/BuildTimeAnalyzer/BuildManager.swift b/BuildTimeAnalyzer/BuildManager.swift new file mode 100644 index 0000000..30504bf --- /dev/null +++ b/BuildTimeAnalyzer/BuildManager.swift @@ -0,0 +1,73 @@ +// +// BuildManager.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 12/09/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Cocoa + +protocol BuildManagerDelegate: class { + func buildManager(_ buildManager: BuildManager, shouldParseLogWithDatabase database: XcodeDatabase) +} + +class BuildManager: NSObject { + + weak var delegate: BuildManagerDelegate? + + private let derivedDataDirectoryMonitor = DirectoryMonitor(isDerivedData: true) + private let logFolderDirectoryMonitor = DirectoryMonitor(isDerivedData: false) + + private var currentDataBase: XcodeDatabase? + + override func awakeFromNib() { + super.awakeFromNib() + startMonitoring() + } + + func startMonitoring() { + derivedDataDirectoryMonitor.delegate = self + logFolderDirectoryMonitor.delegate = self + + derivedDataDirectoryMonitor.stopMonitoring() + derivedDataDirectoryMonitor.startMonitoring(path: DerivedDataManager.derivedDataLocation) + } + + func database(forFolder URL: URL) -> XcodeDatabase? { + let databaseURL = URL.appendingPathComponent("Cache.db") + return XcodeDatabase(fromPath: databaseURL.path) + } + + func processDerivedData() { + guard let mostRecent = DerivedDataManager.derivedData().first else { return } + + let logFolder = mostRecent.url.appendingPathComponent("Logs/Build").path + guard logFolderDirectoryMonitor.path != logFolder else { return } + + logFolderDirectoryMonitor.stopMonitoring() + logFolderDirectoryMonitor.startMonitoring(path: logFolder) + } + + func processLogFolder(with url: URL) { + guard let activeDatabase = database(forFolder: url), + activeDatabase.isBuildType, + activeDatabase != currentDataBase else { return } + + currentDataBase = activeDatabase + delegate?.buildManager(self, shouldParseLogWithDatabase: activeDatabase) + } +} + +extension BuildManager: DirectoryMonitorDelegate { + func directoryMonitorDidObserveChange(_ directoryMonitor: DirectoryMonitor, isDerivedData: Bool) { + if isDerivedData { + processDerivedData() + } else if let path = directoryMonitor.path { + // TODO: If we don't dispatch, it seems it fires off too soon + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.processLogFolder(with: URL(fileURLWithPath: path)) + } + } + } +} diff --git a/BuildTimeAnalyzer/DerivedDataManager.swift b/BuildTimeAnalyzer/DerivedDataManager.swift index fcd56aa..d00cd10 100644 --- a/BuildTimeAnalyzer/DerivedDataManager.swift +++ b/BuildTimeAnalyzer/DerivedDataManager.swift @@ -27,6 +27,22 @@ class DerivedDataManager { } } + static func derivedData() -> [File] { + let url = URL(fileURLWithPath: derivedDataLocation) + + let folders = DerivedDataManager.listFolders(at: url) + let fileManager = FileManager.default + + return folders.flatMap{ (url) -> File? in + if url.lastPathComponent != "ModuleCache", + let properties = try? fileManager.attributesOfItem(atPath: url.path), + let modificationDate = properties[FileAttributeKey.modificationDate] as? Date { + return File(date: modificationDate, url: url) + } + return nil + }.sorted{ $0.date > $1.date } + } + static func listFolders(at url: URL) -> [URL] { let fileManager = FileManager.default let keys = [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey] @@ -38,12 +54,12 @@ class DerivedDataManager { } static func listCacheFiles() -> [CacheFile] { - let cacheFiles = getCacheFiles(at: URL(fileURLWithPath: derivedDataLocation)) + let files = cacheFiles(at: URL(fileURLWithPath: derivedDataLocation)) let earliestDate = Date().addingTimeInterval(-24 * 60 * 60) - return filterFiles(cacheFiles, byEarliestDate: earliestDate) + return filterFiles(files, byEarliestDate: earliestDate) } - static private func getCacheFiles(at url: URL) -> [CacheFile] { + static private func cacheFiles(at url: URL) -> [CacheFile] { let fileManager = FileManager.default let keys = [URLResourceKey.nameKey, URLResourceKey.isDirectoryKey] let options: FileManager.DirectoryEnumerationOptions = [.skipsHiddenFiles, .skipsPackageDescendants, .skipsSubdirectoryDescendants] diff --git a/BuildTimeAnalyzer/DirectoryMonitor.swift b/BuildTimeAnalyzer/DirectoryMonitor.swift index 68a579c..b39d5fe 100644 --- a/BuildTimeAnalyzer/DirectoryMonitor.swift +++ b/BuildTimeAnalyzer/DirectoryMonitor.swift @@ -6,23 +6,32 @@ import Foundation protocol DirectoryMonitorDelegate: class { - func directoryMonitorDidObserveChange(_ directoryMonitor: DirectoryMonitor) + func directoryMonitorDidObserveChange(_ directoryMonitor: DirectoryMonitor, isDerivedData: Bool) } class DirectoryMonitor { - let dispatchQueue = DispatchQueue(label: "uk.co.canemedia.directorymonitor", attributes: .concurrent) + var dispatchQueue: DispatchQueue weak var delegate: DirectoryMonitorDelegate? var fileDescriptor: Int32 = -1 var dispatchSource: DispatchSourceFileSystemObject? - var path: String + var isDerivedData: Bool + var path: String? + var timer: Timer? + var lastDerivedDataDate = Date() + var isMonitoringDates = false - init(path: String) { - self.path = path + init(isDerivedData: Bool) { + self.isDerivedData = isDerivedData + + let suffix = isDerivedData ? "deriveddata" : "logfolder" + dispatchQueue = DispatchQueue(label: "uk.co.canemedia.directorymonitor.\(suffix)", attributes: .concurrent) } - func startMonitoring() { + func startMonitoring(path: String) { + self.path = path + guard dispatchSource == nil && fileDescriptor == -1 else { return } fileDescriptor = open(path, O_EVTONLY) @@ -31,7 +40,7 @@ class DirectoryMonitor { dispatchSource = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fileDescriptor, eventMask: .all, queue: dispatchQueue) dispatchSource?.setEventHandler { DispatchQueue.main.async { - self.delegate?.directoryMonitorDidObserveChange(self) + self.delegate?.directoryMonitorDidObserveChange(self, isDerivedData: self.isDerivedData) } } dispatchSource?.setCancelHandler { @@ -39,11 +48,33 @@ class DirectoryMonitor { self.fileDescriptor = -1 self.dispatchSource = nil + self.path = nil } dispatchSource?.resume() + + if isDerivedData && !isMonitoringDates { + isMonitoringDates = true + monitorModificationDates() + } } func stopMonitoring() { dispatchSource?.cancel() + path = nil + } + + func monitorModificationDates() { + if let date = DerivedDataManager.derivedData().first?.date, date > lastDerivedDataDate { + lastDerivedDataDate = date + self.delegate?.directoryMonitorDidObserveChange(self, isDerivedData: self.isDerivedData) + } + + if path != nil { + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.monitorModificationDates() + } + } else { + isMonitoringDates = false + } } } diff --git a/BuildTimeAnalyzer/File.swift b/BuildTimeAnalyzer/File.swift new file mode 100644 index 0000000..a3c749a --- /dev/null +++ b/BuildTimeAnalyzer/File.swift @@ -0,0 +1,14 @@ +// +// File.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 12/09/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Foundation + +struct File { + let date: Date + let url: URL +} diff --git a/BuildTimeAnalyzer/LogProcessor.swift b/BuildTimeAnalyzer/LogProcessor.swift index a0bf7ec..4e82f83 100644 --- a/BuildTimeAnalyzer/LogProcessor.swift +++ b/BuildTimeAnalyzer/LogProcessor.swift @@ -10,7 +10,6 @@ typealias CMUpdateClosure = (_ result: [CompileMeasure], _ didComplete: Bool) -> protocol LogProcessorProtocol: class { var rawMeasures: [String: RawMeasure] { get set } var updateHandler: CMUpdateClosure? { get set } - var workspace: XcodeWorkSpace? { get set } var shouldCancel: Bool { get set } func processingDidStart() @@ -18,18 +17,15 @@ protocol LogProcessorProtocol: class { } extension LogProcessorProtocol { - func processCacheFile(at path: String, updateHandler: CMUpdateClosure?) { - workspace = XcodeWorkSpace() - workspace?.logText(forCacheAtPath: path) { [weak self] (text) in - guard let text = text else { - updateHandler?([], true) - return - } - - self?.updateHandler = updateHandler - DispatchQueue.global().async { - self?.process(text: text) - } + func processDatabase(database: XcodeDatabase, updateHandler: CMUpdateClosure?) { + guard let text = database.processLog() else { + updateHandler?([], true) + return + } + + self.updateHandler = updateHandler + DispatchQueue.global().async { + self.process(text: text) } } @@ -110,7 +106,6 @@ class LogProcessor: NSObject, LogProcessorProtocol { var rawMeasures: [String: RawMeasure] = [:] var updateHandler: CMUpdateClosure? - var workspace: XcodeWorkSpace? var shouldCancel = false var timer: Timer? diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index 03b1d0c..bc837d3 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -362,7 +362,7 @@ - + @@ -660,8 +660,8 @@ Gw - - + + @@ -839,6 +839,7 @@ Gw + @@ -854,10 +855,10 @@ Gw - + diff --git a/BuildTimeAnalyzer/NSAlert+Extensions.swift b/BuildTimeAnalyzer/NSAlert+Extensions.swift index 1824116..e8bd2d2 100644 --- a/BuildTimeAnalyzer/NSAlert+Extensions.swift +++ b/BuildTimeAnalyzer/NSAlert+Extensions.swift @@ -6,9 +6,10 @@ import Cocoa extension NSAlert { - static func show(withMessage message: String) { + static func show(withMessage message: String, andInformativeText informativeText: String = "") { let alert = NSAlert() alert.messageText = message + alert.informativeText = informativeText alert.alertStyle = .warning alert.addButton(withTitle: "OK") alert.runModal() diff --git a/BuildTimeAnalyzer/ProjectSelection.swift b/BuildTimeAnalyzer/ProjectSelection.swift index c961412..b43e91d 100644 --- a/BuildTimeAnalyzer/ProjectSelection.swift +++ b/BuildTimeAnalyzer/ProjectSelection.swift @@ -5,19 +5,17 @@ import Cocoa -@objc protocol ProjectSelectionDelegate: class { - func didSelectProject(with url: URL) +protocol ProjectSelectionDelegate: class { + func didSelectProject(with database: XcodeDatabase) } class ProjectSelection: NSObject { - typealias SourceType = (date: Date, url: URL) - @IBOutlet weak var tableView: NSTableView! - @IBOutlet weak var delegate: ProjectSelectionDelegate? + weak var delegate: ProjectSelectionDelegate? private var directoryMonitor: DirectoryMonitor? - fileprivate var dataSource: [SourceType] = [] + fileprivate var dataSource: [XcodeDatabase] = [] static fileprivate let dateFormatter: DateFormatter = { let dateFormatter = DateFormatter() @@ -28,10 +26,10 @@ class ProjectSelection: NSObject { func startMonitoringDerivedData() { if directoryMonitor == nil { - directoryMonitor = DirectoryMonitor(path: DerivedDataManager.derivedDataLocation) + directoryMonitor = DirectoryMonitor(isDerivedData: true) directoryMonitor?.delegate = self } - directoryMonitor?.startMonitoring() + directoryMonitor?.startMonitoring(path: DerivedDataManager.derivedDataLocation) } func stopMonitoringDerivedData() { @@ -39,20 +37,9 @@ class ProjectSelection: NSObject { } func listFolders() { - let url = URL(fileURLWithPath: DerivedDataManager.derivedDataLocation) - - - let folders = DerivedDataManager.listFolders(at: url) - let fileManager = FileManager.default - - dataSource = folders.flatMap{ (url) -> SourceType? in - if url.lastPathComponent != "ModuleCache", - let properties = try? fileManager.attributesOfItem(atPath: url.path), - let modificationDate = properties[FileAttributeKey.modificationDate] as? Date { - return SourceType(date: modificationDate, url: url) - } - return nil - }.sorted{ $0.date > $1.date } + dataSource = DerivedDataManager.derivedData().flatMap{ + XcodeDatabase(fromPath: $0.url.appendingPathComponent("Logs/Build/Cache.db").path) + }.filter{ $0.isBuildType } tableView.reloadData() } @@ -60,7 +47,7 @@ class ProjectSelection: NSObject { @IBAction func didSelectCell(_ sender: NSTableView) { stopMonitoringDerivedData() - delegate?.didSelectProject(with: dataSource[sender.selectedRow].url) + delegate?.didSelectProject(with: dataSource[sender.selectedRow]) } } @@ -86,9 +73,9 @@ extension ProjectSelection: NSTableViewDelegate { switch columnIndex { case 0: - value = source.url.lastPathComponent + value = source.schemeName default: - value = ProjectSelection.dateFormatter.string(from: source.date) + value = ProjectSelection.dateFormatter.string(from: source.modificationDate) } cellView?.textField?.stringValue = value @@ -99,7 +86,7 @@ extension ProjectSelection: NSTableViewDelegate { // MARK: DirectoryMonitorDelegate extension ProjectSelection: DirectoryMonitorDelegate { - func directoryMonitorDidObserveChange(_ directoryMonitor: DirectoryMonitor) { + func directoryMonitorDidObserveChange(_ directoryMonitor: DirectoryMonitor, isDerivedData: Bool) { listFolders() } } diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index 7a0eda5..9c5c6dc 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -7,6 +7,7 @@ import Cocoa class ViewController: NSViewController { + @IBOutlet var buildManager: BuildManager! @IBOutlet weak var cancelButton: NSButton! @IBOutlet weak var derivedDataTextField: NSTextField! @IBOutlet weak var instructionsView: NSView! @@ -23,6 +24,9 @@ class ViewController: NSViewController { fileprivate var filteredData: [CompileMeasure]? fileprivate var canUpdateViewForState = true + private var currentKey: String? + private var nextDatabase: XcodeDatabase? + private var processor = LogProcessor() private var perFunctionTimes: [CompileMeasure] = [] private var perFileTimes: [CompileMeasure] = [] @@ -40,6 +44,9 @@ class ViewController: NSViewController { configureLayout() + buildManager.delegate = self + projectSelection.delegate = self + projectSelection.listFolders() projectSelection.startMonitoringDerivedData() } @@ -166,10 +173,23 @@ class ViewController: NSViewController { } } - func processFile(at url: URL) { + func processLog(with database: XcodeDatabase) { + guard processingState != .processing else { + if let currentKey = currentKey, currentKey != database.key { + nextDatabase = database + processor.shouldCancel = true + } + return + } + + canUpdateViewForState = true + configureMenuItems(showBuildTimesMenuItem: false) + NSLog("Starting \(database.key)") + processingState = .processing + currentKey = database.key - processor.processCacheFile(at: url.path) { [weak self] (result, didComplete) in + processor.processDatabase(database: database) { [weak self] (result, didComplete) in guard let `self` = self else { return } self.dataSource = result @@ -178,12 +198,21 @@ class ViewController: NSViewController { self.tableView.reloadData() if didComplete { + NSLog("Did complete %@", database.key) let didSucceed = !self.dataSource.isEmpty let stateName = didSucceed ? ProcessingState.completedString : ProcessingState.failedString self.processingState = .completed(didSucceed: didSucceed, stateName: stateName) + self.currentKey = nil + + if let nextDatabase = self.nextDatabase { + self.nextDatabase = nil + self.processLog(with: nextDatabase) + } + if !didSucceed { - NSAlert.show(withMessage: ProcessingState.failedString) + let text = "Ensure the Swift compiler flags has been added." + NSAlert.show(withMessage: ProcessingState.failedString, andInformativeText: text) self.showInstructions(true) self.configureMenuItems(showBuildTimesMenuItem: true) @@ -225,13 +254,18 @@ extension ViewController: NSTableViewDelegate { } } +// MARK: BuildManagerDelegate + +extension ViewController: BuildManagerDelegate { + func buildManager(_ buildManager: BuildManager, shouldParseLogWithDatabase database: XcodeDatabase) { + processLog(with: database) + } +} + // MARK: ProjectSelectionDelegate extension ViewController: ProjectSelectionDelegate { - func didSelectProject(with url: URL) { - canUpdateViewForState = true - - configureMenuItems(showBuildTimesMenuItem: false) - processFile(at: url.appendingPathComponent("Logs/Build/Cache.db")) + func didSelectProject(with database: XcodeDatabase) { + processLog(with: database) } } diff --git a/BuildTimeAnalyzer/XcodeDatabase.swift b/BuildTimeAnalyzer/XcodeDatabase.swift new file mode 100644 index 0000000..b6009c0 --- /dev/null +++ b/BuildTimeAnalyzer/XcodeDatabase.swift @@ -0,0 +1,76 @@ +// +// XcodeDatabase.swift +// BuildTimeAnalyzer +// +// Created by Robert Gummesson on 12/09/2016. +// Copyright © 2016 Cane Media Ltd. All rights reserved. +// + +import Foundation + +struct XcodeDatabase { + var path: String + var modificationDate: Date + + var key: String + var schemeName: String + var title: String + + var isBuildType: Bool { + return title.hasPrefix("Build ") || title.hasPrefix("Compile ") + } + + var url: URL { + return URL(fileURLWithPath: path) + } + + var logUrl: URL { + return folderPath.appendingPathComponent("\(key).xcactivitylog") + } + + var folderPath: URL { + return url.deletingLastPathComponent() + } + + init?(fromPath path: String) { + guard let data = NSDictionary(contentsOfFile: path)?["logs"] as? [String: AnyObject], + let key = XcodeDatabase.sortKeys(usingData: data).last?.key, + let value = data[key] as? [String : AnyObject], + let schemeName = value["schemeIdentifier-schemeName"] as? String, + let title = value["title"] as? String, + let fileAttributes = try? FileManager.default.attributesOfItem(atPath: path), + let modificationDate = fileAttributes[FileAttributeKey.modificationDate] as? Date + else { return nil } + + self.modificationDate = modificationDate + self.path = path + self.key = key + self.schemeName = schemeName + self.title = title + } + + func processLog() -> String? { + if let rawData = try? Data(contentsOf: URL(fileURLWithPath: logUrl.path)), + let data = (rawData as NSData).gunzipped() { + return String(data: data, encoding: String.Encoding.utf8) + } + return nil + } + + static private func sortKeys(usingData data: [String: AnyObject]) -> [(UInt, key: String)] { + var sortedKeys: [(UInt, key: String)] = [] + for key in data.keys { + if let value = data[key] as? [String: AnyObject], + let timeStoppedRecording = value["timeStoppedRecording"] as? UInt { + sortedKeys.append((timeStoppedRecording, key)) + } + } + return sortedKeys.sorted{ $0.0 < $1.0 } + } +} + +extension XcodeDatabase : Equatable {} + +func ==(lhs: XcodeDatabase, rhs: XcodeDatabase) -> Bool { + return lhs.path == rhs.path && lhs.modificationDate == rhs.modificationDate +} diff --git a/BuildTimeAnalyzer/XcodeWorkspace.swift b/BuildTimeAnalyzer/XcodeWorkspace.swift deleted file mode 100644 index f58e70b..0000000 --- a/BuildTimeAnalyzer/XcodeWorkspace.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// XcodeWorkSpace.swift -// BuildTimeAnalyzer -// - -import Cocoa - -protocol XcodeWorkSpaceProtocol { - var focusLostHandler: (() -> ())? { get set } - - func willOpenDocument(atLineNumber lineNumber: Int, usingTextView textView: NSTextView?) -} - -extension XcodeWorkSpaceProtocol { - - func logText(forCacheAtPath path: String, completionHandler: ((_ text: String?) -> ())) { - guard let lastBuild = lastBuildKey(fromPath: path), - let folderURL = NSURL(fileURLWithPath: path).deletingLastPathComponent else { - completionHandler(nil) - return - } - let logFile = folderURL.appendingPathComponent(lastBuild).appendingPathExtension("xcactivitylog").path - completionHandler(contentsOfFile(logFile)) - } - - mutating func openFile(atPath path: String, andLineNumber lineNumber: Int, focusLostHandler: (() -> ())) { - _ = NSApp.delegate?.application?(NSApp, openFile: path) - } - - fileprivate func lastBuildKey(fromPath path: String) -> String? { - return lastDatabaseEntry(fromPath: path, usingFunction: { (key, value) -> String? in - if let title = value["title"] as? String , title.hasPrefix("Build ") || title.hasPrefix("Compile "){ - return key - } - return nil - }) - } - - fileprivate func lastSchemeName(fromPath path: String) -> String? { - return lastDatabaseEntry(fromPath: path, usingFunction: { (key, value) -> String? in - return value["schemeIdentifier-schemeName"] as? String - }) - } - - fileprivate func lastDatabaseEntry(fromPath path: String, usingFunction f: (_ key: String, _ value: [String : AnyObject]) -> String?) -> String? { - guard let data = NSDictionary(contentsOfFile: path)?["logs"] as? [String: AnyObject], - let key = sortKeys(usingData: data).last?.key, - let value = data[key] as? [String : AnyObject] else { return nil } - - return f(key, value) - } - - fileprivate func sortKeys(usingData data: [String: AnyObject]) -> [(UInt, key: String)] { - var sortedKeys: [(UInt, key: String)] = [] - for key in data.keys { - if let value = data[key] as? [String: AnyObject], - let timeStoppedRecording = value["timeStoppedRecording"] as? UInt { - sortedKeys.append((timeStoppedRecording, key)) - } - } - return sortedKeys.sorted{ $0.0 < $1.0 } - } - - fileprivate func contentsOfFile(_ path: String) -> String? { - if let rawData = try? Data(contentsOf: URL(fileURLWithPath: path)), - let data = (rawData as NSData).gunzipped() { - return String(data: data, encoding: String.Encoding.utf8) - } - return nil - } - - fileprivate func creationDateForFile(_ path: String) -> Date? { - let fileAttributes = try? FileManager.default.attributesOfItem(atPath: path) - return fileAttributes?[FileAttributeKey.creationDate] as? Date - } -} - -class XcodeWorkSpace: NSObject, XcodeWorkSpaceProtocol { - - var lineNumber = 0 - var focusLostHandler: (() -> ())? - - func willOpenDocument(atLineNumber lineNumber: Int, usingTextView textView: NSTextView?) { - self.lineNumber = lineNumber - if let textView = textView { - adjustSelection(forTextView: textView) - } - } - - func adjustSelection(forTextView textView: NSTextView?) { - guard let textView = textView, let text = textView.textStorage?.string else { return } - - let subSequences = text.characters.split(separator: "\n", omittingEmptySubsequences: false) - let lineCount = subSequences.count > lineNumber ? lineNumber : subSequences.count - - var characterCount = 0 - subSequences.dropLast(subSequences.count - lineCount).forEach({ (subSequence) in - characterCount += String(subSequence).characters.count - }) - - let range = NSMakeRange(characterCount + lineNumber - 1, 0) - if range.location < text.characters.count { - textView.selectedRange = range - textView.scrollRangeToVisible(range) - } - } -} From 03e2f20185548a26016f58a61c1d14a4a88499b1 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Mon, 12 Sep 2016 20:05:12 +0100 Subject: [PATCH 27/48] Ability to go back --- BuildTimeAnalyzer/Main.storyboard | 32 ++++++++++++++++++-------- BuildTimeAnalyzer/ViewController.swift | 10 ++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index bc837d3..2d0487d 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -371,6 +371,16 @@ + - + @@ -565,7 +575,7 @@ - + @@ -573,7 +583,7 @@ - + @@ -581,10 +591,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -677,26 +685,28 @@ Gw + - + - + + + + - - + - @@ -704,6 +714,7 @@ Gw + diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index a785f52..e084914 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -9,6 +9,7 @@ class ViewController: NSViewController { @IBOutlet var buildManager: BuildManager! @IBOutlet weak var cancelButton: NSButton! + @IBOutlet weak var compileTimeTextField: NSTextField! @IBOutlet weak var derivedDataTextField: NSTextField! @IBOutlet weak var instructionsView: NSView! @IBOutlet weak var leftButton: NSButton! @@ -62,6 +63,7 @@ class ViewController: NSViewController { func configureLayout() { derivedDataTextField.stringValue = DerivedDataManager.derivedDataLocation + updateTotalLabel(with: 0) updateViewForState() showInstructions(true) } @@ -69,6 +71,7 @@ class ViewController: NSViewController { func showInstructions(_ show: Bool) { instructionsView.isHidden = !show + compileTimeTextField.isHidden = show leftButton.isHidden = show perFileButton.isHidden = show searchField.isHidden = show @@ -192,11 +195,12 @@ class ViewController: NSViewController { canUpdateViewForState = true configureMenuItems(showBuildTimesMenuItem: false) - NSLog("Starting \(database.key)") processingState = .processing currentKey = database.key + updateTotalLabel(with: database.buildTime) + processor.processDatabase(database: database) { [weak self] (result, didComplete) in self?.handleProcessorUpdate(result: result, didComplete: didComplete) } @@ -234,6 +238,17 @@ class ViewController: NSViewController { } } + func updateTotalLabel(with buildTime: Int) { + if buildTime < 60 { + compileTimeTextField.stringValue = "Build Time: \(buildTime)s" + } else { + let minutes = buildTime / 60 + let seconds = String(format: "%02d", buildTime % 60) + + compileTimeTextField.stringValue = "Build Time: \(minutes)m \(seconds)s" + } + } + func textContains(_ text: String) -> Bool { return text.lowercased().contains(searchField.stringValue.lowercased()) } diff --git a/BuildTimeAnalyzer/XcodeDatabase.swift b/BuildTimeAnalyzer/XcodeDatabase.swift index b6009c0..f8ab89d 100644 --- a/BuildTimeAnalyzer/XcodeDatabase.swift +++ b/BuildTimeAnalyzer/XcodeDatabase.swift @@ -15,6 +15,8 @@ struct XcodeDatabase { var key: String var schemeName: String var title: String + var timeStartedRecording: Int + var timeStoppedRecording: Int var isBuildType: Bool { return title.hasPrefix("Build ") || title.hasPrefix("Compile ") @@ -32,12 +34,18 @@ struct XcodeDatabase { return url.deletingLastPathComponent() } + var buildTime: Int { + return timeStoppedRecording - timeStartedRecording + } + init?(fromPath path: String) { guard let data = NSDictionary(contentsOfFile: path)?["logs"] as? [String: AnyObject], let key = XcodeDatabase.sortKeys(usingData: data).last?.key, let value = data[key] as? [String : AnyObject], let schemeName = value["schemeIdentifier-schemeName"] as? String, let title = value["title"] as? String, + let timeStartedRecording = value["timeStartedRecording"] as? Int, + let timeStoppedRecording = value["timeStoppedRecording"] as? Int, let fileAttributes = try? FileManager.default.attributesOfItem(atPath: path), let modificationDate = fileAttributes[FileAttributeKey.modificationDate] as? Date else { return nil } @@ -47,6 +55,8 @@ struct XcodeDatabase { self.key = key self.schemeName = schemeName self.title = title + self.timeStartedRecording = timeStartedRecording + self.timeStoppedRecording = timeStoppedRecording } func processLog() -> String? { @@ -57,11 +67,11 @@ struct XcodeDatabase { return nil } - static private func sortKeys(usingData data: [String: AnyObject]) -> [(UInt, key: String)] { - var sortedKeys: [(UInt, key: String)] = [] + static private func sortKeys(usingData data: [String: AnyObject]) -> [(Int, key: String)] { + var sortedKeys: [(Int, key: String)] = [] for key in data.keys { if let value = data[key] as? [String: AnyObject], - let timeStoppedRecording = value["timeStoppedRecording"] as? UInt { + let timeStoppedRecording = value["timeStoppedRecording"] as? Int { sortedKeys.append((timeStoppedRecording, key)) } } From 35128c6dd5010d4ba0d6e052f4f0fad532a78fc7 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 13:34:29 +0100 Subject: [PATCH 35/48] Ensure only one digit is used --- BuildTimeAnalyzer/CompileMeasure.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/CompileMeasure.swift b/BuildTimeAnalyzer/CompileMeasure.swift index a1f9493..3cee53e 100755 --- a/BuildTimeAnalyzer/CompileMeasure.swift +++ b/BuildTimeAnalyzer/CompileMeasure.swift @@ -28,7 +28,7 @@ struct CompileMeasure { } var timeString: String { - return "\(time)ms" + return String(format: "%.1fms", time) } init?(time: Double, rawPath: String, code: String, references: Int) { From 1c90cc01ed08bdb01af165b30b079bdd895448c7 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 13:59:40 +0100 Subject: [PATCH 36/48] Update appropriately when cancelled --- BuildTimeAnalyzer/LogProcessor.swift | 19 ++++++++++--------- BuildTimeAnalyzer/ProcessingState.swift | 2 +- BuildTimeAnalyzer/ViewController.swift | 25 +++++++++++++------------ 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/BuildTimeAnalyzer/LogProcessor.swift b/BuildTimeAnalyzer/LogProcessor.swift index 4e82f83..b274bcd 100644 --- a/BuildTimeAnalyzer/LogProcessor.swift +++ b/BuildTimeAnalyzer/LogProcessor.swift @@ -5,7 +5,7 @@ import Foundation -typealias CMUpdateClosure = (_ result: [CompileMeasure], _ didComplete: Bool) -> () +typealias CMUpdateClosure = (_ result: [CompileMeasure], _ didComplete: Bool, _ didCancel: Bool) -> () protocol LogProcessorProtocol: class { var rawMeasures: [String: RawMeasure] { get set } @@ -19,7 +19,7 @@ protocol LogProcessorProtocol: class { extension LogProcessorProtocol { func processDatabase(database: XcodeDatabase, updateHandler: CMUpdateClosure?) { guard let text = database.processLog() else { - updateHandler?([], true) + updateHandler?([], true, false) return } @@ -66,16 +66,16 @@ extension LogProcessorProtocol { processingDidFinish() } - fileprivate func updateResults(_ didComplete: Bool) { - var filteredResults = rawMeasures.values.filter({ $0.time > 10 }) + fileprivate func updateResults(didComplete completed: Bool, didCancel: Bool) { + var filteredResults = rawMeasures.values.filter{ $0.time > 10 } if filteredResults.count < 20 { - filteredResults = rawMeasures.values.filter({ $0.time > 0.1 }) + filteredResults = rawMeasures.values.filter{ $0.time > 0.1 } } let sortedResults = filteredResults.sorted(by: { $0.time > $1.time }) - updateHandler?(processResult(sortedResults), didComplete) + updateHandler?(processResult(sortedResults), completed, didCancel) - if didComplete { + if completed { rawMeasures.removeAll() } } @@ -119,12 +119,13 @@ class LogProcessor: NSObject, LogProcessorProtocol { DispatchQueue.main.async { self.timer?.invalidate() self.timer = nil + let didCancel = self.shouldCancel self.shouldCancel = false - self.updateResults(true) + self.updateResults(didComplete: true, didCancel: didCancel) } } func timerCallback(_ timer: Timer) { - updateResults(false) + updateResults(didComplete: false, didCancel: false) } } diff --git a/BuildTimeAnalyzer/ProcessingState.swift b/BuildTimeAnalyzer/ProcessingState.swift index 588fa9c..71fbb4e 100644 --- a/BuildTimeAnalyzer/ProcessingState.swift +++ b/BuildTimeAnalyzer/ProcessingState.swift @@ -5,7 +5,7 @@ enum ProcessingState { case processing - case waiting() + case waiting case completed(didSucceed: Bool, stateName: String) static let cancelledString = "Cancelled" diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index e084914..d11bbc9 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -24,7 +24,6 @@ class ViewController: NSViewController { fileprivate var dataSource: [CompileMeasure] = [] fileprivate var filteredData: [CompileMeasure]? - fileprivate var canUpdateViewForState = true private var currentKey: String? private var nextDatabase: XcodeDatabase? @@ -33,7 +32,7 @@ class ViewController: NSViewController { private var perFunctionTimes: [CompileMeasure] = [] private var perFileTimes: [CompileMeasure] = [] - var processingState: ProcessingState = .waiting() { + var processingState: ProcessingState = .waiting { didSet { updateViewForState() } @@ -104,8 +103,6 @@ class ViewController: NSViewController { } func updateViewForState() { - guard canUpdateViewForState else { return } - switch processingState { case .processing: showInstructions(false) @@ -175,7 +172,6 @@ class ViewController: NSViewController { processor.shouldCancel = true cancelButton.isHidden = true - canUpdateViewForState = false } func configureMenuItems(showBuildTimesMenuItem: Bool) { @@ -193,7 +189,6 @@ class ViewController: NSViewController { return } - canUpdateViewForState = true configureMenuItems(showBuildTimesMenuItem: false) processingState = .processing @@ -201,25 +196,31 @@ class ViewController: NSViewController { updateTotalLabel(with: database.buildTime) - processor.processDatabase(database: database) { [weak self] (result, didComplete) in - self?.handleProcessorUpdate(result: result, didComplete: didComplete) + processor.processDatabase(database: database) { [weak self] (result, didComplete, didCancel) in + self?.handleProcessorUpdate(result: result, didComplete: didComplete, didCancel: didCancel) } } - func handleProcessorUpdate(result: [CompileMeasure], didComplete: Bool) { + func handleProcessorUpdate(result: [CompileMeasure], didComplete: Bool, didCancel: Bool) { dataSource = result perFunctionTimes = result perFileTimes = aggregateTimesByFile(perFunctionTimes) tableView.reloadData() if didComplete { - completeProcessorUpdate() + completeProcessorUpdate(didCancel: didCancel) } } - func completeProcessorUpdate() { + func completeProcessorUpdate(didCancel: Bool) { let didSucceed = !dataSource.isEmpty - let stateName = didSucceed ? ProcessingState.completedString : ProcessingState.failedString + + var stateName = ProcessingState.failedString + if didCancel { + stateName = ProcessingState.cancelledString + } else if didSucceed { + stateName = ProcessingState.completedString + } processingState = .completed(didSucceed: didSucceed, stateName: stateName) currentKey = nil From 5c0c4414d8c9efca66cdd45c399be8f5612ff126 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 14:45:29 +0100 Subject: [PATCH 37/48] Option to make the window top most --- BuildTimeAnalyzer.xcodeproj/project.pbxproj | 4 ++ BuildTimeAnalyzer/AppDelegate.swift | 9 ++++ BuildTimeAnalyzer/BuildManager.swift | 5 +-- BuildTimeAnalyzer/DerivedDataManager.swift | 24 +---------- BuildTimeAnalyzer/Main.storyboard | 8 +++- BuildTimeAnalyzer/UserSettings.swift | 46 +++++++++++++++++++++ BuildTimeAnalyzer/ViewController.swift | 13 +++++- 7 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 BuildTimeAnalyzer/UserSettings.swift diff --git a/BuildTimeAnalyzer.xcodeproj/project.pbxproj b/BuildTimeAnalyzer.xcodeproj/project.pbxproj index 8472dea..af7052c 100644 --- a/BuildTimeAnalyzer.xcodeproj/project.pbxproj +++ b/BuildTimeAnalyzer.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 2A9807DD1D7C71F900B9232C /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */; }; 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */; }; 2ABFB6CE1D81F2DE00D060BF /* NSAlert+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */; }; + 2ACBFD0C1D8835E60009567E /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACBFD0B1D8835E60009567E /* UserSettings.swift */; }; 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */; }; 2AF821441D21D6B900D65186 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AF821431D21D6B900D65186 /* AppDelegate.swift */; }; 2AF821461D21D6B900D65186 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2AF821451D21D6B900D65186 /* Assets.xcassets */; }; @@ -56,6 +57,7 @@ 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DirectoryMonitor.swift; sourceTree = ""; }; 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProjectSelection.swift; sourceTree = ""; }; 2ABFB6CD1D81F2DE00D060BF /* NSAlert+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSAlert+Extensions.swift"; sourceTree = ""; }; + 2ACBFD0B1D8835E60009567E /* UserSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserSettings.swift; sourceTree = ""; }; 2AE775111D225D5D00D1A744 /* DerivedDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DerivedDataManager.swift; sourceTree = ""; }; 2AF821401D21D6B900D65186 /* BuildTimeAnalyzer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BuildTimeAnalyzer.app; sourceTree = BUILT_PRODUCTS_DIR; }; 2AF821431D21D6B900D65186 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -155,6 +157,7 @@ 2A9807DC1D7C71F900B9232C /* DirectoryMonitor.swift */, 2A3164C11D21D73F00064045 /* LogProcessor.swift */, 2A9807DE1D7C76FD00B9232C /* ProjectSelection.swift */, + 2ACBFD0B1D8835E60009567E /* UserSettings.swift */, ); name = Utilities; sourceTree = ""; @@ -316,6 +319,7 @@ 2AE775121D225D5D00D1A744 /* DerivedDataManager.swift in Sources */, 2A3698AC1D80A33B002C5CDA /* ViewController.swift in Sources */, 2A3164CC1D21D73F00064045 /* RawMeasure.swift in Sources */, + 2ACBFD0C1D8835E60009567E /* UserSettings.swift in Sources */, 2A3164C81D21D73F00064045 /* CompileMeasure.swift in Sources */, 2A9807DF1D7C76FD00B9232C /* ProjectSelection.swift in Sources */, ); diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index cef7955..ef8f674 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -40,5 +40,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { NSWorkspace.shared().open(url) } } + + @IBAction func toggleAlwaysInFront(_ sender: NSMenuItem) { + let alwaysInFront = sender.state == NSOffState + + sender.state = alwaysInFront ? NSOnState : NSOffState + UserSettings.windowShouldBeTopMost = alwaysInFront + + viewController?.makeWindowTopMost(topMost: alwaysInFront) + } } diff --git a/BuildTimeAnalyzer/BuildManager.swift b/BuildTimeAnalyzer/BuildManager.swift index 8d8f8ee..8b8470f 100644 --- a/BuildTimeAnalyzer/BuildManager.swift +++ b/BuildTimeAnalyzer/BuildManager.swift @@ -2,9 +2,6 @@ // BuildManager.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 12/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Cocoa @@ -33,7 +30,7 @@ class BuildManager: NSObject { func startMonitoring() { stopMonitoring() - derivedDataDirectoryMonitor.startMonitoring(path: DerivedDataManager.derivedDataLocation) + derivedDataDirectoryMonitor.startMonitoring(path: UserSettings.derivedDataLocation) } func stopMonitoring() { diff --git a/BuildTimeAnalyzer/DerivedDataManager.swift b/BuildTimeAnalyzer/DerivedDataManager.swift index d00cd10..c6b6fd1 100644 --- a/BuildTimeAnalyzer/DerivedDataManager.swift +++ b/BuildTimeAnalyzer/DerivedDataManager.swift @@ -7,28 +7,8 @@ import Foundation class DerivedDataManager { - static fileprivate var _derivedDataLocation: String? - static fileprivate let DerivedDataLocationKey = "DerivedDataLocationKey" - - static var derivedDataLocation: String { - get { - if _derivedDataLocation == nil { - _derivedDataLocation = UserDefaults.standard.string(forKey: DerivedDataLocationKey) - } - if _derivedDataLocation == nil, let libraryFolder = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first { - _derivedDataLocation = "\(libraryFolder)/Developer/Xcode/DerivedData" - } - return _derivedDataLocation ?? "" - } - set { - _derivedDataLocation = newValue - UserDefaults.standard.set(newValue, forKey: DerivedDataLocationKey) - UserDefaults.standard.synchronize() - } - } - static func derivedData() -> [File] { - let url = URL(fileURLWithPath: derivedDataLocation) + let url = URL(fileURLWithPath: UserSettings.derivedDataLocation) let folders = DerivedDataManager.listFolders(at: url) let fileManager = FileManager.default @@ -54,7 +34,7 @@ class DerivedDataManager { } static func listCacheFiles() -> [CacheFile] { - let files = cacheFiles(at: URL(fileURLWithPath: derivedDataLocation)) + let files = cacheFiles(at: URL(fileURLWithPath: UserSettings.derivedDataLocation)) let earliestDate = Date().addingTimeInterval(-24 * 60 * 60) return filterFiles(files, byEarliestDate: earliestDate) } diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index a094e7d..4e68832 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -176,6 +176,12 @@ + + + + + + @@ -735,7 +741,7 @@ Gw - + diff --git a/BuildTimeAnalyzer/UserSettings.swift b/BuildTimeAnalyzer/UserSettings.swift new file mode 100644 index 0000000..2229a02 --- /dev/null +++ b/BuildTimeAnalyzer/UserSettings.swift @@ -0,0 +1,46 @@ +// +// UserCache.swift +// BuildTimeAnalyzer +// + +import Foundation + +class UserSettings { + + static private let derivedDataLocationKey = "derivedDataLocationKey" + static private let windowLevelIsNormalKey = "windowLevelIsNormalKey" + + static private var _derivedDataLocation: String? + static private var _windowLevelIsNormal: Bool? + + static var derivedDataLocation: String { + get { + if _derivedDataLocation == nil { + _derivedDataLocation = UserDefaults.standard.string(forKey: derivedDataLocationKey) + } + if _derivedDataLocation == nil, let libraryFolder = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first { + _derivedDataLocation = "\(libraryFolder)/Developer/Xcode/DerivedData" + } + return _derivedDataLocation ?? "" + } + set { + _derivedDataLocation = newValue + UserDefaults.standard.set(newValue, forKey: derivedDataLocationKey) + UserDefaults.standard.synchronize() + } + } + + static var windowShouldBeTopMost: Bool { + get { + if _windowLevelIsNormal == nil { + _windowLevelIsNormal = UserDefaults.standard.bool(forKey: windowLevelIsNormalKey) + } + return !(_windowLevelIsNormal ?? true) + } + set { + _windowLevelIsNormal = !newValue + UserDefaults.standard.set(newValue, forKey: windowLevelIsNormalKey) + UserDefaults.standard.synchronize() + } + } +} diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index d11bbc9..25616c5 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -61,10 +61,12 @@ class ViewController: NSViewController { // MARK: Layout func configureLayout() { - derivedDataTextField.stringValue = DerivedDataManager.derivedDataLocation updateTotalLabel(with: 0) updateViewForState() showInstructions(true) + + derivedDataTextField.stringValue = UserSettings.derivedDataLocation + makeWindowTopMost(topMost: UserSettings.windowShouldBeTopMost) } func showInstructions(_ show: Bool) { @@ -129,6 +131,13 @@ class ViewController: NSViewController { } } + func makeWindowTopMost(topMost: Bool) { + if let window = NSApplication.shared().windows.first { + let level: CGWindowLevelKey = topMost ? .floatingWindow : .normalWindow + window.level = Int(CGWindowLevelForKey(level)) + } + } + // MARK: Actions @IBAction func perFileCheckboxClicked(_ sender: NSButton) { @@ -158,7 +167,7 @@ class ViewController: NSViewController { tableView.reloadData() } else if let field = obj.object as? NSTextField, field == derivedDataTextField { buildManager.stopMonitoring() - DerivedDataManager.derivedDataLocation = field.stringValue + UserSettings.derivedDataLocation = field.stringValue projectSelection.listFolders() buildManager.startMonitoring() From dd17749a7a37c86e5b621ad10f6401ec27aeb4cd Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 14:49:41 +0100 Subject: [PATCH 38/48] removed copyright notice --- BuildTimeAnalyzer/File.swift | 3 --- BuildTimeAnalyzer/XcodeDatabase.swift | 3 --- BuildTimeAnalyzerTests/CompileMeasureTests.swift | 3 --- 3 files changed, 9 deletions(-) diff --git a/BuildTimeAnalyzer/File.swift b/BuildTimeAnalyzer/File.swift index a3c749a..9b494ba 100644 --- a/BuildTimeAnalyzer/File.swift +++ b/BuildTimeAnalyzer/File.swift @@ -2,9 +2,6 @@ // File.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 12/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzer/XcodeDatabase.swift b/BuildTimeAnalyzer/XcodeDatabase.swift index f8ab89d..4e83a11 100644 --- a/BuildTimeAnalyzer/XcodeDatabase.swift +++ b/BuildTimeAnalyzer/XcodeDatabase.swift @@ -2,9 +2,6 @@ // XcodeDatabase.swift // BuildTimeAnalyzer // -// Created by Robert Gummesson on 12/09/2016. -// Copyright © 2016 Cane Media Ltd. All rights reserved. -// import Foundation diff --git a/BuildTimeAnalyzerTests/CompileMeasureTests.swift b/BuildTimeAnalyzerTests/CompileMeasureTests.swift index 44bb3d7..77d5700 100644 --- a/BuildTimeAnalyzerTests/CompileMeasureTests.swift +++ b/BuildTimeAnalyzerTests/CompileMeasureTests.swift @@ -2,9 +2,6 @@ // CompileMeasureTests.swift // CMBuildTimeAnalyzerTests // -// Created by Robert Gummesson on 02/05/2016. -// Copyright © 2016 Robert Gummesson. All rights reserved. -// import XCTest From a74a62e14cf9a935495f260f4fd57ecda22f553b Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 15:09:33 +0100 Subject: [PATCH 39/48] Corrections to the always on top mode --- BuildTimeAnalyzer/AppDelegate.swift | 5 +++++ BuildTimeAnalyzer/Main.storyboard | 1 + BuildTimeAnalyzer/UserSettings.swift | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/AppDelegate.swift b/BuildTimeAnalyzer/AppDelegate.swift index ef8f674..8970713 100644 --- a/BuildTimeAnalyzer/AppDelegate.swift +++ b/BuildTimeAnalyzer/AppDelegate.swift @@ -10,6 +10,11 @@ class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var projectSelectionMenuItem: NSMenuItem! @IBOutlet weak var buildTimesMenuItem: NSMenuItem! + @IBOutlet weak var alwaysInFrontMenuItem: NSMenuItem! + + func applicationDidFinishLaunching(_ notification: Notification) { + alwaysInFrontMenuItem.state = UserSettings.windowShouldBeTopMost ? NSOnState : NSOffState + } var viewController: ViewController? { return NSApplication.shared().mainWindow?.contentViewController as? ViewController diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index 4e68832..b8057a5 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -193,6 +193,7 @@ + diff --git a/BuildTimeAnalyzer/UserSettings.swift b/BuildTimeAnalyzer/UserSettings.swift index 2229a02..5f0a4f4 100644 --- a/BuildTimeAnalyzer/UserSettings.swift +++ b/BuildTimeAnalyzer/UserSettings.swift @@ -39,7 +39,7 @@ class UserSettings { } set { _windowLevelIsNormal = !newValue - UserDefaults.standard.set(newValue, forKey: windowLevelIsNormalKey) + UserDefaults.standard.set(_windowLevelIsNormal, forKey: windowLevelIsNormalKey) UserDefaults.standard.synchronize() } } From a8c950e52efdacba5c5a86a3966facac36e409bb Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 16:12:07 +0100 Subject: [PATCH 40/48] Don't kill the app when minimizing --- BuildTimeAnalyzer/ViewController.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index 25616c5..d343db0 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -49,10 +49,12 @@ class ViewController: NSViewController { projectSelection.delegate = self projectSelection.listFolders() + + NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose), name: .NSWindowWillClose, object: nil) } - override func viewDidDisappear() { - super.viewDidDisappear() + func windowWillClose() { + NotificationCenter.default.removeObserver(self) processor.shouldCancel = true NSApp.terminate(self) From 49db57a0b2bb16fc48c04538404ba3242ab2eb87 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 16:58:03 +0100 Subject: [PATCH 41/48] Use the term build duration --- BuildTimeAnalyzer/Main.storyboard | 2 +- BuildTimeAnalyzer/ViewController.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index b8057a5..9a7add7 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -210,7 +210,7 @@ - + diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index d343db0..0354ea6 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -252,12 +252,12 @@ class ViewController: NSViewController { func updateTotalLabel(with buildTime: Int) { if buildTime < 60 { - compileTimeTextField.stringValue = "Build Time: \(buildTime)s" + compileTimeTextField.stringValue = "Build duration: \(buildTime)s" } else { let minutes = buildTime / 60 let seconds = String(format: "%02d", buildTime % 60) - compileTimeTextField.stringValue = "Build Time: \(minutes)m \(seconds)s" + compileTimeTextField.stringValue = "Build duration: \(minutes)m \(seconds)s" } } From 1d835cf33a677133e2dbb88775d267aa7a91ffdc Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 19:40:08 +0100 Subject: [PATCH 42/48] Smaller tweaks --- BuildTimeAnalyzer/Main.storyboard | 4 ++-- BuildTimeAnalyzer/ViewController.swift | 24 +++++------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index 9a7add7..c84dc72 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -528,8 +528,8 @@ Gw - - + + diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index 0354ea6..6c6b9bb 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -47,7 +47,6 @@ class ViewController: NSViewController { buildManager.delegate = self projectSelection.delegate = self - projectSelection.listFolders() NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose), name: .NSWindowWillClose, object: nil) @@ -74,13 +73,8 @@ class ViewController: NSViewController { func showInstructions(_ show: Bool) { instructionsView.isHidden = !show - compileTimeTextField.isHidden = show - leftButton.isHidden = show - perFileButton.isHidden = show - searchField.isHidden = show - statusLabel.isHidden = show - statusTextField.isHidden = show - tableViewContainerView.isHidden = show + let views: [NSView] = [compileTimeTextField, leftButton, perFileButton, searchField, statusLabel, statusTextField, tableViewContainerView] + views.forEach{ $0.isHidden = show } if show && processingState == .processing { processor.shouldCancel = true @@ -90,11 +84,10 @@ class ViewController: NSViewController { } func aggregateTimesByFile(_ functionTimes: [CompileMeasure]) -> [CompileMeasure] { - var fileTimes = [String: CompileMeasure]() + var fileTimes: [String: CompileMeasure] = [:] for measure in functionTimes { if var fileMeasure = fileTimes[measure.path] { - // File exists, increment time fileMeasure.time += measure.time fileTimes[measure.path] = fileMeasure } else { @@ -102,7 +95,6 @@ class ViewController: NSViewController { fileTimes[measure.path] = newFileMeasure } } - // Sort by time return Array(fileTimes.values).sorted{ $0.time > $1.time } } @@ -251,14 +243,8 @@ class ViewController: NSViewController { } func updateTotalLabel(with buildTime: Int) { - if buildTime < 60 { - compileTimeTextField.stringValue = "Build duration: \(buildTime)s" - } else { - let minutes = buildTime / 60 - let seconds = String(format: "%02d", buildTime % 60) - - compileTimeTextField.stringValue = "Build duration: \(minutes)m \(seconds)s" - } + let text = "Build duration: " + (buildTime < 60 ? "\(buildTime)s" : "\(buildTime / 60)m \(buildTime % 60)s") + compileTimeTextField.stringValue = text } func textContains(_ text: String) -> Bool { From 2482484a5d6bf694eb623f322e6ee6bab9efa6c8 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Tue, 13 Sep 2016 21:24:26 +0100 Subject: [PATCH 43/48] Updated the readme --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3fd0f8b..860ccb7 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,19 @@ Build Time Analyzer for Xcode ## Overview -Build Time Analyzer is an Xcode plugin that shows you a break down of Swift build times. See [this post]( https://medium.com/p/fc92cdd91e31) and [this post](https://medium.com/p/37b0a7514cbe) on Medium for context. +Build Time Analyzer is an OSX app that shows you a break down of Swift build times. See [this post]( https://medium.com/p/fc92cdd91e31) and [this post](https://medium.com/p/37b0a7514cbe) on Medium for context. Since Xcode 8 came out, the analyzer is a standalone app rather than an Xcode plug-in. ## Usage -Open the analyzer window by tapping `Shift+Ctrl+B` or `View` > `Build Time Analyzer`. From there just follow the instructions. +Open up the app and follow the instructions. ![screenshot.png](https://raw.githubusercontent.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode/master/Screenshots/screenshot2.png) ## Installation -**NOTE: With Xcode 8 and above, plug-ins are no longer supported. An [idea now](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode/issues/38) is to work around this problem by making it a standalone app so stay tuned.** +Download the code and open it in Xcode, archive the project and export the build. Easy, right? -Build Time Analyzer is available through [Alcatraz - The package manager for Xcode](http://alcatraz.io/). Make sure you restart Xcode after the plug-in is installed. - -If you rather compile it yourself, simply build the Xcode project and restart Xcode. The plugin will automatically be installed in `~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`. To uninstall, just remove the plugin from there (and restart Xcode). +If you are on Xcode 7, instead download the Xcode plug-in [from here](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode/releases/tag/v0.0.0-Plugin-for-Xcode7). ## Contributions From 379ade9e30a8cb4c14ff757e16e5e510c7ea1f68 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 14 Sep 2016 09:22:57 +0100 Subject: [PATCH 44/48] updated the screenshot --- README.md | 2 +- Screenshots/screenshot.png | Bin 34042 -> 62569 bytes Screenshots/screenshot2.png | Bin 29953 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 Screenshots/screenshot2.png diff --git a/README.md b/README.md index 860ccb7..258df63 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Build Time Analyzer is an OSX app that shows you a break down of Swift build tim Open up the app and follow the instructions. -![screenshot.png](https://raw.githubusercontent.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode/master/Screenshots/screenshot2.png) +![screenshot.png](https://raw.githubusercontent.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode/master/Screenshots/screenshot.png) ## Installation diff --git a/Screenshots/screenshot.png b/Screenshots/screenshot.png index 10b244167c5482ce934345c770b28154eb2f0202..79f4053785259aed18385a914baa863cc33ad6e4 100644 GIT binary patch literal 62569 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 HT88}}*Y&&| delta 33623 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 pqR& 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 Date: Wed, 14 Sep 2016 11:12:11 +0100 Subject: [PATCH 45/48] Changed version number --- BuildTimeAnalyzer/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/Info.plist b/BuildTimeAnalyzer/Info.plist index e060d65..7e46668 100644 --- a/BuildTimeAnalyzer/Info.plist +++ b/BuildTimeAnalyzer/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.9 + 1.0.0 CFBundleSignature ???? CFBundleVersion From 964f8aad2c16cded55c6a1a9e6b46c77a56d148f Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 14 Sep 2016 11:51:00 +0100 Subject: [PATCH 46/48] Avoid terminating when closing the About window --- BuildTimeAnalyzer/ViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BuildTimeAnalyzer/ViewController.swift b/BuildTimeAnalyzer/ViewController.swift index 6c6b9bb..b8d8f2d 100644 --- a/BuildTimeAnalyzer/ViewController.swift +++ b/BuildTimeAnalyzer/ViewController.swift @@ -49,10 +49,11 @@ class ViewController: NSViewController { projectSelection.delegate = self projectSelection.listFolders() - NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose), name: .NSWindowWillClose, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose(notification:)), name: .NSWindowWillClose, object: nil) } - func windowWillClose() { + func windowWillClose(notification: NSNotification) { + guard let object = notification.object, !(object is NSPanel) else { return } NotificationCenter.default.removeObserver(self) processor.shouldCancel = true From 023d6785160d52e92b712ddd88517358c3ec6214 Mon Sep 17 00:00:00 2001 From: Robert Gummesson Date: Wed, 14 Sep 2016 15:10:30 +0100 Subject: [PATCH 47/48] Fix for the search --- BuildTimeAnalyzer/Main.storyboard | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BuildTimeAnalyzer/Main.storyboard b/BuildTimeAnalyzer/Main.storyboard index c84dc72..54717f3 100644 --- a/BuildTimeAnalyzer/Main.storyboard +++ b/BuildTimeAnalyzer/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -278,6 +278,9 @@ Gw + + +