├── .gitignore ├── .gitmodules ├── .travis.yml ├── Cartfile ├── Cartfile.resolved ├── CartfileDiff.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ ├── CartfileDiffKit.xcscheme │ └── cartfilediff.xcscheme ├── CartfileDiff.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── CartfileDiff.xcscmblueprint ├── LICENSE.md ├── Makefile ├── README.md ├── Sources ├── CartfileDiffKit │ ├── CartfileDiffKit.h │ └── Info.plist ├── Components.plist ├── Info.plist └── main.swift └── script └── extract-tool /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Carthage/Checkouts/Argo"] 2 | path = Carthage/Checkouts/Argo 3 | url = https://github.com/thoughtbot/Argo.git 4 | [submodule "Carthage/Checkouts/Curry"] 5 | path = Carthage/Checkouts/Curry 6 | url = https://github.com/thoughtbot/Curry.git 7 | [submodule "Carthage/Checkouts/PrettyColors"] 8 | path = Carthage/Checkouts/PrettyColors 9 | url = https://github.com/jdhealy/PrettyColors.git 10 | [submodule "Carthage/Checkouts/Result"] 11 | path = Carthage/Checkouts/Result 12 | url = https://github.com/antitypical/Result.git 13 | [submodule "Carthage/Checkouts/Commandant"] 14 | path = Carthage/Checkouts/Commandant 15 | url = https://github.com/Carthage/Commandant.git 16 | [submodule "Carthage/Checkouts/ReactiveCocoa"] 17 | path = Carthage/Checkouts/ReactiveCocoa 18 | url = https://github.com/ReactiveCocoa/ReactiveCocoa.git 19 | [submodule "Carthage/Checkouts/ReactiveTask"] 20 | path = Carthage/Checkouts/ReactiveTask 21 | url = https://github.com/Carthage/ReactiveTask.git 22 | [submodule "Carthage/Checkouts/Tentacle"] 23 | path = Carthage/Checkouts/Tentacle 24 | url = https://github.com/mdiep/Tentacle.git 25 | [submodule "Carthage/Checkouts/Carthage"] 26 | path = Carthage/Checkouts/Carthage 27 | url = https://github.com/Carthage/Carthage.git 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode7.3 3 | install: true 4 | git: 5 | submodules: false 6 | script: make package 7 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "Carthage/Carthage" ~> 0.17.2 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "thoughtbot/Argo" "v3.1.0" 2 | github "thoughtbot/Curry" "v2.3.3" 3 | github "jdhealy/PrettyColors" "v3.0.2" 4 | github "antitypical/Result" "2.1.3" 5 | github "Carthage/Commandant" "0.10.1" 6 | github "ReactiveCocoa/ReactiveCocoa" "v4.2.2" 7 | github "Carthage/ReactiveTask" "0.10.3" 8 | github "mdiep/Tentacle" "0.3" 9 | github "Carthage/Carthage" "0.17.2" 10 | -------------------------------------------------------------------------------- /CartfileDiff.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BF328F121D59C99A002AF2A7 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF328F111D59C99A002AF2A7 /* main.swift */; }; 11 | BF81A7F91D5A4665001EFFEE /* CarthageKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF81A7F81D5A4665001EFFEE /* CarthageKit.framework */; }; 12 | BF81A8011D5B2F90001EFFEE /* CartfileDiffKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF81A7EA1D5A4608001EFFEE /* CartfileDiffKit.framework */; }; 13 | BF81A8021D5B2F90001EFFEE /* CartfileDiffKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BF81A7EA1D5A4608001EFFEE /* CartfileDiffKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | BF81A8061D5B35B6001EFFEE /* CarthageKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BF81A7F81D5A4665001EFFEE /* CarthageKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | BF81A80A1D5B45F1001EFFEE /* CartfileDiffKit.h in Headers */ = {isa = PBXBuildFile; fileRef = BF81A8081D5B45EB001EFFEE /* CartfileDiffKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXContainerItemProxy section */ 19 | BF81A7FC1D5A4857001EFFEE /* PBXContainerItemProxy */ = { 20 | isa = PBXContainerItemProxy; 21 | containerPortal = BF328EBA1D54CEE2002AF2A7 /* Project object */; 22 | proxyType = 1; 23 | remoteGlobalIDString = BF81A7E91D5A4608001EFFEE; 24 | remoteInfo = CartfileDiffKit; 25 | }; 26 | /* End PBXContainerItemProxy section */ 27 | 28 | /* Begin PBXCopyFilesBuildPhase section */ 29 | BF81A8031D5B2F90001EFFEE /* Embed Frameworks */ = { 30 | isa = PBXCopyFilesBuildPhase; 31 | buildActionMask = 2147483647; 32 | dstPath = ""; 33 | dstSubfolderSpec = 10; 34 | files = ( 35 | BF81A8021D5B2F90001EFFEE /* CartfileDiffKit.framework in Embed Frameworks */, 36 | ); 37 | name = "Embed Frameworks"; 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | BF81A8041D5B3031001EFFEE /* CopyFiles */ = { 41 | isa = PBXCopyFilesBuildPhase; 42 | buildActionMask = 2147483647; 43 | dstPath = ""; 44 | dstSubfolderSpec = 10; 45 | files = ( 46 | BF81A8061D5B35B6001EFFEE /* CarthageKit.framework in CopyFiles */, 47 | ); 48 | runOnlyForDeploymentPostprocessing = 0; 49 | }; 50 | /* End PBXCopyFilesBuildPhase section */ 51 | 52 | /* Begin PBXFileReference section */ 53 | BF328EDE1D54DB11002AF2A7 /* cartfilediff.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cartfilediff.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | BF328F111D59C99A002AF2A7 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = Sources/main.swift; sourceTree = SOURCE_ROOT; }; 55 | BF328F131D59C9A7002AF2A7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Sources/Info.plist; sourceTree = SOURCE_ROOT; }; 56 | BF81A7EA1D5A4608001EFFEE /* CartfileDiffKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CartfileDiffKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | BF81A7F81D5A4665001EFFEE /* CarthageKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CarthageKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | BF81A8081D5B45EB001EFFEE /* CartfileDiffKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CartfileDiffKit.h; sourceTree = ""; }; 59 | BF81A8091D5B45EB001EFFEE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | BF328EDB1D54DB11002AF2A7 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | BF81A8011D5B2F90001EFFEE /* CartfileDiffKit.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | BF81A7E61D5A4608001EFFEE /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | BF81A7F91D5A4665001EFFEE /* CarthageKit.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | /* End PBXFrameworksBuildPhase section */ 80 | 81 | /* Begin PBXGroup section */ 82 | BF328EB91D54CEE2002AF2A7 = { 83 | isa = PBXGroup; 84 | children = ( 85 | BF81A7F81D5A4665001EFFEE /* CarthageKit.framework */, 86 | BF328EDF1D54DB11002AF2A7 /* cartfilediff */, 87 | BF81A8071D5B45EB001EFFEE /* CartfileDiffKit */, 88 | BF328EC31D54CEE2002AF2A7 /* Products */, 89 | ); 90 | sourceTree = ""; 91 | }; 92 | BF328EC31D54CEE2002AF2A7 /* Products */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | BF328EDE1D54DB11002AF2A7 /* cartfilediff.app */, 96 | BF81A7EA1D5A4608001EFFEE /* CartfileDiffKit.framework */, 97 | ); 98 | name = Products; 99 | sourceTree = ""; 100 | }; 101 | BF328EDF1D54DB11002AF2A7 /* cartfilediff */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | BF328F111D59C99A002AF2A7 /* main.swift */, 105 | BF328F131D59C9A7002AF2A7 /* Info.plist */, 106 | ); 107 | path = cartfilediff; 108 | sourceTree = ""; 109 | }; 110 | BF81A8071D5B45EB001EFFEE /* CartfileDiffKit */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | BF81A8081D5B45EB001EFFEE /* CartfileDiffKit.h */, 114 | BF81A8091D5B45EB001EFFEE /* Info.plist */, 115 | ); 116 | name = CartfileDiffKit; 117 | path = Sources/CartfileDiffKit; 118 | sourceTree = ""; 119 | }; 120 | /* End PBXGroup section */ 121 | 122 | /* Begin PBXHeadersBuildPhase section */ 123 | BF81A7E71D5A4608001EFFEE /* Headers */ = { 124 | isa = PBXHeadersBuildPhase; 125 | buildActionMask = 2147483647; 126 | files = ( 127 | BF81A80A1D5B45F1001EFFEE /* CartfileDiffKit.h in Headers */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXHeadersBuildPhase section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | BF328EDD1D54DB11002AF2A7 /* cartfilediff */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = BF328EE81D54DB11002AF2A7 /* Build configuration list for PBXNativeTarget "cartfilediff" */; 137 | buildPhases = ( 138 | BF328EDA1D54DB11002AF2A7 /* Sources */, 139 | BF328EDB1D54DB11002AF2A7 /* Frameworks */, 140 | BF328EDC1D54DB11002AF2A7 /* Resources */, 141 | BF328F0F1D58E244002AF2A7 /* Extract CLI Tool */, 142 | BF81A8031D5B2F90001EFFEE /* Embed Frameworks */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | BF81A7FD1D5A4857001EFFEE /* PBXTargetDependency */, 148 | ); 149 | name = cartfilediff; 150 | productName = cartfilediff; 151 | productReference = BF328EDE1D54DB11002AF2A7 /* cartfilediff.app */; 152 | productType = "com.apple.product-type.application"; 153 | }; 154 | BF81A7E91D5A4608001EFFEE /* CartfileDiffKit */ = { 155 | isa = PBXNativeTarget; 156 | buildConfigurationList = BF81A7F31D5A4608001EFFEE /* Build configuration list for PBXNativeTarget "CartfileDiffKit" */; 157 | buildPhases = ( 158 | BF81A7E51D5A4608001EFFEE /* Sources */, 159 | BF81A7E61D5A4608001EFFEE /* Frameworks */, 160 | BF81A7E71D5A4608001EFFEE /* Headers */, 161 | BF81A7E81D5A4608001EFFEE /* Resources */, 162 | BF81A8041D5B3031001EFFEE /* CopyFiles */, 163 | ); 164 | buildRules = ( 165 | ); 166 | dependencies = ( 167 | ); 168 | name = CartfileDiffKit; 169 | productName = CartfileDiff; 170 | productReference = BF81A7EA1D5A4608001EFFEE /* CartfileDiffKit.framework */; 171 | productType = "com.apple.product-type.framework"; 172 | }; 173 | /* End PBXNativeTarget section */ 174 | 175 | /* Begin PBXProject section */ 176 | BF328EBA1D54CEE2002AF2A7 /* Project object */ = { 177 | isa = PBXProject; 178 | attributes = { 179 | LastSwiftUpdateCheck = 0730; 180 | LastUpgradeCheck = 0730; 181 | ORGANIZATIONNAME = "Leanworks Ltd."; 182 | TargetAttributes = { 183 | BF328EDD1D54DB11002AF2A7 = { 184 | CreatedOnToolsVersion = 7.3.1; 185 | }; 186 | BF81A7E91D5A4608001EFFEE = { 187 | CreatedOnToolsVersion = 7.3.1; 188 | }; 189 | }; 190 | }; 191 | buildConfigurationList = BF328EBD1D54CEE2002AF2A7 /* Build configuration list for PBXProject "CartfileDiff" */; 192 | compatibilityVersion = "Xcode 3.2"; 193 | developmentRegion = English; 194 | hasScannedForEncodings = 0; 195 | knownRegions = ( 196 | en, 197 | Base, 198 | ); 199 | mainGroup = BF328EB91D54CEE2002AF2A7; 200 | productRefGroup = BF328EC31D54CEE2002AF2A7 /* Products */; 201 | projectDirPath = ""; 202 | projectRoot = ""; 203 | targets = ( 204 | BF328EDD1D54DB11002AF2A7 /* cartfilediff */, 205 | BF81A7E91D5A4608001EFFEE /* CartfileDiffKit */, 206 | ); 207 | }; 208 | /* End PBXProject section */ 209 | 210 | /* Begin PBXResourcesBuildPhase section */ 211 | BF328EDC1D54DB11002AF2A7 /* Resources */ = { 212 | isa = PBXResourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | BF81A7E81D5A4608001EFFEE /* Resources */ = { 219 | isa = PBXResourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | /* End PBXResourcesBuildPhase section */ 226 | 227 | /* Begin PBXShellScriptBuildPhase section */ 228 | BF328F0F1D58E244002AF2A7 /* Extract CLI Tool */ = { 229 | isa = PBXShellScriptBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | ); 233 | inputPaths = ( 234 | "$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)", 235 | ); 236 | name = "Extract CLI Tool"; 237 | outputPaths = ( 238 | "$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_NAME)", 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | shellPath = /bin/sh; 242 | shellScript = ". script/extract-tool"; 243 | }; 244 | /* End PBXShellScriptBuildPhase section */ 245 | 246 | /* Begin PBXSourcesBuildPhase section */ 247 | BF328EDA1D54DB11002AF2A7 /* Sources */ = { 248 | isa = PBXSourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | BF328F121D59C99A002AF2A7 /* main.swift in Sources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | BF81A7E51D5A4608001EFFEE /* Sources */ = { 256 | isa = PBXSourcesBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | }; 262 | /* End PBXSourcesBuildPhase section */ 263 | 264 | /* Begin PBXTargetDependency section */ 265 | BF81A7FD1D5A4857001EFFEE /* PBXTargetDependency */ = { 266 | isa = PBXTargetDependency; 267 | target = BF81A7E91D5A4608001EFFEE /* CartfileDiffKit */; 268 | targetProxy = BF81A7FC1D5A4857001EFFEE /* PBXContainerItemProxy */; 269 | }; 270 | /* End PBXTargetDependency section */ 271 | 272 | /* Begin XCBuildConfiguration section */ 273 | BF328EC71D54CEE2002AF2A7 /* Debug */ = { 274 | isa = XCBuildConfiguration; 275 | buildSettings = { 276 | ALWAYS_SEARCH_USER_PATHS = NO; 277 | CLANG_ANALYZER_NONNULL = YES; 278 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 279 | CLANG_CXX_LIBRARY = "libc++"; 280 | CLANG_ENABLE_MODULES = YES; 281 | CLANG_ENABLE_OBJC_ARC = YES; 282 | CLANG_WARN_BOOL_CONVERSION = YES; 283 | CLANG_WARN_CONSTANT_CONVERSION = YES; 284 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 285 | CLANG_WARN_EMPTY_BODY = YES; 286 | CLANG_WARN_ENUM_CONVERSION = YES; 287 | CLANG_WARN_INT_CONVERSION = YES; 288 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 289 | CLANG_WARN_UNREACHABLE_CODE = YES; 290 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 291 | CODE_SIGN_IDENTITY = ""; 292 | COPY_PHASE_STRIP = NO; 293 | DEBUG_INFORMATION_FORMAT = dwarf; 294 | ENABLE_STRICT_OBJC_MSGSEND = YES; 295 | ENABLE_TESTABILITY = YES; 296 | GCC_C_LANGUAGE_STANDARD = gnu99; 297 | GCC_DYNAMIC_NO_PIC = NO; 298 | GCC_NO_COMMON_BLOCKS = YES; 299 | GCC_OPTIMIZATION_LEVEL = 0; 300 | GCC_PREPROCESSOR_DEFINITIONS = ( 301 | "DEBUG=1", 302 | "$(inherited)", 303 | ); 304 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 305 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 306 | GCC_WARN_UNDECLARED_SELECTOR = YES; 307 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 308 | GCC_WARN_UNUSED_FUNCTION = YES; 309 | GCC_WARN_UNUSED_VARIABLE = YES; 310 | MACOSX_DEPLOYMENT_TARGET = 10.10; 311 | MTL_ENABLE_DEBUG_INFO = YES; 312 | ONLY_ACTIVE_ARCH = YES; 313 | SDKROOT = macosx; 314 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 315 | }; 316 | name = Debug; 317 | }; 318 | BF328EC81D54CEE2002AF2A7 /* Release */ = { 319 | isa = XCBuildConfiguration; 320 | buildSettings = { 321 | ALWAYS_SEARCH_USER_PATHS = NO; 322 | CLANG_ANALYZER_NONNULL = YES; 323 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 324 | CLANG_CXX_LIBRARY = "libc++"; 325 | CLANG_ENABLE_MODULES = YES; 326 | CLANG_ENABLE_OBJC_ARC = YES; 327 | CLANG_WARN_BOOL_CONVERSION = YES; 328 | CLANG_WARN_CONSTANT_CONVERSION = YES; 329 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 330 | CLANG_WARN_EMPTY_BODY = YES; 331 | CLANG_WARN_ENUM_CONVERSION = YES; 332 | CLANG_WARN_INT_CONVERSION = YES; 333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 334 | CLANG_WARN_UNREACHABLE_CODE = YES; 335 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 336 | CODE_SIGN_IDENTITY = ""; 337 | COPY_PHASE_STRIP = NO; 338 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 339 | ENABLE_NS_ASSERTIONS = NO; 340 | ENABLE_STRICT_OBJC_MSGSEND = YES; 341 | GCC_C_LANGUAGE_STANDARD = gnu99; 342 | GCC_NO_COMMON_BLOCKS = YES; 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | MACOSX_DEPLOYMENT_TARGET = 10.10; 350 | MTL_ENABLE_DEBUG_INFO = NO; 351 | SDKROOT = macosx; 352 | }; 353 | name = Release; 354 | }; 355 | BF328EE91D54DB11002AF2A7 /* Debug */ = { 356 | isa = XCBuildConfiguration; 357 | buildSettings = { 358 | CODE_SIGN_IDENTITY = ""; 359 | COMBINE_HIDPI_IMAGES = YES; 360 | INFOPLIST_FILE = Sources/Info.plist; 361 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/. @executable_path/../Frameworks /Library/Frameworks /Library/Frameworks/CartfileDiff.framework/Versions/Current/Frameworks $(inherited)"; 362 | PRODUCT_BUNDLE_IDENTIFIER = com.yplanapp.cartfilediff; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | }; 365 | name = Debug; 366 | }; 367 | BF328EEA1D54DB11002AF2A7 /* Release */ = { 368 | isa = XCBuildConfiguration; 369 | buildSettings = { 370 | CODE_SIGN_IDENTITY = ""; 371 | COMBINE_HIDPI_IMAGES = YES; 372 | INFOPLIST_FILE = Sources/Info.plist; 373 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/. @executable_path/../Frameworks /Library/Frameworks /Library/Frameworks/CartfileDiff.framework/Versions/Current/Frameworks $(inherited)"; 374 | PRODUCT_BUNDLE_IDENTIFIER = com.yplanapp.cartfilediff; 375 | PRODUCT_NAME = "$(TARGET_NAME)"; 376 | }; 377 | name = Release; 378 | }; 379 | BF81A7F41D5A4608001EFFEE /* Debug */ = { 380 | isa = XCBuildConfiguration; 381 | buildSettings = { 382 | CODE_SIGN_IDENTITY = ""; 383 | COMBINE_HIDPI_IMAGES = YES; 384 | CURRENT_PROJECT_VERSION = 1; 385 | DEFINES_MODULE = YES; 386 | DYLIB_COMPATIBILITY_VERSION = 1; 387 | DYLIB_CURRENT_VERSION = 1; 388 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 389 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 390 | FRAMEWORK_VERSION = A; 391 | INFOPLIST_FILE = Sources/CartfileDiffKit/Info.plist; 392 | INSTALL_PATH = "@rpath"; 393 | PRODUCT_BUNDLE_IDENTIFIER = com.yplanapp.CartfileDiff; 394 | PRODUCT_NAME = "$(TARGET_NAME)"; 395 | SKIP_INSTALL = YES; 396 | VERSIONING_SYSTEM = "apple-generic"; 397 | VERSION_INFO_PREFIX = ""; 398 | }; 399 | name = Debug; 400 | }; 401 | BF81A7F51D5A4608001EFFEE /* Release */ = { 402 | isa = XCBuildConfiguration; 403 | buildSettings = { 404 | CODE_SIGN_IDENTITY = ""; 405 | COMBINE_HIDPI_IMAGES = YES; 406 | CURRENT_PROJECT_VERSION = 1; 407 | DEFINES_MODULE = YES; 408 | DYLIB_COMPATIBILITY_VERSION = 1; 409 | DYLIB_CURRENT_VERSION = 1; 410 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 411 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 412 | FRAMEWORK_VERSION = A; 413 | INFOPLIST_FILE = Sources/CartfileDiffKit/Info.plist; 414 | INSTALL_PATH = "@rpath"; 415 | PRODUCT_BUNDLE_IDENTIFIER = com.yplanapp.CartfileDiff; 416 | PRODUCT_NAME = "$(TARGET_NAME)"; 417 | SKIP_INSTALL = YES; 418 | VERSIONING_SYSTEM = "apple-generic"; 419 | VERSION_INFO_PREFIX = ""; 420 | }; 421 | name = Release; 422 | }; 423 | /* End XCBuildConfiguration section */ 424 | 425 | /* Begin XCConfigurationList section */ 426 | BF328EBD1D54CEE2002AF2A7 /* Build configuration list for PBXProject "CartfileDiff" */ = { 427 | isa = XCConfigurationList; 428 | buildConfigurations = ( 429 | BF328EC71D54CEE2002AF2A7 /* Debug */, 430 | BF328EC81D54CEE2002AF2A7 /* Release */, 431 | ); 432 | defaultConfigurationIsVisible = 0; 433 | defaultConfigurationName = Release; 434 | }; 435 | BF328EE81D54DB11002AF2A7 /* Build configuration list for PBXNativeTarget "cartfilediff" */ = { 436 | isa = XCConfigurationList; 437 | buildConfigurations = ( 438 | BF328EE91D54DB11002AF2A7 /* Debug */, 439 | BF328EEA1D54DB11002AF2A7 /* Release */, 440 | ); 441 | defaultConfigurationIsVisible = 0; 442 | defaultConfigurationName = Release; 443 | }; 444 | BF81A7F31D5A4608001EFFEE /* Build configuration list for PBXNativeTarget "CartfileDiffKit" */ = { 445 | isa = XCConfigurationList; 446 | buildConfigurations = ( 447 | BF81A7F41D5A4608001EFFEE /* Debug */, 448 | BF81A7F51D5A4608001EFFEE /* Release */, 449 | ); 450 | defaultConfigurationIsVisible = 0; 451 | }; 452 | /* End XCConfigurationList section */ 453 | }; 454 | rootObject = BF328EBA1D54CEE2002AF2A7 /* Project object */; 455 | } 456 | -------------------------------------------------------------------------------- /CartfileDiff.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CartfileDiff.xcodeproj/xcshareddata/xcschemes/CartfileDiffKit.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /CartfileDiff.xcodeproj/xcshareddata/xcschemes/cartfilediff.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 74 | 80 | 81 | 82 | 83 | 85 | 86 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /CartfileDiff.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 21 | 22 | 24 | 25 | 27 | 28 | 30 | 31 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /CartfileDiff.xcworkspace/xcshareddata/CartfileDiff.xcscmblueprint: -------------------------------------------------------------------------------- 1 | { 2 | "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "4E1C83624AA2310289268788AA09D3B34615CC5F", 3 | "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { 4 | 5 | }, 6 | "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { 7 | "9E0BC608EAE3637620FA818A6049BADAD4B54494" : 0, 8 | "4E1C83624AA2310289268788AA09D3B34615CC5F" : 0, 9 | "D23C0CEAADB77074FDA4459000068A7940EB7AD0" : 0, 10 | "E084C86B03F81D63323C9E7510697EA528A758C7" : 0, 11 | "39CB70283A1C33AFB5FF861E924945826EDC74FE" : 0, 12 | "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" : 0, 13 | "AB0A48DD995E26A187DED71E830FA3DB4DD771C9" : 0, 14 | "4A8B372742AB6A9F7C003CD6A71C6422ECB61DE9" : 0, 15 | "A11A2549D5CB40607BCC5ED8DF4A3BF3E6CE30E2" : 0, 16 | "956D2B21DD155C49504BB67697A67F7C5351A353" : 0, 17 | "0A5C3A6DB1EA9211CEFA5384E9882B4D710699A4" : 0, 18 | "194A7A54F3CE0138A6C320E0643B7C60F8218891" : 0, 19 | "24A62EE155525E549162B020E618F50559185CDB" : 0 20 | }, 21 | "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "48436CD3-8D49-40EB-B982-5ACE57AB0DD9", 22 | "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { 23 | "9E0BC608EAE3637620FA818A6049BADAD4B54494" : "CartfileDiff\/Carthage\/Checkouts\/Tentacle\/", 24 | "4E1C83624AA2310289268788AA09D3B34615CC5F" : "CartfileDiff\/", 25 | "D23C0CEAADB77074FDA4459000068A7940EB7AD0" : "CartfileDiff\/Carthage\/Checkouts\/Commandant\/", 26 | "E084C86B03F81D63323C9E7510697EA528A758C7" : "CartfileDiff\/Carthage\/Checkouts\/Carthage\/Carthage\/Checkouts\/xcconfigs\/", 27 | "39CB70283A1C33AFB5FF861E924945826EDC74FE" : "CartfileDiff\/Carthage\/Checkouts\/Argo\/", 28 | "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" : "CartfileDiff\/Carthage\/Checkouts\/ReactiveCocoa\/", 29 | "AB0A48DD995E26A187DED71E830FA3DB4DD771C9" : "CartfileDiff\/Carthage\/Checkouts\/Carthage\/", 30 | "4A8B372742AB6A9F7C003CD6A71C6422ECB61DE9" : "CartfileDiff\/Carthage\/Checkouts\/ReactiveTask\/", 31 | "A11A2549D5CB40607BCC5ED8DF4A3BF3E6CE30E2" : "CartfileDiff\/Carthage\/Checkouts\/Tentacle\/Carthage\/Checkouts\/OHHTTPStubs\/", 32 | "956D2B21DD155C49504BB67697A67F7C5351A353" : "CartfileDiff\/Carthage\/Checkouts\/Result\/", 33 | "0A5C3A6DB1EA9211CEFA5384E9882B4D710699A4" : "CartfileDiff\/Carthage\/Checkouts\/Argo\/Carthage\/Checkouts\/Runes\/", 34 | "194A7A54F3CE0138A6C320E0643B7C60F8218891" : "CartfileDiff\/Carthage\/Checkouts\/Argo\/Carthage\/Checkouts\/Curry\/", 35 | "24A62EE155525E549162B020E618F50559185CDB" : "CartfileDiff\/Carthage\/Checkouts\/PrettyColors\/" 36 | }, 37 | "DVTSourceControlWorkspaceBlueprintNameKey" : "CartfileDiff", 38 | "DVTSourceControlWorkspaceBlueprintVersion" : 204, 39 | "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "CartfileDiff.xcworkspace", 40 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ 41 | { 42 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/thoughtbot\/Runes.git", 43 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 44 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "0A5C3A6DB1EA9211CEFA5384E9882B4D710699A4" 45 | }, 46 | { 47 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/thoughtbot\/Curry.git", 48 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 49 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "194A7A54F3CE0138A6C320E0643B7C60F8218891" 50 | }, 51 | { 52 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/jdhealy\/PrettyColors.git", 53 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 54 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "24A62EE155525E549162B020E618F50559185CDB" 55 | }, 56 | { 57 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/thoughtbot\/Argo.git", 58 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 59 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "39CB70283A1C33AFB5FF861E924945826EDC74FE" 60 | }, 61 | { 62 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Carthage\/ReactiveTask.git", 63 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 64 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "4A8B372742AB6A9F7C003CD6A71C6422ECB61DE9" 65 | }, 66 | { 67 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:yplan\/CartfileDiff.git", 68 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 69 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "4E1C83624AA2310289268788AA09D3B34615CC5F" 70 | }, 71 | { 72 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/ReactiveCocoa\/ReactiveCocoa.git", 73 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 74 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" 75 | }, 76 | { 77 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/antitypical\/Result.git", 78 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 79 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "956D2B21DD155C49504BB67697A67F7C5351A353" 80 | }, 81 | { 82 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/mdiep\/Tentacle.git", 83 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 84 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "9E0BC608EAE3637620FA818A6049BADAD4B54494" 85 | }, 86 | { 87 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/AliSoftware\/OHHTTPStubs.git", 88 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 89 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "A11A2549D5CB40607BCC5ED8DF4A3BF3E6CE30E2" 90 | }, 91 | { 92 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Carthage\/Carthage.git", 93 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 94 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "AB0A48DD995E26A187DED71E830FA3DB4DD771C9" 95 | }, 96 | { 97 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Carthage\/Commandant.git", 98 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 99 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "D23C0CEAADB77074FDA4459000068A7940EB7AD0" 100 | }, 101 | { 102 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/jspahrsummers\/xcconfigs.git", 103 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 104 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "E084C86B03F81D63323C9E7510697EA528A758C7" 105 | } 106 | ] 107 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 YPlan 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TEMPORARY_FOLDER?=/tmp/cartfilediff.dst 2 | PREFIX?=/usr/local 3 | 4 | XCODEFLAGS=-workspace 'CartfileDiff.xcworkspace' -scheme 'cartfilediff' DSTROOT=$(TEMPORARY_FOLDER) 5 | 6 | OUTPUT_PACKAGE=CartfileDiff.pkg 7 | OUTPUT_FRAMEWORK=CartfileDiffKit.framework 8 | 9 | BUILT_BUNDLE=$(TEMPORARY_FOLDER)/Applications/cartfilediff.app 10 | CARTFILEDIFFKIT_BUNDLE=$(BUILT_BUNDLE)/Contents/Frameworks/$(OUTPUT_FRAMEWORK) 11 | CARTFILEDIFF_EXECUTABLE=$(BUILT_BUNDLE)/Contents/MacOS/cartfilediff 12 | 13 | FRAMEWORKS_FOLDER=/Library/Frameworks 14 | BINARIES_FOLDER=/usr/local/bin 15 | 16 | VERSION_STRING=$(shell agvtool what-marketing-version -terse1) 17 | COMPONENTS_PLIST=Sources/Components.plist 18 | 19 | .PHONY: all bootstrap clean install package test uninstall 20 | 21 | all: bootstrap 22 | xcodebuild $(XCODEFLAGS) build 23 | 24 | bootstrap: 25 | git submodule update --init --recursive 26 | 27 | test: clean bootstrap 28 | xcodebuild $(XCODEFLAGS) test 29 | 30 | clean: 31 | rm -f "$(OUTPUT_PACKAGE)" 32 | rm -rf "$(TEMPORARY_FOLDER)" 33 | xcodebuild $(XCODEFLAGS) clean 34 | 35 | install: package 36 | sudo installer -pkg CartfileDiff.pkg -target / 37 | 38 | uninstall: 39 | rm -rf "$(FRAMEWORKS_FOLDER)/$(OUTPUT_FRAMEWORK)" 40 | rm -f "$(BINARIES_FOLDER)/cartfilediff" 41 | 42 | installables: clean bootstrap 43 | xcodebuild $(XCODEFLAGS) install 44 | 45 | mkdir -p "$(TEMPORARY_FOLDER)$(FRAMEWORKS_FOLDER)" "$(TEMPORARY_FOLDER)$(BINARIES_FOLDER)" 46 | mv -f "$(CARTFILEDIFFKIT_BUNDLE)" "$(TEMPORARY_FOLDER)$(FRAMEWORKS_FOLDER)/$(OUTPUT_FRAMEWORK)" 47 | mv -f "$(CARTFILEDIFF_EXECUTABLE)" "$(TEMPORARY_FOLDER)$(BINARIES_FOLDER)/cartfilediff" 48 | # rm -rf "$(BUILT_BUNDLE)" 49 | 50 | prefix_install: installables 51 | mkdir -p "$(PREFIX)/Frameworks" "$(PREFIX)/bin" 52 | cp -Rf "$(TEMPORARY_FOLDER)$(FRAMEWORKS_FOLDER)/$(OUTPUT_FRAMEWORK)" "$(PREFIX)/Frameworks/" 53 | cp -f "$(TEMPORARY_FOLDER)$(BINARIES_FOLDER)/cartfilediff" "$(PREFIX)/bin/" 54 | install_name_tool -add_rpath "@executable_path/../Frameworks/$(OUTPUT_FRAMEWORK)/Versions/Current/Frameworks/" "$(PREFIX)/bin/cartfilediff" 55 | 56 | package: installables 57 | pkgbuild \ 58 | --component-plist "$(COMPONENTS_PLIST)" \ 59 | --identifier "com.yplanapp.cartfilediff" \ 60 | --install-location "/" \ 61 | --root "$(TEMPORARY_FOLDER)" \ 62 | --version "$(VERSION_STRING)" \ 63 | "$(OUTPUT_PACKAGE)" 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CartfileDiff 2 | [![Build Status](https://travis-ci.org/YPlan/CartfileDiff.svg?branch=master)](https://travis-ci.org/YPlan/CartfileDiff) 3 | 4 | `cartfilediff` is a simple tool for comparing two `Cartfile.resolved` files and printing a list of dependencies in the latter which are new or differ in pinned version. 5 | 6 | ## Faster `carthage bootstrap` 7 | 8 | Building dependencies from source with Carthage can be time consuming, especially for large projects or on slower hardware. Carthage does not currently figure out which dependencies need rebuilding when running `carthage bootstrap` which can result in lengthy build times, even if only one dependency needs rebuilding. 9 | 10 | In combination with a cache, you can use `cartfilediff` to dramatically speed up your CI builds. Store the Carthage build products and the `Cartfile.resolved` in the cache, and compare the cached `Cartfile.resolved` with the current `Cartfile.resolved` at the start of the build. Then run `carthage bootstrap` with the modified dependencies, if necessary: 11 | 12 | ```sh 13 | #!/bin/bash 14 | 15 | CACHED_CARTFILE="cache/Cartfile.resolved" 16 | 17 | if [ -e "$CACHED_CARTFILE" ]; then 18 | OUTDATED_DEPENDENCIES=$(cartfilediff "$CACHED_CARTFILE" Cartfile.resolved) 19 | 20 | if [ ! -z "$OUTDATED_DEPENDENCIES" ] 21 | then 22 | echo "Bootstrapping outdated dependencies: $OUTDATED_DEPENDENCIES" 23 | carthage bootstrap "$OUTDATED_DEPENDENCIES" 24 | else 25 | echo "Cartfile.resolved matches cached, skipping bootstrap" 26 | fi 27 | else 28 | echo "Cached Cartfile.resolved not found, bootstrapping all dependencies" 29 | carthage bootstrap 30 | fi 31 | 32 | ``` 33 | 34 | ## Installation 35 | 36 | See [Releases](https://github.com/YPlan/CartfileDiff/releases) for prebuilt `pkg` installers. 37 | 38 | Alternatively, clone this repository and run `make install`. 39 | 40 | ## Usage 41 | 42 | `cartfilediff ` 43 | 44 | The tool prints a list of dependencies which need bootstrapping. If nothing needs bootstrapping, the tool prints nothing. 45 | 46 | ## License 47 | 48 | CartfileDiff is released under the [MIT License](LICENSE.md). 49 | 50 | ## Acknowledgements 51 | 52 | [Carthage](https://github.com/Carthage/Carthage), for providing the Carthage tool and for portions of source code used in this project. 53 | -------------------------------------------------------------------------------- /Sources/CartfileDiffKit/CartfileDiffKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // CartfileDiffKit.h 3 | // CartfileDiff 4 | // 5 | // Created by David Caunt on 09/08/2016. 6 | // Copyright © 2016 Leanworks Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for CartfileDiff. 12 | FOUNDATION_EXPORT double CartfileDiffKitVersionNumber; 13 | 14 | //! Project version string for CartfileDiff. 15 | FOUNDATION_EXPORT const unsigned char CartfileDiffKitVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Sources/CartfileDiffKit/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Leanworks Ltd. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Sources/Components.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | BundleIsVersionChecked 7 | 8 | BundleOverwriteAction 9 | upgrade 10 | ChildBundles 11 | 12 | 13 | BundleOverwriteAction 14 | 15 | RootRelativeBundlePath 16 | Library/Frameworks/CartfileDiffKit.framework/Versions/A/Frameworks/CarthageKit.framework 17 | 18 | 19 | RootRelativeBundlePath 20 | Library/Frameworks/CartfileDiffKit.framework 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 0.1 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2016 Leanworks Ltd. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /Sources/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // CartfileDiff 4 | // 5 | // Created by David Caunt on 05/08/2016. 6 | // Copyright © 2016 Leanworks Ltd. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import CarthageKit 11 | import Result 12 | import CartfileDiffKit 13 | 14 | func printUsageString() { 15 | print("Usage: cartfilediff accepts two arguents which are paths to " 16 | + "Cartfile.resolved files and prints a list of dependencies in which " 17 | + "are modified or added in the second argument") 18 | print("e.g.: \(Process.arguments[0]) ") 19 | } 20 | 21 | func loadResolvedCartfile(url: NSURL) -> Result { 22 | do { 23 | let resolvedCartfileContents = try NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding) 24 | return ResolvedCartfile.fromString(resolvedCartfileContents as String) 25 | } catch let error as NSError { 26 | return .Failure(.ReadFailed(url, error)) 27 | } 28 | } 29 | 30 | guard Process.arguments.count == 3 else { 31 | printUsageString() 32 | exit(1) 33 | } 34 | 35 | let cachedCartfileURL = NSURL(fileURLWithPath: Process.arguments[1]) 36 | let cartfileURL = NSURL(fileURLWithPath: Process.arguments[2]) 37 | 38 | let cachedCartfileResult = loadResolvedCartfile(cachedCartfileURL) 39 | guard case let .Success(cachedCartfile) = cachedCartfileResult else { 40 | print(cachedCartfileResult.error) 41 | exit(1) 42 | } 43 | 44 | let cartfileResult = loadResolvedCartfile(cartfileURL) 45 | guard case let .Success(cartfile) = cartfileResult else { 46 | print(cartfileResult.error) 47 | exit(1) 48 | } 49 | 50 | var existingMap = [ProjectIdentifier:PinnedVersion]() 51 | for dependency in cachedCartfile.dependencies { 52 | existingMap[dependency.project] = dependency.version 53 | } 54 | 55 | let changed = cartfile.dependencies.filter { 56 | guard let existingVersion = existingMap[$0.project] else { 57 | return true 58 | } 59 | return $0.version != existingVersion 60 | } 61 | 62 | let orderedNames = changed.map { $0.project.name }.sort() 63 | 64 | if !orderedNames.isEmpty { 65 | print("\(orderedNames.joinWithSeparator(" "))") 66 | } 67 | -------------------------------------------------------------------------------- /script/extract-tool: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Extracts the carthage CLI tool from its application bundle. Meant to be run 4 | # as part of an Xcode Run Script build phase. 5 | 6 | cp -v "${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}" "${BUILT_PRODUCTS_DIR}/${EXECUTABLE_NAME}" 7 | --------------------------------------------------------------------------------