From 5012bd2251b8a47170359399f14b6aed83256824 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 29 Nov 2012 20:00:57 +0000 Subject: [PATCH 001/157] Sketch initialisation API --- Classes/GTDiff.h | 22 +++++++++++++++++++ Classes/GTDiff.m | 13 +++++++++++ .../project.pbxproj | 12 ++++++++++ libgit2 | 2 +- 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 Classes/GTDiff.h create mode 100644 Classes/GTDiff.m diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h new file mode 100644 index 000000000..926520b86 --- /dev/null +++ b/Classes/GTDiff.h @@ -0,0 +1,22 @@ +// +// GTDiff.h +// ObjectiveGitFramework +// +// Created by Danny Greg on 29/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "git2.h" + +@class GTTree; + +@interface GTDiff : NSObject + +@property (nonatomic, readonly, assign) git_diff_list *git_diff_list; + ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSUInteger)options; ++ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree withOptions:(NSUInteger)options; ++ (GTDiff *)diffWorkingDirectoryToIndexWithOptions:(NSUInteger)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSUInteger)options; + +@end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m new file mode 100644 index 000000000..87be32700 --- /dev/null +++ b/Classes/GTDiff.m @@ -0,0 +1,13 @@ +// +// GTDiff.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 29/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "GTDiff.h" + +@implementation GTDiff + +@end diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index bd7da616a..96c25eec7 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -62,6 +62,10 @@ 04DB466E133AB5EB00D9C624 /* GTReference.m in Sources */ = {isa = PBXBuildFile; fileRef = BD441E07131ED0C300187010 /* GTReference.m */; }; 04DB466F133AB5EB00D9C624 /* GTBranch.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F50F57132054D800584FBE /* GTBranch.m */; }; 04DB4672133AB5FE00D9C624 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 04DB4671133AB5FE00D9C624 /* libz.dylib */; }; + 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; + 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; + 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; + 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; 3E0A23E5159E0FDB00A6068F /* GTObjectDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 55C8054F13861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; 55C8055013861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; @@ -258,6 +262,8 @@ 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 30A3D6521667F11C00C49A39 /* GTDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiff.h; sourceTree = ""; }; + 30A3D6531667F11C00C49A39 /* GTDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiff.m; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* ObjectiveGitFramework_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectiveGitFramework_Prefix.pch; sourceTree = ""; }; 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTObjectDatabase.h; sourceTree = ""; }; 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = GTObjectDatabase.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -580,6 +586,8 @@ 88EB7E4C14AEBA600046FEA4 /* GTConfiguration.m */, 883CD6A91600EBC600F57354 /* GTRemote.h */, 883CD6AA1600EBC600F57354 /* GTRemote.m */, + 30A3D6521667F11C00C49A39 /* GTDiff.h */, + 30A3D6531667F11C00C49A39 /* GTDiff.m */, ); path = Classes; sourceTree = ""; @@ -624,6 +632,7 @@ 04DB465E133AB5E200D9C624 /* GTBranch.h in Headers */, AA046113134F4D2000DF526B /* GTOdbObject.h in Headers */, E9FFC6C01577CC8A00A9E736 /* GTConfiguration.h in Headers */, + 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -654,6 +663,7 @@ 883CD6AB1600EBC600F57354 /* GTRemote.h in Headers */, 55C8057E13875C1B004DCB0F /* NSString+Git.h in Headers */, 8849C6A214AD81FF003890AF /* GTRepository+Private.h in Headers */, + 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -908,6 +918,7 @@ 55C8054F13861FE7004DCB0F /* GTObjectDatabase.m in Sources */, 55C8057C13875579004DCB0F /* NSString+Git.m in Sources */, E9FFC6BF1577CC8300A9E736 /* GTConfiguration.m in Sources */, + 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -957,6 +968,7 @@ 88EB7E4E14AEBA600046FEA4 /* GTConfiguration.m in Sources */, 883CD6AC1600EBC600F57354 /* GTRemote.m in Sources */, 88F05AC61601209A00B7AD1D /* ObjectiveGit.m in Sources */, + 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/libgit2 b/libgit2 index 693021262..83885891f 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit 693021262ba0eeac2923bbce1b2262717019c807 +Subproject commit 83885891f583ab447f98f1c7a637f1f507e1be22 From abbeadabe96f0d17430bff01e9d01643fa54ca82 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 12:35:47 +0000 Subject: [PATCH 002/157] Declare an enum for git_delta_t --- Classes/GTDiff.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 926520b86..74687e44d 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -10,6 +10,17 @@ @class GTTree; +typedef enum : git_delta_t { + GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, + GTDiffFileDeltaAdded = GIT_DELTA_ADDED, + GTDiffFileDeltaDeleted = GIT_DELTA_DELETED, + GTDiffFileDeltaModified = GIT_DELTA_MODIFIED, + GTDiffFileDeltaRenamed = GIT_DELTA_RENAMED, + GTDiffFileDeltaCopied = GIT_DELTA_COPIED, + GTDiffFileDeltaIgnored = GIT_DELTA_IGNORED, + GTDiffFileDeltaUntracked = GIT_DELTA_UNTRACKED, + GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, +} GTDiffFileDelta; @interface GTDiff : NSObject @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; From 543ded7ea3c3238dd59527fba56c1719691f06e3 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 12:43:54 +0000 Subject: [PATCH 003/157] Sketch a processing block for the file level of the diff. --- Classes/GTDiff.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 74687e44d..b064f9e3b 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -8,6 +8,7 @@ #import "git2.h" +@class GTDiffFile; @class GTTree; typedef enum : git_delta_t { @@ -21,6 +22,8 @@ typedef enum : git_delta_t { GTDiffFileDeltaUntracked = GIT_DELTA_UNTRACKED, GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffFileDelta; + +typedef BOOL(^GTDiffFileProcessingBlock)(GTDiffFile *oldFile, GTDiffFile *newFile, GTDiffFileDelta status, NSUInteger similarity, BOOL isBinary); @interface GTDiff : NSObject @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; From bf6767987aaee3418bb5c3a8b239d9d2a9e78b22 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:05:41 +0000 Subject: [PATCH 004/157] Sketch GTDiffDelta API. --- Classes/GTDiffDelta.h | 25 +++++++++++++++++++++++++ Classes/GTDiffDelta.m | 13 +++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 Classes/GTDiffDelta.h create mode 100644 Classes/GTDiffDelta.m diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h new file mode 100644 index 000000000..b563629a6 --- /dev/null +++ b/Classes/GTDiffDelta.h @@ -0,0 +1,25 @@ +// +// GTDiffDelta.h +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "git2.h" + +#import "GTDiff.h" + +@class GTDiffFile; + +@interface GTDiffDelta : NSObject + +@property (nonatomic, readonly) git_diff_delta git_diff_delta; + +@property (nonatomic, readonly, strong) NSArray *hunks; +@property (nonatomic, readonly, getter = isBinary) BOOL binary; +@property (nonatomic, readonly, strong) GTDiffFile *oldFile; +@property (nonatomic, readonly, strong) GTDiffFile *newFile; +@property (nonatomic, readonly) GTDiffFileDelta status; + +@end diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m new file mode 100644 index 000000000..6f1a29838 --- /dev/null +++ b/Classes/GTDiffDelta.m @@ -0,0 +1,13 @@ +// +// GTDiffDelta.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "GTDiffDelta.h" + +@implementation GTDiffDelta + +@end From e9cb72f199c545cd207d475df506770cf11167e6 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:05:54 +0000 Subject: [PATCH 005/157] Sketch GTDiffFile API. --- Classes/GTDiffFile.h | 18 ++++++++++++++++++ Classes/GTDiffFile.m | 13 +++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 Classes/GTDiffFile.h create mode 100644 Classes/GTDiffFile.m diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h new file mode 100644 index 000000000..56fda377d --- /dev/null +++ b/Classes/GTDiffFile.h @@ -0,0 +1,18 @@ +// +// GTDiffFile.h +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "git2.h" + +@interface GTDiffFile : NSObject + +@property (nonatomic, readonly) git_diff_file *git_diff_file; + +@property (nonatomic, readonly, strong) NSString *path; +@property (nonatomic, readonly) NSUInteger size; + +@end diff --git a/Classes/GTDiffFile.m b/Classes/GTDiffFile.m new file mode 100644 index 000000000..88230f34b --- /dev/null +++ b/Classes/GTDiffFile.m @@ -0,0 +1,13 @@ +// +// GTDiffFile.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "GTDiffFile.h" + +@implementation GTDiffFile + +@end From 0f69f51fe54b8f6b0e50cd68979207c63e6dcde5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:06:03 +0000 Subject: [PATCH 006/157] Sketch GTDiffHunk API --- Classes/GTDiffHunk.h | 28 ++++++++++++++++++++++++++++ Classes/GTDiffHunk.m | 13 +++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Classes/GTDiffHunk.h create mode 100644 Classes/GTDiffHunk.m diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h new file mode 100644 index 000000000..382f69c9c --- /dev/null +++ b/Classes/GTDiffHunk.h @@ -0,0 +1,28 @@ +// +// GTDiffHunk.h +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "git2.h" + +typedef enum : git_diff_line_t { + GTDiffHunkLineOriginContext = GIT_DIFF_LINE_CONTEXT, + GTDiffHunkLineOriginAddition = GIT_DIFF_LINE_ADDITION, + GTDiffHunkLineOriginDeletion = GIT_DIFF_LINE_DELETION, + GTDiffHunkLineOriginAddEOFNewLine = GIT_DIFF_LINE_ADD_EOFNL, + GTDiffHunkLineOriginDeleteEOFNewLine = GIT_DIFF_LINE_DEL_EOFNL, +} GTDiffHunkLineOrigin; + +typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin); + +@interface GTDiffHunk : NSObject + +@property (nonatomic, readonly, strong) NSString *header; +@property (nonatomic, readonly) NSUInteger lineCount; + +- (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; + +@end diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m new file mode 100644 index 000000000..d7fcc9d5d --- /dev/null +++ b/Classes/GTDiffHunk.m @@ -0,0 +1,13 @@ +// +// GTDiffHunk.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 30/11/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "GTDiffHunk.h" + +@implementation GTDiffHunk + +@end From b9e1dce7e01697a7dee9ae9cd16d58d652b69671 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:06:17 +0000 Subject: [PATCH 007/157] Reflect new class structure in GTDiff.h --- Classes/GTDiff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index b064f9e3b..20c16dcce 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -23,10 +23,10 @@ typedef enum : git_delta_t { GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffFileDelta; -typedef BOOL(^GTDiffFileProcessingBlock)(GTDiffFile *oldFile, GTDiffFile *newFile, GTDiffFileDelta status, NSUInteger similarity, BOOL isBinary); @interface GTDiff : NSObject @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; +@property (nonatomic, readonly, strong) NSArray *files; + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSUInteger)options; + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree withOptions:(NSUInteger)options; From c7488b5a584e5f50256de14c521f85c619abd6c0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:06:21 +0000 Subject: [PATCH 008/157] Update project. --- .../project.pbxproj | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index 96c25eec7..ca6ee743a 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -62,6 +62,18 @@ 04DB466E133AB5EB00D9C624 /* GTReference.m in Sources */ = {isa = PBXBuildFile; fileRef = BD441E07131ED0C300187010 /* GTReference.m */; }; 04DB466F133AB5EB00D9C624 /* GTBranch.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F50F57132054D800584FBE /* GTBranch.m */; }; 04DB4672133AB5FE00D9C624 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 04DB4671133AB5FE00D9C624 /* libz.dylib */; }; + 3011D86B1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; }; + 3011D86C1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; }; + 3011D86D1668E48500CE3409 /* GTDiffFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D86A1668E48500CE3409 /* GTDiffFile.m */; }; + 3011D86E1668E48500CE3409 /* GTDiffFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D86A1668E48500CE3409 /* GTDiffFile.m */; }; + 3011D8711668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; }; + 3011D8721668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; }; + 3011D8731668E78500CE3409 /* GTDiffHunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8701668E78500CE3409 /* GTDiffHunk.m */; }; + 3011D8741668E78500CE3409 /* GTDiffHunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8701668E78500CE3409 /* GTDiffHunk.m */; }; + 3011D8771668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; }; + 3011D8781668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; }; + 3011D8791668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; + 3011D87A1668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; @@ -262,6 +274,12 @@ 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 3011D8691668E48500CE3409 /* GTDiffFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiffFile.h; sourceTree = ""; }; + 3011D86A1668E48500CE3409 /* GTDiffFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffFile.m; sourceTree = ""; }; + 3011D86F1668E78500CE3409 /* GTDiffHunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiffHunk.h; sourceTree = ""; }; + 3011D8701668E78500CE3409 /* GTDiffHunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffHunk.m; sourceTree = ""; }; + 3011D8751668F29600CE3409 /* GTDiffDelta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiffDelta.h; sourceTree = ""; }; + 3011D8761668F29600CE3409 /* GTDiffDelta.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffDelta.m; sourceTree = ""; }; 30A3D6521667F11C00C49A39 /* GTDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiff.h; sourceTree = ""; }; 30A3D6531667F11C00C49A39 /* GTDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiff.m; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* ObjectiveGitFramework_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectiveGitFramework_Prefix.pch; sourceTree = ""; }; @@ -588,6 +606,12 @@ 883CD6AA1600EBC600F57354 /* GTRemote.m */, 30A3D6521667F11C00C49A39 /* GTDiff.h */, 30A3D6531667F11C00C49A39 /* GTDiff.m */, + 3011D8691668E48500CE3409 /* GTDiffFile.h */, + 3011D86A1668E48500CE3409 /* GTDiffFile.m */, + 3011D86F1668E78500CE3409 /* GTDiffHunk.h */, + 3011D8701668E78500CE3409 /* GTDiffHunk.m */, + 3011D8751668F29600CE3409 /* GTDiffDelta.h */, + 3011D8761668F29600CE3409 /* GTDiffDelta.m */, ); path = Classes; sourceTree = ""; @@ -633,6 +657,9 @@ AA046113134F4D2000DF526B /* GTOdbObject.h in Headers */, E9FFC6C01577CC8A00A9E736 /* GTConfiguration.h in Headers */, 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */, + 3011D86C1668E48500CE3409 /* GTDiffFile.h in Headers */, + 3011D8721668E78500CE3409 /* GTDiffHunk.h in Headers */, + 3011D8781668F29600CE3409 /* GTDiffDelta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -664,6 +691,9 @@ 55C8057E13875C1B004DCB0F /* NSString+Git.h in Headers */, 8849C6A214AD81FF003890AF /* GTRepository+Private.h in Headers */, 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */, + 3011D86B1668E48500CE3409 /* GTDiffFile.h in Headers */, + 3011D8711668E78500CE3409 /* GTDiffHunk.h in Headers */, + 3011D8771668F29600CE3409 /* GTDiffDelta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -919,6 +949,9 @@ 55C8057C13875579004DCB0F /* NSString+Git.m in Sources */, E9FFC6BF1577CC8300A9E736 /* GTConfiguration.m in Sources */, 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */, + 3011D86E1668E48500CE3409 /* GTDiffFile.m in Sources */, + 3011D8741668E78500CE3409 /* GTDiffHunk.m in Sources */, + 3011D87A1668F29600CE3409 /* GTDiffDelta.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -969,6 +1002,9 @@ 883CD6AC1600EBC600F57354 /* GTRemote.m in Sources */, 88F05AC61601209A00B7AD1D /* ObjectiveGit.m in Sources */, 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */, + 3011D86D1668E48500CE3409 /* GTDiffFile.m in Sources */, + 3011D8731668E78500CE3409 /* GTDiffHunk.m in Sources */, + 3011D8791668F29600CE3409 /* GTDiffDelta.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 595c0eb9cbb2c42039c408ed373995729cc84b7e Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:16:36 +0000 Subject: [PATCH 009/157] Create hunk initialisation API. --- Classes/GTDiffHunk.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 382f69c9c..6a10646eb 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -23,6 +23,8 @@ typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger o @property (nonatomic, readonly, strong) NSString *header; @property (nonatomic, readonly) NSUInteger lineCount; +- (id)initWithPatch:(git_diff_patch *)path hunkIndex:(size_t)hunkIndex; + - (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; @end From 692454830c64031bda2b46664cdb337098c5f3a7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:19:21 +0000 Subject: [PATCH 010/157] Delta initialisation. --- Classes/GTDiffDelta.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index b563629a6..276c3caa2 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -22,4 +22,6 @@ @property (nonatomic, readonly, strong) GTDiffFile *newFile; @property (nonatomic, readonly) GTDiffFileDelta status; +- (id)initWithGitDelta:(git_diff_delta *)delta; + @end From 04a250ffc0b5713c8bb9d8dbf5e9b5313e52d8a7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:22:02 +0000 Subject: [PATCH 011/157] GTDiff initialisation. --- Classes/GTDiff.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 20c16dcce..eb9d08733 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -33,4 +33,6 @@ typedef enum : git_delta_t { + (GTDiff *)diffWorkingDirectoryToIndexWithOptions:(NSUInteger)options; + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSUInteger)options; +- (id)initWithGitDiffList:(git_diff_list *)diffList; + @end From a7080d5150aa876e20947f39e647de1101fdad4f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:23:54 +0000 Subject: [PATCH 012/157] Move the declaration of GTDiffFileDelta. --- Classes/GTDiff.h | 12 ------------ Classes/GTDiffDelta.h | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index eb9d08733..128a519cc 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -11,18 +11,6 @@ @class GTDiffFile; @class GTTree; -typedef enum : git_delta_t { - GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, - GTDiffFileDeltaAdded = GIT_DELTA_ADDED, - GTDiffFileDeltaDeleted = GIT_DELTA_DELETED, - GTDiffFileDeltaModified = GIT_DELTA_MODIFIED, - GTDiffFileDeltaRenamed = GIT_DELTA_RENAMED, - GTDiffFileDeltaCopied = GIT_DELTA_COPIED, - GTDiffFileDeltaIgnored = GIT_DELTA_IGNORED, - GTDiffFileDeltaUntracked = GIT_DELTA_UNTRACKED, - GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, -} GTDiffFileDelta; - @interface GTDiff : NSObject @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 276c3caa2..c3d768c42 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -10,6 +10,18 @@ #import "GTDiff.h" +typedef enum : git_delta_t { + GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, + GTDiffFileDeltaAdded = GIT_DELTA_ADDED, + GTDiffFileDeltaDeleted = GIT_DELTA_DELETED, + GTDiffFileDeltaModified = GIT_DELTA_MODIFIED, + GTDiffFileDeltaRenamed = GIT_DELTA_RENAMED, + GTDiffFileDeltaCopied = GIT_DELTA_COPIED, + GTDiffFileDeltaIgnored = GIT_DELTA_IGNORED, + GTDiffFileDeltaUntracked = GIT_DELTA_UNTRACKED, + GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, +} GTDiffFileDelta; + @class GTDiffFile; @interface GTDiffDelta : NSObject From aa40c443431cddb036beb119d7f4df6032bae14b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:24:05 +0000 Subject: [PATCH 013/157] Remove unnecessary `@class` --- Classes/GTDiff.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 128a519cc..eafefcef4 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -8,7 +8,6 @@ #import "git2.h" -@class GTDiffFile; @class GTTree; @interface GTDiff : NSObject From a2701e93faab3b073b0e9e60211404ed61fb4107 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:37:27 +0000 Subject: [PATCH 014/157] Add API to fetch the number of deltas of a given type. --- Classes/GTDiff.h | 7 +++++-- Classes/GTDiffDelta.h | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index eafefcef4..47338f750 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -8,18 +8,21 @@ #import "git2.h" +#import "GTDiffDelta.h" + @class GTTree; @interface GTDiff : NSObject @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; -@property (nonatomic, readonly, strong) NSArray *files; +@property (nonatomic, readonly, strong) NSArray *deltas; + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSUInteger)options; + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree withOptions:(NSUInteger)options; + (GTDiff *)diffWorkingDirectoryToIndexWithOptions:(NSUInteger)options; + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSUInteger)options; -- (id)initWithGitDiffList:(git_diff_list *)diffList; +- (instancetype)initWithGitDiffList:(git_diff_list *)diffList; +- (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; @end diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index c3d768c42..a06355ec6 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -20,7 +20,7 @@ typedef enum : git_delta_t { GTDiffFileDeltaIgnored = GIT_DELTA_IGNORED, GTDiffFileDeltaUntracked = GIT_DELTA_UNTRACKED, GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, -} GTDiffFileDelta; +} GTDiffDeltaType; @class GTDiffFile; @@ -32,7 +32,7 @@ typedef enum : git_delta_t { @property (nonatomic, readonly, getter = isBinary) BOOL binary; @property (nonatomic, readonly, strong) GTDiffFile *oldFile; @property (nonatomic, readonly, strong) GTDiffFile *newFile; -@property (nonatomic, readonly) GTDiffFileDelta status; +@property (nonatomic, readonly) GTDiffDeltaType status; - (id)initWithGitDelta:(git_diff_delta *)delta; From fe41bc2eae1a07046ec90a27a043dd8bcfda71d2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:49:28 +0000 Subject: [PATCH 015/157] GTDiff lifecycle. --- Classes/GTDiff.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 87be32700..9e0d6eca2 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -10,4 +10,18 @@ @implementation GTDiff +- (instancetype)initWithGitDiffList:(git_diff_list *)diffList { + self = [super init]; + if (self == nil) return nil; + + _git_diff_list = diffList; + + return self; +} + +- (void)dealloc +{ + git_diff_list_free(self.git_diff_list); +} + @end From b4f0c1de97ebba77e71c307c027c5227b98af1ae Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:49:48 +0000 Subject: [PATCH 016/157] Implement delta generation. --- Classes/GTDiff.m | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 9e0d6eca2..68e7f630c 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -8,6 +8,16 @@ #import "GTDiff.h" +#import "GTDiffDelta.h" + +int GTDiffFilesCallback(void *data, const git_diff_delta *delta, float progress); + +@interface GTDiff () + +@property (nonatomic, strong) NSMutableArray *deltasBuilderArray; + +@end + @implementation GTDiff - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { @@ -24,4 +34,24 @@ - (void)dealloc git_diff_list_free(self.git_diff_list); } +#pragma mark - Properties + +- (NSArray *)deltas { + size_t count = git_diff_num_deltas(self.git_diff_list); + self.deltasBuilderArray = [NSMutableArray arrayWithCapacity:count]; + git_diff_foreach(self.git_diff_list, (__bridge void *)(self.deltasBuilderArray), GTDiffFilesCallback, nil, nil); + return [NSArray arrayWithArray:self.deltasBuilderArray]; +} + +- (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType { + return git_diff_num_deltas_of_type(self.git_diff_list, (git_delta_t)deltaType); +} + @end + +int GTDiffFilesCallback(void *data, const git_diff_delta *delta, float progress) { + GTDiffDelta *gtDelta = [[GTDiffDelta alloc] initWithGitDelta:(git_diff_delta *)delta]; + NSMutableArray *passedArray = (__bridge NSMutableArray *)data; + if (passedArray != nil)[passedArray addObject:gtDelta]; + return 0; +} From 71478380d191d6fa3bacf8283bb779af8890f31a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:50:36 +0000 Subject: [PATCH 017/157] Only build deltas once. --- Classes/GTDiff.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 68e7f630c..4a1d39138 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -37,9 +37,12 @@ - (void)dealloc #pragma mark - Properties - (NSArray *)deltas { - size_t count = git_diff_num_deltas(self.git_diff_list); - self.deltasBuilderArray = [NSMutableArray arrayWithCapacity:count]; - git_diff_foreach(self.git_diff_list, (__bridge void *)(self.deltasBuilderArray), GTDiffFilesCallback, nil, nil); + if (self.deltasBuilderArray != nil) { + size_t count = git_diff_num_deltas(self.git_diff_list); + self.deltasBuilderArray = [NSMutableArray arrayWithCapacity:count]; + git_diff_foreach(self.git_diff_list, (__bridge void *)(self.deltasBuilderArray), GTDiffFilesCallback, nil, nil); + } + return [NSArray arrayWithArray:self.deltasBuilderArray]; } From f8bfb12f9508b9f76602c8428cf85e5f48ebc18b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 14:55:34 +0000 Subject: [PATCH 018/157] Adjust convenience constructors signatures. Turns out a GTRepository would be a useful thing to have. WHO KNEW?! --- Classes/GTDiff.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 47338f750..3d001cbdf 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -10,6 +10,7 @@ #import "GTDiffDelta.h" +@class GTRepository; @class GTTree; @interface GTDiff : NSObject @@ -17,10 +18,10 @@ @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; @property (nonatomic, readonly, strong) NSArray *deltas; -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSUInteger)options; -+ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree withOptions:(NSUInteger)options; -+ (GTDiff *)diffWorkingDirectoryToIndexWithOptions:(NSUInteger)options; -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSUInteger)options; ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; ++ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; ++ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; From 542d8eb8c19e9767341c76488ffab8d55c53c212 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 15:09:31 +0000 Subject: [PATCH 019/157] Note that we need to settle on an options strategy. --- Classes/GTDiff.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 3d001cbdf..05c76ef2d 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -18,6 +18,8 @@ @property (nonatomic, readonly, assign) git_diff_list *git_diff_list; @property (nonatomic, readonly, strong) NSArray *deltas; +//TODO: Need to settle on a method for sending in the options struct + + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options; From f6e2d94a5ef8cfca3c1cfee91eb9c6ffa37feba6 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 15:09:49 +0000 Subject: [PATCH 020/157] Implement initialisation for 2 trees. --- Classes/GTDiff.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 4a1d39138..025123494 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -9,6 +9,8 @@ #import "GTDiff.h" #import "GTDiffDelta.h" +#import "GTRepository.h" +#import "GTTree.h" int GTDiffFilesCallback(void *data, const git_diff_delta *delta, float progress); @@ -20,6 +22,15 @@ @interface GTDiff () @implementation GTDiff ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { + git_diff_list *diffList; + int returnValue = git_diff_tree_to_tree(repository.git_repository, nil, oldTree.git_tree, newTree.git_tree, &diffList); + if (returnValue != GIT_OK) return nil; + + GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; + return newDiff; +} + - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { self = [super init]; if (self == nil) return nil; From fe68272ec90888a6580fbac3070e8018bd6f69c2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 15:11:52 +0000 Subject: [PATCH 021/157] Implement diff from index to tree. --- Classes/GTDiff.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 025123494..aa570993d 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -31,6 +31,15 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos return newDiff; } ++ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { + git_diff_list *diffList; + int returnValue = git_diff_index_to_tree(repository.git_repository, nil, oldTree.git_tree, &diffList); + if (returnValue != GIT_OK) return nil; + + GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; + return newDiff; +} + - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { self = [super init]; if (self == nil) return nil; From f8c8e7d002cd5c35585e2495495c66ca32d29967 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 15:12:03 +0000 Subject: [PATCH 022/157] Implement working dir to index. --- Classes/GTDiff.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index aa570993d..ec2a15f59 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -40,6 +40,15 @@ + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)r return newDiff; } ++ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options { + git_diff_list *diffList; + int returnValue = git_diff_workdir_to_index(repository.git_repository, nil, &diffList); + if (returnValue != GIT_OK) return nil; + + GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; + return newDiff; +} + - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { self = [super init]; if (self == nil) return nil; From f284d8b22f6fc9cb25fa48156d760423108b0db1 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 15:12:13 +0000 Subject: [PATCH 023/157] Implement working dir to tree. --- Classes/GTDiff.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index ec2a15f59..34ea9110b 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -49,6 +49,15 @@ + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository return newDiff; } ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { + git_diff_list *diffList; + int returnValue = git_diff_workdir_to_tree(repository.git_repository, nil, tree.git_tree, &diffList); + if (returnValue != GIT_OK) return nil; + + GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; + return newDiff; +} + - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { self = [super init]; if (self == nil) return nil; From 86484d57c77f46f14ed267fed2f6fde6cfd8e147 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:02:32 +0000 Subject: [PATCH 024/157] GTDiffDelta is now initialised with a patch. Way better, as we don't have to do a foreach to get at it and we can be in control of it's lifecycle. --- Classes/GTDiff.h | 3 ++- Classes/GTDiff.m | 29 ++++++++++++++--------------- Classes/GTDiffDelta.h | 5 +++-- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 05c76ef2d..6032ccf6f 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -15,7 +15,8 @@ @interface GTDiff : NSObject -@property (nonatomic, readonly, assign) git_diff_list *git_diff_list; +@property (nonatomic, readonly) git_diff_list *git_diff_list; +@property (nonatomic, readonly) NSUInteger deltaCount; @property (nonatomic, readonly, strong) NSArray *deltas; //TODO: Need to settle on a method for sending in the options struct diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 34ea9110b..609248894 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -12,11 +12,9 @@ #import "GTRepository.h" #import "GTTree.h" -int GTDiffFilesCallback(void *data, const git_diff_delta *delta, float progress); - @interface GTDiff () -@property (nonatomic, strong) NSMutableArray *deltasBuilderArray; +@property (nonatomic, strong) NSMutableArray *deltasInternalArray; @end @@ -75,13 +73,21 @@ - (void)dealloc #pragma mark - Properties - (NSArray *)deltas { - if (self.deltasBuilderArray != nil) { - size_t count = git_diff_num_deltas(self.git_diff_list); - self.deltasBuilderArray = [NSMutableArray arrayWithCapacity:count]; - git_diff_foreach(self.git_diff_list, (__bridge void *)(self.deltasBuilderArray), GTDiffFilesCallback, nil, nil); + if (self.deltasInternalArray != nil) { + for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { + git_diff_patch *patch; + int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); + if (result != GIT_OK) continue; + GTDiffDelta *delta = [[GTDiffDelta alloc] initWithGitPatch:patch]; + if (delta != nil) [self.deltasInternalArray addObject:delta]; + } } - return [NSArray arrayWithArray:self.deltasBuilderArray]; + return [NSArray arrayWithArray:self.deltasInternalArray]; +} + +- (NSUInteger)deltaCount { + return git_diff_num_deltas(self.git_diff_list); } - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType { @@ -89,10 +95,3 @@ - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType { } @end - -int GTDiffFilesCallback(void *data, const git_diff_delta *delta, float progress) { - GTDiffDelta *gtDelta = [[GTDiffDelta alloc] initWithGitDelta:(git_diff_delta *)delta]; - NSMutableArray *passedArray = (__bridge NSMutableArray *)data; - if (passedArray != nil)[passedArray addObject:gtDelta]; - return 0; -} diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index a06355ec6..f1aaecc97 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -26,7 +26,8 @@ typedef enum : git_delta_t { @interface GTDiffDelta : NSObject -@property (nonatomic, readonly) git_diff_delta git_diff_delta; +@property (nonatomic, readonly) git_diff_delta *git_diff_delta; +@property (nonatomic, readonly) git_diff_patch *git_diff_patch; @property (nonatomic, readonly, strong) NSArray *hunks; @property (nonatomic, readonly, getter = isBinary) BOOL binary; @@ -34,6 +35,6 @@ typedef enum : git_delta_t { @property (nonatomic, readonly, strong) GTDiffFile *newFile; @property (nonatomic, readonly) GTDiffDeltaType status; -- (id)initWithGitDelta:(git_diff_delta *)delta; +- (instancetype)initWithGitPatch:(git_diff_patch *)patch; @end From 583facaab26dfd8f2b36f38663e7a2d28ccae659 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:40:44 +0000 Subject: [PATCH 025/157] Typo fix. --- Classes/GTDiffHunk.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 6a10646eb..8da9113a5 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -23,7 +23,7 @@ typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger o @property (nonatomic, readonly, strong) NSString *header; @property (nonatomic, readonly) NSUInteger lineCount; -- (id)initWithPatch:(git_diff_patch *)path hunkIndex:(size_t)hunkIndex; +- (id)initWithPatch:(git_diff_patch *)patch hunkIndex:(size_t)hunkIndex; - (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; From 7faa6810a0fae19a5d1f359260d6c0ad12ce1e7a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:41:26 +0000 Subject: [PATCH 026/157] Hunks should be enumerated to keep them lazy-ish. --- Classes/GTDiffDelta.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index f1aaecc97..08bd75e3f 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -8,7 +8,7 @@ #import "git2.h" -#import "GTDiff.h" +@class GTDiffHunk; typedef enum : git_delta_t { GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, @@ -22,6 +22,8 @@ typedef enum : git_delta_t { GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffDeltaType; +typedef BOOL(^GTDiffDeltaHunkProcessingBlock)(GTDiffHunk *hunk); + @class GTDiffFile; @interface GTDiffDelta : NSObject @@ -29,12 +31,13 @@ typedef enum : git_delta_t { @property (nonatomic, readonly) git_diff_delta *git_diff_delta; @property (nonatomic, readonly) git_diff_patch *git_diff_patch; -@property (nonatomic, readonly, strong) NSArray *hunks; @property (nonatomic, readonly, getter = isBinary) BOOL binary; @property (nonatomic, readonly, strong) GTDiffFile *oldFile; @property (nonatomic, readonly, strong) GTDiffFile *newFile; @property (nonatomic, readonly) GTDiffDeltaType status; +@property (nonatomic, readonly) NSUInteger hunkCount; - (instancetype)initWithGitPatch:(git_diff_patch *)patch; +- (void)enumerateHunksWithBlock:(GTDiffDeltaHunkProcessingBlock)block; @end From 17825796db119d290ae92d28c2c309574ee8be3a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:41:51 +0000 Subject: [PATCH 027/157] Implement basic lifecycle of GTDiffDelta. --- Classes/GTDiffDelta.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 6f1a29838..72931965b 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -10,4 +10,18 @@ @implementation GTDiffDelta +- (instancetype)initWithGitPatch:(git_diff_patch *)patch { + self = [super init]; + if (self == nil) return nil; + + _git_diff_patch = patch; + + return self; +} + +- (void)dealloc +{ + git_diff_patch_free(self.git_diff_patch); +} + @end From 18af33f391141e77351bf0ce0cf6b1ce6dc65e2a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:41:59 +0000 Subject: [PATCH 028/157] Implement git_diff_delta. --- Classes/GTDiffDelta.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 72931965b..46a18142b 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -24,4 +24,10 @@ - (void)dealloc git_diff_patch_free(self.git_diff_patch); } +#pragma mark - Properties + +- (git_diff_delta *)git_diff_delta { + return (git_diff_delta *)git_diff_patch_delta(self.git_diff_patch); +} + @end From 90b04c182cb09824227de55bad418f6fee21ec23 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 16:54:58 +0000 Subject: [PATCH 029/157] Diff file initialisation API. --- Classes/GTDiffFile.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index 56fda377d..a5f7448a8 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -15,4 +15,6 @@ @property (nonatomic, readonly, strong) NSString *path; @property (nonatomic, readonly) NSUInteger size; +- (instancetype)initWithGitDiffFile:(git_diff_file *)file; + @end From eccc58c7f311949499c465ae9236d255e7056f89 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:02:49 +0000 Subject: [PATCH 030/157] isBinary implementation. --- Classes/GTDiffDelta.m | 4 ++++ Classes/GTDiffFile.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 46a18142b..d1d93c3d1 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -30,4 +30,8 @@ - (git_diff_delta *)git_diff_delta { return (git_diff_delta *)git_diff_patch_delta(self.git_diff_patch); } +- (BOOL)isBinary { + return (BOOL)self.git_diff_delta->binary; +} + @end diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index a5f7448a8..e65183b92 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -10,11 +10,11 @@ @interface GTDiffFile : NSObject -@property (nonatomic, readonly) git_diff_file *git_diff_file; +@property (nonatomic, readonly) git_diff_file git_diff_file; @property (nonatomic, readonly, strong) NSString *path; @property (nonatomic, readonly) NSUInteger size; -- (instancetype)initWithGitDiffFile:(git_diff_file *)file; +- (instancetype)initWithGitDiffFile:(git_diff_file)file; @end From 5c743f5cfcf8273fcb44de2983cb180226e43c66 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:03:06 +0000 Subject: [PATCH 031/157] old and new file implementation. --- Classes/GTDiffDelta.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index d1d93c3d1..6a7dddc4d 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -8,6 +8,7 @@ #import "GTDiffDelta.h" +#import "GTDiffFile.h" @implementation GTDiffDelta - (instancetype)initWithGitPatch:(git_diff_patch *)patch { @@ -34,4 +35,12 @@ - (BOOL)isBinary { return (BOOL)self.git_diff_delta->binary; } +- (GTDiffFile *)oldFile { + return [[GTDiffFile alloc] initWithGitDiffFile:self.git_diff_delta->old_file]; +} + +- (GTDiffFile *)newFile { + return [[GTDiffFile alloc] initWithGitDiffFile:self.git_diff_delta->new_file]; +} + @end From e35e59b0c06df537581c70719883f4464a0af42d Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:03:18 +0000 Subject: [PATCH 032/157] Status implementaiton. --- Classes/GTDiffDelta.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 6a7dddc4d..30c8a7cf8 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -43,4 +43,8 @@ - (GTDiffFile *)newFile { return [[GTDiffFile alloc] initWithGitDiffFile:self.git_diff_delta->new_file]; } +- (GTDiffDeltaType)status { + return (GTDiffDeltaType)self.git_diff_delta->status; +} + @end From 75cad03b4c474484a1c259807aaa113dbcff0823 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:03:28 +0000 Subject: [PATCH 033/157] hunkCount implementation. --- Classes/GTDiffDelta.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 30c8a7cf8..f6cec6a43 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -47,4 +47,8 @@ - (GTDiffDeltaType)status { return (GTDiffDeltaType)self.git_diff_delta->status; } +- (NSUInteger)hunkCount { + return git_diff_patch_num_hunks(self.git_diff_patch); +} + @end From 27d91e869bccc3c4e4f26a6e9aa07de2b8a42769 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:07:01 +0000 Subject: [PATCH 034/157] Return hunks as an array. I 180d. As hunks are actually pretty lightweight in my implementation so far, it makes sense to create them all in one go and hand them off to the user. --- Classes/GTDiffDelta.h | 2 +- Classes/GTDiffDelta.m | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 08bd75e3f..9da8a7e45 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -36,8 +36,8 @@ typedef BOOL(^GTDiffDeltaHunkProcessingBlock)(GTDiffHunk *hunk); @property (nonatomic, readonly, strong) GTDiffFile *newFile; @property (nonatomic, readonly) GTDiffDeltaType status; @property (nonatomic, readonly) NSUInteger hunkCount; +@property (nonatomic, readonly, strong) NSArray *hunks; - (instancetype)initWithGitPatch:(git_diff_patch *)patch; -- (void)enumerateHunksWithBlock:(GTDiffDeltaHunkProcessingBlock)block; @end diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index f6cec6a43..d969ffb19 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -9,8 +9,12 @@ #import "GTDiffDelta.h" #import "GTDiffFile.h" +#import "GTDiffHunk.h" + @implementation GTDiffDelta +@synthesize hunks = _hunks; + - (instancetype)initWithGitPatch:(git_diff_patch *)patch { self = [super init]; if (self == nil) return nil; @@ -51,4 +55,19 @@ - (NSUInteger)hunkCount { return git_diff_patch_num_hunks(self.git_diff_patch); } +- (NSArray *)hunks { + NSUInteger hunkCount = self.hunkCount; + if (_hunks == nil) { + NSMutableArray *newHunksArray = [NSMutableArray arrayWithCapacity:hunkCount]; + for (NSUInteger idx = 0; idx < self.hunkCount; idx ++) { + GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithPatch:self.git_diff_patch hunkIndex:idx]; + if (hunk != nil) [newHunksArray addObject:hunk]; + } + + _hunks = [NSArray arrayWithArray:newHunksArray]; + } + + return _hunks; +} + @end From be3b54dae8b6dd31e65c9c5e8a304af45fa9c5e7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:07:38 +0000 Subject: [PATCH 035/157] Whitespace --; --- Classes/GTDiffHunk.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 8da9113a5..725e0cd8c 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -24,7 +24,6 @@ typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger o @property (nonatomic, readonly) NSUInteger lineCount; - (id)initWithPatch:(git_diff_patch *)patch hunkIndex:(size_t)hunkIndex; - - (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; @end From 8ed3942356f1387f8078aefd75d0ad8c365aeed7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:35:19 +0000 Subject: [PATCH 036/157] Initialise a hunk with a delta and hunk number. No need to carry the patch itself unnecessarily. That will just lead to memory headaches. --- Classes/GTDiffHunk.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 725e0cd8c..31417175d 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -8,6 +8,8 @@ #import "git2.h" +@class GTDiffDelta; + typedef enum : git_diff_line_t { GTDiffHunkLineOriginContext = GIT_DIFF_LINE_CONTEXT, GTDiffHunkLineOriginAddition = GIT_DIFF_LINE_ADDITION, @@ -23,7 +25,7 @@ typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger o @property (nonatomic, readonly, strong) NSString *header; @property (nonatomic, readonly) NSUInteger lineCount; -- (id)initWithPatch:(git_diff_patch *)patch hunkIndex:(size_t)hunkIndex; +- (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkIndex; - (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; @end From d849daf85e0eb0deab7e245d1fd6d60847a8212b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:35:39 +0000 Subject: [PATCH 037/157] Hunk initialisation. --- Classes/GTDiffHunk.m | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index d7fcc9d5d..ee5131ef8 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -8,6 +8,34 @@ #import "GTDiffHunk.h" +#import "GTDiffDelta.h" + +@interface GTDiffHunk () + +@property (nonatomic, unsafe_unretained, readonly) GTDiffDelta *delta; //No weak support in this deployment target? Boo! +@property (nonatomic, readonly) NSUInteger hunkIndex; + +@end + @implementation GTDiffHunk +- (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkIndex { + self = [super init]; + if (self == nil) return nil; + + _delta = delta; + _hunkIndex = hunkIndex; + + const char *headerCString; + size_t headerLength; + size_t lineCount; + int result = git_diff_patch_get_hunk(NULL, &headerCString, &headerLength, &lineCount, delta.git_diff_patch, hunkIndex); + if (result != GIT_OK) return nil; + + _header = [NSString stringWithCharacters:(const unichar *)headerCString length:headerLength]; + _lineCount = lineCount; + + return self; +} + @end From c4fffb43b0868b048d0a0f74ef36214f49a0f43e Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 17:35:52 +0000 Subject: [PATCH 038/157] Hunk enumeration. --- Classes/GTDiffHunk.m | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index ee5131ef8..dd7e043f0 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -38,4 +38,19 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd return self; } +- (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block { + for (NSUInteger idx = 0; idx < self.lineCount; idx ++) { + char lineOrigin; + const char *content; + size_t contentLength; + int oldLineNumber; + int newLineNumber; + int result = git_diff_patch_get_line_in_hunk(&lineOrigin, &content, &contentLength, &oldLineNumber, &newLineNumber, self.delta.git_diff_patch, self.hunkIndex, idx); + if (result != GIT_OK) continue; + + NSString *lineString = [NSString stringWithCharacters:(const unichar *)content length:contentLength]; + if (!block(lineString, (NSUInteger)oldLineNumber, (NSUInteger)newLineNumber, lineOrigin)) return; + } +} + @end From aff2911c346c8f56b4c215d85abe236b734443de Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 18:13:38 +0000 Subject: [PATCH 039/157] =?UTF-8?q?Move=20the=20libgit2=20pointer=20back?= =?UTF-8?q?=20to=20where=20it=20currently=20is=E2=80=A6=C2=A0no=20idea=20w?= =?UTF-8?q?hy=20that=20changed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libgit2 b/libgit2 index 83885891f..693021262 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit 83885891f583ab447f98f1c7a637f1f507e1be22 +Subproject commit 693021262ba0eeac2923bbce1b2262717019c807 From 1d13af1737712fabb03bcaa6558e51f9f7cb4738 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 18:18:28 +0000 Subject: [PATCH 040/157] Update signatures of difflist initialisers. --- Classes/GTDiff.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 609248894..e5e7e4ab1 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -22,7 +22,7 @@ @implementation GTDiff + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(repository.git_repository, nil, oldTree.git_tree, newTree.git_tree, &diffList); + int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, NULL); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -31,7 +31,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(repository.git_repository, nil, oldTree.git_tree, &diffList); + int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, oldTree.git_tree, NULL, NULL); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -40,7 +40,7 @@ + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)r + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options { git_diff_list *diffList; - int returnValue = git_diff_workdir_to_index(repository.git_repository, nil, &diffList); + int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, NULL); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -49,7 +49,7 @@ + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(repository.git_repository, nil, tree.git_tree, &diffList); + int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; From 970f80b45cd80f19536b010beb1abc5aa8506afe Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 18:18:39 +0000 Subject: [PATCH 041/157] Correctly initialise hunks. --- Classes/GTDiffDelta.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index d969ffb19..249b824eb 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -60,7 +60,7 @@ - (NSArray *)hunks { if (_hunks == nil) { NSMutableArray *newHunksArray = [NSMutableArray arrayWithCapacity:hunkCount]; for (NSUInteger idx = 0; idx < self.hunkCount; idx ++) { - GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithPatch:self.git_diff_patch hunkIndex:idx]; + GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithDelta:self hunkIndex:idx]; if (hunk != nil) [newHunksArray addObject:hunk]; } From 90d73a206a9168597bef977a72e31aadd5a08148 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 18:30:31 +0000 Subject: [PATCH 042/157] Implement GTDiffFile as a simple state object. --- Classes/GTDiffFile.h | 14 ++++++++++++-- Classes/GTDiffFile.m | 12 ++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index e65183b92..798d208f6 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -8,12 +8,22 @@ #import "git2.h" -@interface GTDiffFile : NSObject +typedef enum : git_diff_file_flag_t { + GTDiffFileFlagValidOID = GIT_DIFF_FILE_VALID_OID, + GTDiffFileFlagFreePath = GIT_DIFF_FILE_FREE_PATH, + GTDiffFileFlagBinary = GIT_DIFF_FILE_BINARY, + GTDiffFileFlagNotBinary = GIT_DIFF_FILE_NOT_BINARY, + GTDiffFileFlagFreeData = GIT_DIFF_FILE_FREE_DATA, + GTDiffFileFlagUnmapData = GIT_DIFF_FILE_UNMAP_DATA, + GTDiffFileFlagNoData = GIT_DIFF_FILE_NO_DATA, +} GTDiffFileFlag; -@property (nonatomic, readonly) git_diff_file git_diff_file; +@interface GTDiffFile : NSObject @property (nonatomic, readonly, strong) NSString *path; @property (nonatomic, readonly) NSUInteger size; +@property (nonatomic, readonly) NSUInteger flags; +@property (nonatomic, readonly) NSUInteger mode; - (instancetype)initWithGitDiffFile:(git_diff_file)file; diff --git a/Classes/GTDiffFile.m b/Classes/GTDiffFile.m index 88230f34b..5ef4b764a 100644 --- a/Classes/GTDiffFile.m +++ b/Classes/GTDiffFile.m @@ -10,4 +10,16 @@ @implementation GTDiffFile +- (instancetype)initWithGitDiffFile:(git_diff_file)file { + self = [super init]; + if (self == nil) return nil; + + _size = (NSUInteger)file.size; + _flags = file.flags; + _mode = file.mode; + _path = [NSString stringWithUTF8String:file.path]; + + return self; +} + @end From 83a114d716e7ce81c155af03e327cb74112b7ca4 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 18:44:42 +0000 Subject: [PATCH 043/157] Move back to enumerating over the deltas. Turns out the patches are stored in memory so we probably shouldn't keep them around for longer than we really need to. --- Classes/GTDiff.h | 5 ++++- Classes/GTDiff.m | 24 +++++++----------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 6032ccf6f..6cea399da 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -10,14 +10,16 @@ #import "GTDiffDelta.h" +@class GTDiffDelta; @class GTRepository; @class GTTree; +typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); + @interface GTDiff : NSObject @property (nonatomic, readonly) git_diff_list *git_diff_list; @property (nonatomic, readonly) NSUInteger deltaCount; -@property (nonatomic, readonly, strong) NSArray *deltas; //TODO: Need to settle on a method for sending in the options struct @@ -28,5 +30,6 @@ - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; +- (void)enumerateDeltasWithBlock:(GTDiffDeltaProcessingBlock)block; @end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index e5e7e4ab1..125717141 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -12,12 +12,6 @@ #import "GTRepository.h" #import "GTTree.h" -@interface GTDiff () - -@property (nonatomic, strong) NSMutableArray *deltasInternalArray; - -@end - @implementation GTDiff + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { @@ -72,18 +66,14 @@ - (void)dealloc #pragma mark - Properties -- (NSArray *)deltas { - if (self.deltasInternalArray != nil) { - for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { - git_diff_patch *patch; - int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); - if (result != GIT_OK) continue; - GTDiffDelta *delta = [[GTDiffDelta alloc] initWithGitPatch:patch]; - if (delta != nil) [self.deltasInternalArray addObject:delta]; - } +- (void)enumerateDeltasWithBlock:(GTDiffDeltaProcessingBlock)block { + for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { + git_diff_patch *patch; + int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); + if (result != GIT_OK) continue; + GTDiffDelta *delta = [[GTDiffDelta alloc] initWithGitPatch:patch]; + if (!block(delta)) return; } - - return [NSArray arrayWithArray:self.deltasInternalArray]; } - (NSUInteger)deltaCount { From b863826b882da8b9648e4073fb7fface33fcee4c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:30:10 +0000 Subject: [PATCH 044/157] Change options to a dictionary. --- Classes/GTDiff.h | 8 ++++---- Classes/GTDiff.m | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 6cea399da..e3c55bb8a 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -23,10 +23,10 @@ typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); //TODO: Need to settle on a method for sending in the options struct -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; -+ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; -+ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options; -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options; ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 125717141..0147c8336 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -14,7 +14,7 @@ @implementation GTDiff -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, NULL); if (returnValue != GIT_OK) return nil; @@ -23,7 +23,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos return newDiff; } -+ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { ++ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_list *diffList; int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, oldTree.git_tree, NULL, NULL); if (returnValue != GIT_OK) return nil; @@ -32,7 +32,7 @@ + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)r return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSUInteger)options { ++ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_list *diffList; int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, NULL); if (returnValue != GIT_OK) return nil; @@ -41,7 +41,7 @@ + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSUInteger)options { ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_list *diffList; int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL); if (returnValue != GIT_OK) return nil; From e27e129a8aaa9b05ecccb40bcca285e570c0b044 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:30:22 +0000 Subject: [PATCH 045/157] Declare options consts. --- Classes/GTDiff.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index e3c55bb8a..d9da84c8d 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -14,6 +14,13 @@ @class GTRepository; @class GTTree; +extern NSString *const GTDiffOptionsFlagsKey; +extern NSString *const GTDiffOptionsContextLinesKey; +extern NSString *const GTDiffOptionsInterHunkLinesKey; +extern NSString *const GTDiffOptionsOldPrefixKey; +extern NSString *const GTDiffOptionsNewPrefixKey; +extern NSString *const GTDiffOptionsMaxSizeKey; + typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); @interface GTDiff : NSObject From d4d2750bbca1298b62110bb079aec02d79fc216b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:30:32 +0000 Subject: [PATCH 046/157] Declare options flags enum. --- Classes/GTDiff.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index d9da84c8d..f695dec28 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -21,6 +21,28 @@ extern NSString *const GTDiffOptionsOldPrefixKey; extern NSString *const GTDiffOptionsNewPrefixKey; extern NSString *const GTDiffOptionsMaxSizeKey; +typedef enum : git_diff_option_t { + GTDiffOptionsFlagsNormal = GIT_DIFF_NORMAL, + GTDiffOptionsFlagsReverse = GIT_DIFF_REVERSE, + GTDiffOptionsFlagsForceText = GIT_DIFF_FORCE_TEXT, + GTDiffOptionsFlagsIgnoreWhitespace = GIT_DIFF_IGNORE_WHITESPACE, + GTDiffOptionsFlagsIgnoreWhitespaceChange = GIT_DIFF_IGNORE_WHITESPACE_CHANGE, + GTDiffOptionsFlagsIgnoreWhitespaceEOL = GIT_DIFF_IGNORE_WHITESPACE_EOL, + GTDiffOptionsFlagsIgnoreSubmodules = GIT_DIFF_IGNORE_SUBMODULES, + GTDiffOptionsFlagsPatience = GIT_DIFF_PATIENCE, + GTDiffOptionsFlagsIncludeIgnored = GIT_DIFF_INCLUDE_IGNORED, + GTDiffOptionsFlagsIncludeUntracked = GIT_DIFF_INCLUDE_UNTRACKED, + GTDiffOptionsFlagsIncludeUnmodified = GIT_DIFF_INCLUDE_UNMODIFIED, + GTDiffOptionsFlagsRecurseUntrackedDirs = GIT_DIFF_RECURSE_UNTRACKED_DIRS, + GTDiffOptionsFlagsDisablePathspecMatch = GIT_DIFF_DISABLE_PATHSPEC_MATCH, + GTDiffOptionsFlagsDeltasAreICase = GIT_DIFF_DELTAS_ARE_ICASE, + GTDiffOptionsFlagsIncludeUntrackedContent = GIT_DIFF_INCLUDE_UNTRACKED_CONTENT, + GTDiffOptionsFlagsSkipBinaryCheck = GIT_DIFF_SKIP_BINARY_CHECK, + GTDiffOptionsFlagsIncludeTypeChange = GIT_DIFF_INCLUDE_TYPECHANGE, + GTDiffOptionsFlagsIncludeTypeChangeTrees = GIT_DIFF_INCLUDE_TYPECHANGE_TREES, + GTDiffOptionsFlagsIgnoreFileMode = GIT_DIFF_IGNORE_FILEMODE, +} GTDiffOptionsFlags; + typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); @interface GTDiff : NSObject From d20ea18fbf3c3f50f54bc17c473a5c799982c286 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:44:06 +0000 Subject: [PATCH 047/157] Implement the options consts. --- Classes/GTDiff.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 0147c8336..a11f99e9d 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -12,6 +12,13 @@ #import "GTRepository.h" #import "GTTree.h" +NSString *const GTDiffOptionsFlagsKey = @"GTDiffOptionsFlagsKey"; +NSString *const GTDiffOptionsContextLinesKey = @"GTDiffOptionsContextLinesKey"; +NSString *const GTDiffOptionsInterHunkLinesKey = @"GTDiffOptionsInterHunkLinesKey"; +NSString *const GTDiffOptionsOldPrefixKey = @"GTDiffOptionsOldPrefixKey"; +NSString *const GTDiffOptionsNewPrefixKey = @"GTDiffOptionsNewPrefixKey"; +NSString *const GTDiffOptionsMaxSizeKey = @"GTDiffOptionsMaxSizeKey"; + @implementation GTDiff + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { From 94d6ccf4ce46b75edfefd6240c5df0f23bfc97c2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:52:56 +0000 Subject: [PATCH 048/157] Implement the building of an options struct. --- Classes/GTDiff.m | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index a11f99e9d..ddadafbef 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -21,6 +21,30 @@ @implementation GTDiff ++ (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { + git_diff_options newOptions; + + NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; + if (flagsNumber != nil) newOptions.flags = (uint32)flagsNumber.unsignedIntegerValue; + + NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; + if (contextLinesNumber != nil) newOptions.context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; + + NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; + if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + + NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; + if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; + + NSString *newPrefix = dictionary[GTDiffOptionsNewPrefixKey]; + if (newPrefix != nil) newOptions.new_prefix = (char *)newPrefix.UTF8String; + + NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; + if (maxSizeNumber != nil) newOptions.max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + + return newOptions; +} + + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, NULL); From 79a361f46ee29f7e98e580c5fb0f32159858219b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:55:01 +0000 Subject: [PATCH 049/157] Return NULL if given a nil dictionary. A NULL options struct uses the defaults, which is the exact behaviour which we are after in this case. --- Classes/GTDiff.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index ddadafbef..985031403 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -22,6 +22,8 @@ @implementation GTDiff + (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { + if (dictionary == nil) return NULL; + git_diff_options newOptions; NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; From 5833ebdee0bb1dc069568ffc07459a990dbf28d7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 19:59:17 +0000 Subject: [PATCH 050/157] Lol pointers. --- Classes/GTDiff.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 985031403..8d41545db 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -21,28 +21,28 @@ @implementation GTDiff -+ (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { ++ (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { if (dictionary == nil) return NULL; - git_diff_options newOptions; + git_diff_options *newOptions = malloc(sizeof(git_diff_options)); NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; - if (flagsNumber != nil) newOptions.flags = (uint32)flagsNumber.unsignedIntegerValue; + if (flagsNumber != nil) newOptions->flags = (uint32)flagsNumber.unsignedIntegerValue; NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; - if (contextLinesNumber != nil) newOptions.context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; + if (contextLinesNumber != nil) newOptions->context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; - if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + if (interHunkLinesNumber != nil) newOptions->interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; - if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; + if (oldPrefix != nil) newOptions->old_prefix = (char *)oldPrefix.UTF8String; NSString *newPrefix = dictionary[GTDiffOptionsNewPrefixKey]; - if (newPrefix != nil) newOptions.new_prefix = (char *)newPrefix.UTF8String; + if (newPrefix != nil) newOptions->new_prefix = (char *)newPrefix.UTF8String; NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; - if (maxSizeNumber != nil) newOptions.max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + if (maxSizeNumber != nil) newOptions->max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; return newOptions; } From 60e49e97d31db7902a4386043a7a444dff018609 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Fri, 30 Nov 2012 20:01:55 +0000 Subject: [PATCH 051/157] Pass the created options struct into our diff creation. --- Classes/GTDiff.m | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 8d41545db..747f93670 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -48,8 +48,10 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { } + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, NULL); + int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -57,8 +59,10 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos } + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, oldTree.git_tree, NULL, NULL); + int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, oldTree.git_tree, NULL, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -66,8 +70,10 @@ + (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)r } + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, NULL); + int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -75,8 +81,10 @@ + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository } + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL); + int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, optionsStruct); + free(optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; From 3cfd2e84c1553f9c4f42b1a9797775a709cf2f77 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 3 Dec 2012 19:48:10 +0000 Subject: [PATCH 052/157] More cocoa-y block usage in GTDiff. --- Classes/GTDiff.h | 4 +--- Classes/GTDiff.m | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index f695dec28..a06fede5f 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -43,8 +43,6 @@ typedef enum : git_diff_option_t { GTDiffOptionsFlagsIgnoreFileMode = GIT_DIFF_IGNORE_FILEMODE, } GTDiffOptionsFlags; -typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); - @interface GTDiff : NSObject @property (nonatomic, readonly) git_diff_list *git_diff_list; @@ -59,6 +57,6 @@ typedef BOOL(^GTDiffDeltaProcessingBlock)(GTDiffDelta *delta); - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; -- (void)enumerateDeltasWithBlock:(GTDiffDeltaProcessingBlock)block; +- (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block; @end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 747f93670..431f58684 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -107,7 +107,7 @@ - (void)dealloc #pragma mark - Properties -- (void)enumerateDeltasWithBlock:(GTDiffDeltaProcessingBlock)block { +- (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block { for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { git_diff_patch *patch; int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); From a9be4830a036040851d3909c53142c5415ce09c5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:32:27 +0000 Subject: [PATCH 053/157] OldTree -> Tree --- Classes/GTDiff.h | 2 +- Classes/GTDiff.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index a06fede5f..2a66e870b 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -51,7 +51,7 @@ typedef enum : git_diff_option_t { //TODO: Need to settle on a method for sending in the options struct + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffIndexToTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 431f58684..6c46bb5a7 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -58,10 +58,10 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos return newDiff; } -+ (GTDiff *)diffIndexToOldTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffIndexToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, oldTree.git_tree, NULL, optionsStruct); + int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL, optionsStruct); free(optionsStruct); if (returnValue != GIT_OK) return nil; From b2c681a4f5bd62215b46768e29909534704f4a97 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:33:52 +0000 Subject: [PATCH 054/157] ForRepository -> InRepository --- Classes/GTDiff.h | 8 ++++---- Classes/GTDiff.m | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 2a66e870b..e8cf0171b 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -50,10 +50,10 @@ typedef enum : git_diff_option_t { //TODO: Need to settle on a method for sending in the options struct -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffIndexToTree:(GTTree *)oldTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffIndexToTree:(GTTree *)oldTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 6c46bb5a7..d5741fd0f 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -47,7 +47,7 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { return newOptions; } -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); @@ -58,7 +58,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree forRepos return newDiff; } -+ (GTDiff *)diffIndexToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffIndexToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL, optionsStruct); @@ -69,7 +69,7 @@ + (GTDiff *)diffIndexToTree:(GTTree *)tree forRepository:(GTRepository *)reposit return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, optionsStruct); @@ -80,7 +80,7 @@ + (GTDiff *)diffWorkingDirectoryToIndexForRepository:(GTRepository *)repository return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree forRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, optionsStruct); From 4b3f1d2365bcc5787f7079ceb73557b7353584fc Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:34:44 +0000 Subject: [PATCH 055/157] uint32 -> uint32_t --- Classes/GTDiff.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index d5741fd0f..7bb146c52 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -27,7 +27,7 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { git_diff_options *newOptions = malloc(sizeof(git_diff_options)); NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; - if (flagsNumber != nil) newOptions->flags = (uint32)flagsNumber.unsignedIntegerValue; + if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; if (contextLinesNumber != nil) newOptions->context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; From 4af300b1a443da3c33d2c98057797862a959fd57 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:38:01 +0000 Subject: [PATCH 056/157] Style fix for braces. --- Classes/GTDiff.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 7bb146c52..f540d23f2 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -100,8 +100,7 @@ - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { return self; } -- (void)dealloc -{ +- (void)dealloc { git_diff_list_free(self.git_diff_list); } From c55ac1dd2159e148f9fb71e66f453c9926d7c540 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:39:55 +0000 Subject: [PATCH 057/157] Assert we aren't initing with a difflist. --- Classes/GTDiff.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index f540d23f2..aa9f43ab8 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -92,6 +92,8 @@ + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree inRepository:(GTRepository } - (instancetype)initWithGitDiffList:(git_diff_list *)diffList { + NSParameterAssert(diffList != NULL); + self = [super init]; if (self == nil) return nil; From 4bd0fafc98d8d4402f91317906d9d4e953b84ec9 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:40:28 +0000 Subject: [PATCH 058/157] Remove unused block typedef. --- Classes/GTDiffDelta.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 9da8a7e45..716e492df 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -22,8 +22,6 @@ typedef enum : git_delta_t { GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffDeltaType; -typedef BOOL(^GTDiffDeltaHunkProcessingBlock)(GTDiffHunk *hunk); - @class GTDiffFile; @interface GTDiffDelta : NSObject From f4dc11028a5429a199cd0e892e1773297311d5ce Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:42:27 +0000 Subject: [PATCH 059/157] Assert that we don't initialise a delta with a NULL patch. --- Classes/GTDiffDelta.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 249b824eb..6fec551b1 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -16,6 +16,8 @@ @implementation GTDiffDelta @synthesize hunks = _hunks; - (instancetype)initWithGitPatch:(git_diff_patch *)patch { + NSParameterAssert(patch != NULL); + self = [super init]; if (self == nil) return nil; From fe888e3e86d915badf609f981ac3baae5204f67c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:52:41 +0000 Subject: [PATCH 060/157] Brace style fix. --- Classes/GTDiffDelta.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 6fec551b1..797a26679 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -26,8 +26,7 @@ - (instancetype)initWithGitPatch:(git_diff_patch *)patch { return self; } -- (void)dealloc -{ +- (void)dealloc { git_diff_patch_free(self.git_diff_patch); } From 11a2650139f308300459108bddf873c6cd708076 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 14:53:04 +0000 Subject: [PATCH 061/157] Copy hunks. --- Classes/GTDiffDelta.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 797a26679..ce18ce5cf 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -65,7 +65,7 @@ - (NSArray *)hunks { if (hunk != nil) [newHunksArray addObject:hunk]; } - _hunks = [NSArray arrayWithArray:newHunksArray]; + _hunks = [newHunksArray copy]; } return _hunks; From 64662f59abeab4d5a0569d987b4341e2d9a9b14f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 15:00:17 +0000 Subject: [PATCH 062/157] Cocoa-y blocks in GTDiffHunk. --- Classes/GTDiffHunk.h | 4 +--- Classes/GTDiffHunk.m | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 31417175d..b0c7f0452 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -18,14 +18,12 @@ typedef enum : git_diff_line_t { GTDiffHunkLineOriginDeleteEOFNewLine = GIT_DIFF_LINE_DEL_EOFNL, } GTDiffHunkLineOrigin; -typedef BOOL(^GTDiffHunkLineProcessingBlock)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin); - @interface GTDiffHunk : NSObject @property (nonatomic, readonly, strong) NSString *header; @property (nonatomic, readonly) NSUInteger lineCount; - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkIndex; -- (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block; +- (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin))block; @end diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index dd7e043f0..4c8a2f2ae 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -38,7 +38,7 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd return self; } -- (void)enumerateLinesInHunkWithBlock:(GTDiffHunkLineProcessingBlock)block { +- (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin))block { for (NSUInteger idx = 0; idx < self.lineCount; idx ++) { char lineOrigin; const char *content; From 3588a67e33f509be16e7a549a41822246aa1ed9c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 15:35:00 +0000 Subject: [PATCH 063/157] Use initWithBytes:length:encoding over withCharacters. --- Classes/GTDiffHunk.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index 4c8a2f2ae..cb896cca4 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -32,7 +32,7 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd int result = git_diff_patch_get_hunk(NULL, &headerCString, &headerLength, &lineCount, delta.git_diff_patch, hunkIndex); if (result != GIT_OK) return nil; - _header = [NSString stringWithCharacters:(const unichar *)headerCString length:headerLength]; + _header = [[NSString alloc] initWithBytes:headerCString length:headerLength encoding:NSUTF8StringEncoding]; _lineCount = lineCount; return self; @@ -48,7 +48,7 @@ - (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUIntege int result = git_diff_patch_get_line_in_hunk(&lineOrigin, &content, &contentLength, &oldLineNumber, &newLineNumber, self.delta.git_diff_patch, self.hunkIndex, idx); if (result != GIT_OK) continue; - NSString *lineString = [NSString stringWithCharacters:(const unichar *)content length:contentLength]; + NSString *lineString = [[NSString alloc] initWithBytes:content length:contentLength encoding:NSUTF8StringEncoding]; if (!block(lineString, (NSUInteger)oldLineNumber, (NSUInteger)newLineNumber, lineOrigin)) return; } } From e31a8b451b7f7d52d1fadff9785569f70db252b5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:20:14 +0000 Subject: [PATCH 064/157] We don't need to demand repositories from the user. We can retrieve them from any trees they pass in. --- Classes/GTDiff.h | 6 +++--- Classes/GTDiff.m | 14 ++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index e8cf0171b..0af880606 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -50,10 +50,10 @@ typedef enum : git_diff_option_t { //TODO: Need to settle on a method for sending in the options struct -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffIndexToTree:(GTTree *)oldTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options; ++ (GTDiff *)diffIndexToTree:(GTTree *)oldTree withOptions:(NSDictionary *)options; + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSDictionary *)options; - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index aa9f43ab8..04f387d97 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -47,10 +47,12 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { return newOptions; } -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options { + NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); + git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(&diffList, repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); + int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); free(optionsStruct); if (returnValue != GIT_OK) return nil; @@ -58,10 +60,10 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree inReposi return newDiff; } -+ (GTDiff *)diffIndexToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffIndexToTree:(GTTree *)tree withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, repository.git_repository, tree.git_tree, NULL, optionsStruct); + int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, optionsStruct); free(optionsStruct); if (returnValue != GIT_OK) return nil; @@ -80,10 +82,10 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository w return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree inRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(&diffList, repository.git_repository, tree.git_tree, optionsStruct); + int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, optionsStruct); free(optionsStruct); if (returnValue != GIT_OK) return nil; From e1fd8f941ee8866fd833b54904f432c7ab93dc17 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:53:40 +0000 Subject: [PATCH 065/157] Document options consts. --- Classes/GTDiff.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 0af880606..d39586d77 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -14,11 +14,36 @@ @class GTRepository; @class GTTree; +// An `NSNumber` wrapped `GTDiffOptionsFlags` representing any flags you wish to +// pass into the initialisation. extern NSString *const GTDiffOptionsFlagsKey; + +// An `NSNumber` wrapped `NSUInteger` dictating how many context lines above and +// below each individual hunk. +// +// Defaults to 3. extern NSString *const GTDiffOptionsContextLinesKey; + +// An `NSNumber` wrapped `NSUInteger` dictating the minimum number of lines +// between diff hunks to merge them into one hunk. +// +// Defaults to 0. extern NSString *const GTDiffOptionsInterHunkLinesKey; + +// An `NSString` to prefix old file names with. +// +// Defaults to "a". extern NSString *const GTDiffOptionsOldPrefixKey; + +// An `NSString` to prefix new file names with. +// +// Defaults to "b". extern NSString *const GTDiffOptionsNewPrefixKey; + +// An `NSNumber` wrapped `NSUInteger` determining the maximum size (in bytes) +// of a file to diff. Above this size the file will be treated as binary. +// +// Defaults to 512Mb. extern NSString *const GTDiffOptionsMaxSizeKey; typedef enum : git_diff_option_t { From 8ee8f8aa09805d4fed74059c4163dc5ea33b4255 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:53:53 +0000 Subject: [PATCH 066/157] Document flags enum. --- Classes/GTDiff.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index d39586d77..259cb125e 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -46,6 +46,10 @@ extern NSString *const GTDiffOptionsNewPrefixKey; // Defaults to 512Mb. extern NSString *const GTDiffOptionsMaxSizeKey; +// Enum for use as documented in the options dictionary with the +// `GTDiffOptionsFlagsKey` key. +// +// See diff.h for documentation of each individual flag. typedef enum : git_diff_option_t { GTDiffOptionsFlagsNormal = GIT_DIFF_NORMAL, GTDiffOptionsFlagsReverse = GIT_DIFF_REVERSE, From 08c439f1a194070368bfe79827abe2a87cf30dd3 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:03 +0000 Subject: [PATCH 067/157] Document GTDiff class. --- Classes/GTDiff.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 259cb125e..1c5d4d0b1 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -72,6 +72,10 @@ typedef enum : git_diff_option_t { GTDiffOptionsFlagsIgnoreFileMode = GIT_DIFF_IGNORE_FILEMODE, } GTDiffOptionsFlags; +// A class representing a single "diff". +// +// Analagous to `git_diff_list` in libgit2, this object represents a list of +// changes or "deltas", which are represented by `GTDiffDelta` objects. @interface GTDiff : NSObject @property (nonatomic, readonly) git_diff_list *git_diff_list; From 003836cdd8b75cc3744919e8d199ce49369de17b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:17 +0000 Subject: [PATCH 068/157] Document the git_diff_list property. --- Classes/GTDiff.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 1c5d4d0b1..70401d50d 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -78,6 +78,7 @@ typedef enum : git_diff_option_t { // changes or "deltas", which are represented by `GTDiffDelta` objects. @interface GTDiff : NSObject +// The libgit2 diff list object. @property (nonatomic, readonly) git_diff_list *git_diff_list; @property (nonatomic, readonly) NSUInteger deltaCount; From 260cb4af60b7ef439c0321b8896dad85e72eb8ad Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:28 +0000 Subject: [PATCH 069/157] Remove unnecesary to-do. --- Classes/GTDiff.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 70401d50d..363fecc60 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -82,7 +82,6 @@ typedef enum : git_diff_option_t { @property (nonatomic, readonly) git_diff_list *git_diff_list; @property (nonatomic, readonly) NSUInteger deltaCount; -//TODO: Need to settle on a method for sending in the options struct + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options; + (GTDiff *)diffIndexToTree:(GTTree *)oldTree withOptions:(NSDictionary *)options; From ff9a35ed5678f6d41440fcee8c7433767c52eb37 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:36 +0000 Subject: [PATCH 070/157] Document deltaCount. --- Classes/GTDiff.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 363fecc60..ccd152017 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -80,8 +80,9 @@ typedef enum : git_diff_option_t { // The libgit2 diff list object. @property (nonatomic, readonly) git_diff_list *git_diff_list; -@property (nonatomic, readonly) NSUInteger deltaCount; +// The number of deltas represented by the diff object. +@property (nonatomic, readonly) NSUInteger deltaCount; + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options; + (GTDiff *)diffIndexToTree:(GTTree *)oldTree withOptions:(NSDictionary *)options; From 09fa4756aaa984f08d62173ba6e2b17a494d7997 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:48 +0000 Subject: [PATCH 071/157] Document initialisers. --- Classes/GTDiff.h | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index ccd152017..00d9a9265 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -84,11 +84,46 @@ typedef enum : git_diff_option_t { // The number of deltas represented by the diff object. @property (nonatomic, readonly) NSUInteger deltaCount; +// Create a diff between 2 `GTTree`s. +// +// The 2 trees must be from the same repository, or an exception will be thrown. +// +// oldTree - The "left" side of the diff. +// newTree - The "right" side of the diff. +// options - A dictionary containing any of the above options key constants, or +// nil to use the defaults. +// +// Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options; -+ (GTDiff *)diffIndexToTree:(GTTree *)oldTree withOptions:(NSDictionary *)options; + +// Create a diff between a tree and it's repository's current index. +// +// tree - The tree to be diffed. +// options - A dictionary containing any of the above options key constants, or +// nil to use the defaults. +// +// Returns a newly created `GTDiff` object or nil on error. ++ (GTDiff *)diffIndexToTree:(GTTree *)tree withOptions:(NSDictionary *)options; + +// Create a diff between the working directory and index in a given repository. +// +// repository - The repository to be used for the diff. +// options - A dictionary containing any of the above options key constants, or +// nil to use the defaults. +// +// Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; + +// Create a diff between a tree and it's repository's working directory. +// +// tree - The tree to be diffed. +// options - A dictionary containing any of the above options key constants, or +// nil to use the defaults. +// +// Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSDictionary *)options; +// Designated initialiser. - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; - (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block; From d97733edde9c20b878da68d7ade159db0780a297 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:54:59 +0000 Subject: [PATCH 072/157] Document numberOfDeltasWithType. --- Classes/GTDiff.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 00d9a9265..54efd8cb4 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -125,6 +125,9 @@ typedef enum : git_diff_option_t { // Designated initialiser. - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; + +// The number of deltas represented by the diff object which are changes of a +// given type. - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; - (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block; From 6c975afca42897a4781242c875ff300f402c995e Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 16:55:13 +0000 Subject: [PATCH 073/157] Document enumerateDeltasUsingBlock. --- Classes/GTDiff.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 54efd8cb4..2dd3215e3 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -129,6 +129,16 @@ typedef enum : git_diff_option_t { // The number of deltas represented by the diff object which are changes of a // given type. - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; + +// Enumerate the deltas in a diff. +// +// It is worth noting that the `git_diff_patch` objects backing each delta +// contain the entire contents in memory. It is therefore recommend you +// do not store the `delta` object given here, but instead perform any work +// necessary within the provided block. +// +// block - A block to be executed for each delta, return NO from a block to +// immediately stop the enumeration. - (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block; @end From 5943df0a5bb622e43201ef4ae724a76c7b530bdc Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:25:24 +0000 Subject: [PATCH 074/157] Unsplit the 2 @class statements in GTDiffDelta. --- Classes/GTDiffDelta.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 716e492df..5deca8099 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -8,6 +8,7 @@ #import "git2.h" +@class GTDiffFile; @class GTDiffHunk; typedef enum : git_delta_t { @@ -22,8 +23,6 @@ typedef enum : git_delta_t { GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffDeltaType; -@class GTDiffFile; - @interface GTDiffDelta : NSObject @property (nonatomic, readonly) git_diff_delta *git_diff_delta; From 07c6b5b1e6008e5f5ed8b1706ff5218fcc2907bf Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:25:35 +0000 Subject: [PATCH 075/157] Document GTDiffDeltaType. --- Classes/GTDiffDelta.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 5deca8099..3a7cdcdf9 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -11,6 +11,18 @@ @class GTDiffFile; @class GTDiffHunk; +// The type of change that this delta represents. +// +// GTDiffFileDeltaUnmodified - No Change. +// GTDiffFileDeltaAdded - The file was added to the index. +// GTDiffFileDeltaDeleted - The file was removed from the working directory. +// GTDiffFileDeltaModified - The file was modified. +// GTDiffFileDeltaRenamed - The file has been renamed. +// GTDiffFileDeltaCopied - The file was duplicated. +// GTDiffFileDeltaIgnored - The file was ignored by git. +// GTDiffFileDeltaUntracked - The file has been added to the working directory +// and is therefore currently untracked. +// GTDiffFileDeltaTypeChange - LOL NO IDEA typedef enum : git_delta_t { GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, GTDiffFileDeltaAdded = GIT_DELTA_ADDED, From 7cb03c2573d065f3f921a46109e52321ab4d3a1b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:25:45 +0000 Subject: [PATCH 076/157] Document GTDiffDelta. --- Classes/GTDiffDelta.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 3a7cdcdf9..51da172e9 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -35,6 +35,11 @@ typedef enum : git_delta_t { GTDiffFileDeltaTypeChange = GIT_DELTA_TYPECHANGE, } GTDiffDeltaType; +// A class representing a single change within a diff. +// +// The change may not be simply a change of text within a given file, it could +// be that the file was renamed, or added to the index. See `GTDiffDeltaType` +// for the types of change represented. @interface GTDiffDelta : NSObject @property (nonatomic, readonly) git_diff_delta *git_diff_delta; From 6c9cd1294fba787daad9782cc018080a03d6e556 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:26:02 +0000 Subject: [PATCH 077/157] Document the delta's libgit2 properties. --- Classes/GTDiffDelta.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 51da172e9..de0a58caf 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -42,7 +42,11 @@ typedef enum : git_delta_t { // for the types of change represented. @interface GTDiffDelta : NSObject +// A convenience accessor to fetch the `git_diff_delta` represented by the +// object. @property (nonatomic, readonly) git_diff_delta *git_diff_delta; + +// The backing libgit2 `git_diff_patch` object. @property (nonatomic, readonly) git_diff_patch *git_diff_patch; @property (nonatomic, readonly, getter = isBinary) BOOL binary; From 6dffb7f2d3eeda1f976a9cf1fff3b1a07f21e1b2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:26:25 +0000 Subject: [PATCH 078/157] Document GTDiffData's basic state. --- Classes/GTDiffDelta.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index de0a58caf..3e5da383e 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -49,10 +49,21 @@ typedef enum : git_delta_t { // The backing libgit2 `git_diff_patch` object. @property (nonatomic, readonly) git_diff_patch *git_diff_patch; +// Whether the file(s) are to be treated as binary. @property (nonatomic, readonly, getter = isBinary) BOOL binary; + +// The file to the "left" of the diff. @property (nonatomic, readonly, strong) GTDiffFile *oldFile; + +// The file to the "right" of the diff. @property (nonatomic, readonly, strong) GTDiffFile *newFile; + +// The type of change that this delta represents. +// +// Think "status" as in `git status`. @property (nonatomic, readonly) GTDiffDeltaType status; + +// The number of hunks represented by this delta. @property (nonatomic, readonly) NSUInteger hunkCount; @property (nonatomic, readonly, strong) NSArray *hunks; From 8bb9a38ebbfdb168a3f26716aa480b71b3b897a0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:26:51 +0000 Subject: [PATCH 079/157] Document -hunks. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This includes a note about it's memory considerations… must find a better way to enforce that. --- Classes/GTDiffDelta.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 3e5da383e..d10c93fc6 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -65,6 +65,11 @@ typedef enum : git_delta_t { // The number of hunks represented by this delta. @property (nonatomic, readonly) NSUInteger hunkCount; + +// The hunks represented. +// +// Note that you should consider the hunks' lifetime tied to this delta object. +// Once the parent delta object is cleaned up, their behaviour is undefined. @property (nonatomic, readonly, strong) NSArray *hunks; - (instancetype)initWithGitPatch:(git_diff_patch *)patch; From 088ee0a1bc9a872b2879938aa40e1df301320250 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:27:00 +0000 Subject: [PATCH 080/157] Document the designated initialiser. --- Classes/GTDiffDelta.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index d10c93fc6..376259333 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -72,6 +72,7 @@ typedef enum : git_delta_t { // Once the parent delta object is cleaned up, their behaviour is undefined. @property (nonatomic, readonly, strong) NSArray *hunks; +// Designated initialiser. - (instancetype)initWithGitPatch:(git_diff_patch *)patch; @end From 7244eb07e231dec1ba7ab51346cb90a07a898712 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:33:33 +0000 Subject: [PATCH 081/157] NSUInteger -> mode_t for a file's mode. --- Classes/GTDiffFile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index 798d208f6..28bb42085 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -23,8 +23,8 @@ typedef enum : git_diff_file_flag_t { @property (nonatomic, readonly, strong) NSString *path; @property (nonatomic, readonly) NSUInteger size; @property (nonatomic, readonly) NSUInteger flags; -@property (nonatomic, readonly) NSUInteger mode; +@property (nonatomic, readonly) mode_t mode; - (instancetype)initWithGitDiffFile:(git_diff_file)file; @end From cf82c0f17fee94d194a58432b00b64434c46b7ab Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:39:33 +0000 Subject: [PATCH 082/157] Document GTDiffFile. --- Classes/GTDiffFile.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index 28bb42085..ef465d85a 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -8,6 +8,9 @@ #import "git2.h" +// Flags which may be set on the file. +// +// See diff.h for individual documentation. typedef enum : git_diff_file_flag_t { GTDiffFileFlagValidOID = GIT_DIFF_FILE_VALID_OID, GTDiffFileFlagFreePath = GIT_DIFF_FILE_FREE_PATH, @@ -18,13 +21,22 @@ typedef enum : git_diff_file_flag_t { GTDiffFileFlagNoData = GIT_DIFF_FILE_NO_DATA, } GTDiffFileFlag; +// A class representing a file on one side of a diff. @interface GTDiffFile : NSObject +// The location within the working directory of the file. @property (nonatomic, readonly, strong) NSString *path; + +// The size (in bytes) of the file. @property (nonatomic, readonly) NSUInteger size; + +// Any flags set on the file (see `GTDiffFileFlag` for more info). @property (nonatomic, readonly) NSUInteger flags; +// The mode of the file. @property (nonatomic, readonly) mode_t mode; + +// Designated initialiser. - (instancetype)initWithGitDiffFile:(git_diff_file)file; @end From 27ac67cd6f89eb3c6e1f116d951296a3b798bfbb Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:46:23 +0000 Subject: [PATCH 083/157] Unnecessary @class -- --- Classes/GTDiffDelta.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 376259333..f7d2e20e7 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -9,7 +9,6 @@ #import "git2.h" @class GTDiffFile; -@class GTDiffHunk; // The type of change that this delta represents. // From b80d3552e138ab4c0fb88b93bdd985027df38fb5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 17:54:43 +0000 Subject: [PATCH 084/157] Document GTDiffHunk. --- Classes/GTDiffHunk.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index b0c7f0452..0bdc20999 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -10,6 +10,9 @@ @class GTDiffDelta; +// A character representing the origin of a given line. +// +// See diff.h for individual documentation. typedef enum : git_diff_line_t { GTDiffHunkLineOriginContext = GIT_DIFF_LINE_CONTEXT, GTDiffHunkLineOriginAddition = GIT_DIFF_LINE_ADDITION, @@ -18,12 +21,25 @@ typedef enum : git_diff_line_t { GTDiffHunkLineOriginDeleteEOFNewLine = GIT_DIFF_LINE_DEL_EOFNL, } GTDiffHunkLineOrigin; +// A class representing a hunk within a diff delta. @interface GTDiffHunk : NSObject +// The header of the hunk. @property (nonatomic, readonly, strong) NSString *header; + +// The number of lines represented in the hunk. @property (nonatomic, readonly) NSUInteger lineCount; +// Designated initialiser. +// +// The contents of a hunk are lazily loaded, therefore we initialise the object +// simply with the delta it originates from and which hunk index it represents. - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkIndex; + +// Perfoms the given block on each ine in the hunk. +// +// block - A block to execute on each line. Returning `YES` immediately stops +// the enumeration. - (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin))block; @end From 4216ce999898e834b402ce10fe6cc2d52d5a30ad Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 4 Dec 2012 20:06:57 +0000 Subject: [PATCH 085/157] Make ze headers public. --- .../project.pbxproj | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index ca6ee743a..bb8e3442e 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -62,20 +62,20 @@ 04DB466E133AB5EB00D9C624 /* GTReference.m in Sources */ = {isa = PBXBuildFile; fileRef = BD441E07131ED0C300187010 /* GTReference.m */; }; 04DB466F133AB5EB00D9C624 /* GTBranch.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F50F57132054D800584FBE /* GTBranch.m */; }; 04DB4672133AB5FE00D9C624 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 04DB4671133AB5FE00D9C624 /* libz.dylib */; }; - 3011D86B1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; }; - 3011D86C1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; }; + 3011D86B1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3011D86C1668E48500CE3409 /* GTDiffFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8691668E48500CE3409 /* GTDiffFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3011D86D1668E48500CE3409 /* GTDiffFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D86A1668E48500CE3409 /* GTDiffFile.m */; }; 3011D86E1668E48500CE3409 /* GTDiffFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D86A1668E48500CE3409 /* GTDiffFile.m */; }; - 3011D8711668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; }; - 3011D8721668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; }; + 3011D8711668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3011D8721668E78500CE3409 /* GTDiffHunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D86F1668E78500CE3409 /* GTDiffHunk.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3011D8731668E78500CE3409 /* GTDiffHunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8701668E78500CE3409 /* GTDiffHunk.m */; }; 3011D8741668E78500CE3409 /* GTDiffHunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8701668E78500CE3409 /* GTDiffHunk.m */; }; - 3011D8771668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; }; - 3011D8781668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; }; + 3011D8771668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3011D8781668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3011D8791668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; 3011D87A1668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; - 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; - 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; }; + 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; 3E0A23E5159E0FDB00A6068F /* GTObjectDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -689,11 +689,11 @@ 55C8057D13875C11004DCB0F /* NSData+Git.h in Headers */, 883CD6AB1600EBC600F57354 /* GTRemote.h in Headers */, 55C8057E13875C1B004DCB0F /* NSString+Git.h in Headers */, - 8849C6A214AD81FF003890AF /* GTRepository+Private.h in Headers */, 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */, 3011D86B1668E48500CE3409 /* GTDiffFile.h in Headers */, 3011D8711668E78500CE3409 /* GTDiffHunk.h in Headers */, 3011D8771668F29600CE3409 /* GTDiffDelta.h in Headers */, + 8849C6A214AD81FF003890AF /* GTRepository+Private.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; From 8f2a7530725fdb3095d1366568ba6d28433ac5d0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 5 Dec 2012 09:38:25 +0000 Subject: [PATCH 086/157] withOptions -> options. --- Classes/GTDiff.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 2dd3215e3..cee0fd9d3 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -94,7 +94,7 @@ typedef enum : git_diff_option_t { // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options; ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options; // Create a diff between a tree and it's repository's current index. // @@ -103,7 +103,7 @@ typedef enum : git_diff_option_t { // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffIndexToTree:(GTTree *)tree withOptions:(NSDictionary *)options; ++ (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options; // Create a diff between the working directory and index in a given repository. // @@ -112,7 +112,7 @@ typedef enum : git_diff_option_t { // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options; // Create a diff between a tree and it's repository's working directory. // @@ -121,7 +121,7 @@ typedef enum : git_diff_option_t { // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options; // Designated initialiser. - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; From 587c2d7db5031fc3f5de9547f05a641a20b399c0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 5 Dec 2012 09:41:57 +0000 Subject: [PATCH 087/157] Better English for numberofDeltasWithType documentation. --- Classes/GTDiff.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index cee0fd9d3..5ffd7a21b 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -126,8 +126,7 @@ typedef enum : git_diff_option_t { // Designated initialiser. - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; -// The number of deltas represented by the diff object which are changes of a -// given type. +// The number of deltas of the given type that are contained in the diff. - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType; // Enumerate the deltas in a diff. From cea22d0fb5def210a12c38f949e858a4a810a80a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 5 Dec 2012 09:42:13 +0000 Subject: [PATCH 088/157] recommend -> recommended --- Classes/GTDiff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 5ffd7a21b..b18f8521c 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -132,7 +132,7 @@ typedef enum : git_diff_option_t { // Enumerate the deltas in a diff. // // It is worth noting that the `git_diff_patch` objects backing each delta -// contain the entire contents in memory. It is therefore recommend you +// contain the entire contents in memory. It is therefore recommended you // do not store the `delta` object given here, but instead perform any work // necessary within the provided block. // From 9377752b20eacd09f32ab82dae9d91af54939e26 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Wed, 5 Dec 2012 09:55:06 +0000 Subject: [PATCH 089/157] Updating the implementation with new method sigs helps. --- Classes/GTDiff.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 04f387d97..b777435ac 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -47,7 +47,7 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { return newOptions; } -+ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOptions:(NSDictionary *)options { ++ (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; @@ -60,7 +60,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree withOpti return newDiff; } -+ (GTDiff *)diffIndexToTree:(GTTree *)tree withOptions:(NSDictionary *)options { ++ (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, optionsStruct); @@ -71,7 +71,7 @@ + (GTDiff *)diffIndexToTree:(GTTree *)tree withOptions:(NSDictionary *)options { return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository withOptions:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, optionsStruct); @@ -82,7 +82,7 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository w return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree withOptions:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options { git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, optionsStruct); From b89e3b1caa42544fa6ee5411e696afb0c92c0345 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 15:30:15 +0000 Subject: [PATCH 090/157] Don't allocate options struct on the heap. --- Classes/GTDiff.m | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index b777435ac..4144eb73a 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -21,28 +21,28 @@ @implementation GTDiff -+ (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { - if (dictionary == nil) return NULL; ++ (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { + git_diff_options newOptions; - git_diff_options *newOptions = malloc(sizeof(git_diff_options)); + if (dictionary == nil) return newOptions; NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; - if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; + if (flagsNumber != nil) newOptions.flags = (uint32_t)flagsNumber.unsignedIntegerValue; NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; - if (contextLinesNumber != nil) newOptions->context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; + if (contextLinesNumber != nil) newOptions.context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; - if (interHunkLinesNumber != nil) newOptions->interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; - if (oldPrefix != nil) newOptions->old_prefix = (char *)oldPrefix.UTF8String; + if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; NSString *newPrefix = dictionary[GTDiffOptionsNewPrefixKey]; - if (newPrefix != nil) newOptions->new_prefix = (char *)newPrefix.UTF8String; + if (newPrefix != nil) newOptions.new_prefix = (char *)newPrefix.UTF8String; NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; - if (maxSizeNumber != nil) newOptions->max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + if (maxSizeNumber != nil) newOptions.max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; return newOptions; } @@ -50,10 +50,9 @@ + (git_diff_options *)optionsStructFromDictionary:(NSDictionary *)dictionary { + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); - git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; + git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, optionsStruct); - free(optionsStruct); + int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, &optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -61,10 +60,9 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: } + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { - git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; + git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, optionsStruct); - free(optionsStruct); + int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, &optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -72,10 +70,9 @@ + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { } + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options { - git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; + git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, optionsStruct); - free(optionsStruct); + int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, &optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -83,10 +80,9 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository o } + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options { - git_diff_options *optionsStruct = [self optionsStructFromDictionary:options]; + git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, optionsStruct); - free(optionsStruct); + int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, &optionsStruct); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; From 838b9713ece51ecd01b7304378b99eb3596be18e Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 17:56:53 +0000 Subject: [PATCH 091/157] Comment our cast to char* --- Classes/GTDiff.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 4144eb73a..371de0f4b 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -35,6 +35,9 @@ + (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + // We cast to char* below to work around a current bug in libgit2, which is + // fixed in https://github.com/libgit2/libgit2/pull/1118 + NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; From 48cc65137c785b1d54fa4223aca3bffb8db1f51f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:00:50 +0000 Subject: [PATCH 092/157] return const git_diff_delta* rather than lacking the const. --- Classes/GTDiffDelta.h | 2 +- Classes/GTDiffDelta.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index f7d2e20e7..6836132f0 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -43,7 +43,7 @@ typedef enum : git_delta_t { // A convenience accessor to fetch the `git_diff_delta` represented by the // object. -@property (nonatomic, readonly) git_diff_delta *git_diff_delta; +@property (nonatomic, readonly) const git_diff_delta *git_diff_delta; // The backing libgit2 `git_diff_patch` object. @property (nonatomic, readonly) git_diff_patch *git_diff_patch; diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index ce18ce5cf..721dee6ca 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -32,8 +32,8 @@ - (void)dealloc { #pragma mark - Properties -- (git_diff_delta *)git_diff_delta { - return (git_diff_delta *)git_diff_patch_delta(self.git_diff_patch); +- (const git_diff_delta *)git_diff_delta { + return git_diff_patch_delta(self.git_diff_patch); } - (BOOL)isBinary { From b7702d93f7b869334311513b490a020f6e40e90c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:01:38 +0000 Subject: [PATCH 093/157] Return nil if a hunk fails to correctly initialise. --- Classes/GTDiffDelta.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 721dee6ca..a2fba25bc 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -62,7 +62,8 @@ - (NSArray *)hunks { NSMutableArray *newHunksArray = [NSMutableArray arrayWithCapacity:hunkCount]; for (NSUInteger idx = 0; idx < self.hunkCount; idx ++) { GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithDelta:self hunkIndex:idx]; - if (hunk != nil) [newHunksArray addObject:hunk]; + if (hunk == nil) return nil; + [newHunksArray addObject:hunk]; } _hunks = [newHunksArray copy]; From e7bd6f170f4765490fe239a16d5ce0cf3645cf0f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:05:20 +0000 Subject: [PATCH 094/157] Better docs for diff options courtesy of @arrbee. --- Classes/GTDiff.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index b18f8521c..1145e0b1c 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -18,14 +18,14 @@ // pass into the initialisation. extern NSString *const GTDiffOptionsFlagsKey; -// An `NSNumber` wrapped `NSUInteger` dictating how many context lines above and -// below each individual hunk. +// An `NSNumber` wrapped `NSUInteger` dictating the number of unchanged lines +// that define the boundary of a hunk (and to display around it). // // Defaults to 3. extern NSString *const GTDiffOptionsContextLinesKey; -// An `NSNumber` wrapped `NSUInteger` dictating the minimum number of lines -// between diff hunks to merge them into one hunk. +// An `NSNumber` wrapped `NSUInteger` dictating the maximum number of unchanged +// lines between hunk boundaries before the hunks will be merged. // // Defaults to 0. extern NSString *const GTDiffOptionsInterHunkLinesKey; From 6759e89cd2f3b6d2ee2de8f0bdfacafc233ff6d0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:06:49 +0000 Subject: [PATCH 095/157] Add GTDiffFileDeltaTypeChange documentation. --- Classes/GTDiffDelta.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 6836132f0..0577ef0c2 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -21,7 +21,8 @@ // GTDiffFileDeltaIgnored - The file was ignored by git. // GTDiffFileDeltaUntracked - The file has been added to the working directory // and is therefore currently untracked. -// GTDiffFileDeltaTypeChange - LOL NO IDEA +// GTDiffFileDeltaTypeChange - The file has changed from a blob to either a +// submodule, symlink or directory. typedef enum : git_delta_t { GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, GTDiffFileDeltaAdded = GIT_DELTA_ADDED, From 3ee7044185fcddb477bdf351690e7733f41685e4 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:09:07 +0000 Subject: [PATCH 096/157] Use copy to denote immutable readonly properties. --- Classes/GTDiffDelta.h | 6 +++--- Classes/GTDiffFile.h | 2 +- Classes/GTDiffHunk.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 0577ef0c2..0847e1320 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -53,10 +53,10 @@ typedef enum : git_delta_t { @property (nonatomic, readonly, getter = isBinary) BOOL binary; // The file to the "left" of the diff. -@property (nonatomic, readonly, strong) GTDiffFile *oldFile; +@property (nonatomic, readonly, copy) GTDiffFile *oldFile; // The file to the "right" of the diff. -@property (nonatomic, readonly, strong) GTDiffFile *newFile; +@property (nonatomic, readonly, copy) GTDiffFile *newFile; // The type of change that this delta represents. // @@ -70,7 +70,7 @@ typedef enum : git_delta_t { // // Note that you should consider the hunks' lifetime tied to this delta object. // Once the parent delta object is cleaned up, their behaviour is undefined. -@property (nonatomic, readonly, strong) NSArray *hunks; +@property (nonatomic, readonly, copy) NSArray *hunks; // Designated initialiser. - (instancetype)initWithGitPatch:(git_diff_patch *)patch; diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index ef465d85a..d9e966eb2 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -25,7 +25,7 @@ typedef enum : git_diff_file_flag_t { @interface GTDiffFile : NSObject // The location within the working directory of the file. -@property (nonatomic, readonly, strong) NSString *path; +@property (nonatomic, readonly, copy) NSString *path; // The size (in bytes) of the file. @property (nonatomic, readonly) NSUInteger size; diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 0bdc20999..92528ec0a 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -25,7 +25,7 @@ typedef enum : git_diff_line_t { @interface GTDiffHunk : NSObject // The header of the hunk. -@property (nonatomic, readonly, strong) NSString *header; +@property (nonatomic, readonly, copy) NSString *header; // The number of lines represented in the hunk. @property (nonatomic, readonly) NSUInteger lineCount; From 2ed1806695e912b0bf3756d7da4e71065f107e73 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 10 Dec 2012 18:32:11 +0000 Subject: [PATCH 097/157] Use the more cocoa boolean method to stop enumeration. Also add some additional documentation. --- Classes/GTDiff.h | 8 +++++--- Classes/GTDiff.m | 6 ++++-- Classes/GTDiffHunk.h | 8 +++++--- Classes/GTDiffHunk.m | 6 ++++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 1145e0b1c..53d65d04a 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -136,8 +136,10 @@ typedef enum : git_diff_option_t { // do not store the `delta` object given here, but instead perform any work // necessary within the provided block. // -// block - A block to be executed for each delta, return NO from a block to -// immediately stop the enumeration. -- (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block; +// Also note that this method blocks during the enumeration. +// +// block - A block to be executed for each delta. Setting `stop` to `YES` +// immediately stops the enumeration. +- (void)enumerateDeltasUsingBlock:(void(^)(GTDiffDelta *delta, BOOL *stop))block; @end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 371de0f4b..6e03f7a68 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -109,13 +109,15 @@ - (void)dealloc { #pragma mark - Properties -- (void)enumerateDeltasUsingBlock:(BOOL(^)(GTDiffDelta *delta))block { +- (void)enumerateDeltasUsingBlock:(void(^)(GTDiffDelta *delta, BOOL *stop))block { for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { git_diff_patch *patch; int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); if (result != GIT_OK) continue; GTDiffDelta *delta = [[GTDiffDelta alloc] initWithGitPatch:patch]; - if (!block(delta)) return; + BOOL stop = NO; + block(delta, &stop); + if (stop) return; } } diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index 92528ec0a..c8ba36398 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -38,8 +38,10 @@ typedef enum : git_diff_line_t { // Perfoms the given block on each ine in the hunk. // -// block - A block to execute on each line. Returning `YES` immediately stops -// the enumeration. -- (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin))block; +// Note that this method blocks during the enumeration. +// +// block - A block to execute on each line. Setting `stop` to `NO` will +// immediately stop the enumeration and return from the method. +- (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block; @end diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index cb896cca4..69f11e0a3 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -38,7 +38,7 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd return self; } -- (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin))block { +- (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block { for (NSUInteger idx = 0; idx < self.lineCount; idx ++) { char lineOrigin; const char *content; @@ -49,7 +49,9 @@ - (void)enumerateLinesInHunkUsingBlock:(BOOL(^)(NSString *lineContent, NSUIntege if (result != GIT_OK) continue; NSString *lineString = [[NSString alloc] initWithBytes:content length:contentLength encoding:NSUTF8StringEncoding]; - if (!block(lineString, (NSUInteger)oldLineNumber, (NSUInteger)newLineNumber, lineOrigin)) return; + BOOL stop = NO; + block(lineString, (NSUInteger)oldLineNumber, (NSUInteger)newLineNumber, lineOrigin, &stop); + if (stop) return; } } From fb7f585ba07179d661f90b718bd8b7fcd9aea4c8 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 11 Dec 2012 18:42:26 +0000 Subject: [PATCH 098/157] Stub tests and remove auto-running tests on build. Now tests are run when hitting cmd+u (or "test" in Xcode 4) this means we get to actually set breakpoints in a sane fashion! --- .../project.pbxproj | 18 ++------ ObjectiveGitTests/GTDiffTest.h | 13 ++++++ ObjectiveGitTests/GTDiffTest.m | 42 +++++++++++++++++++ 3 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 ObjectiveGitTests/GTDiffTest.h create mode 100644 ObjectiveGitTests/GTDiffTest.m diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index bb8e3442e..37e2824c7 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -78,6 +78,7 @@ 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; + 30B0FF8A166E8F8C00F2A2B4 /* GTDiffTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */; }; 3E0A23E5159E0FDB00A6068F /* GTObjectDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 55C8054F13861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; 55C8055013861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; @@ -282,6 +283,7 @@ 3011D8761668F29600CE3409 /* GTDiffDelta.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffDelta.m; sourceTree = ""; }; 30A3D6521667F11C00C49A39 /* GTDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiff.h; sourceTree = ""; }; 30A3D6531667F11C00C49A39 /* GTDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiff.m; sourceTree = ""; }; + 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffTest.m; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* ObjectiveGitFramework_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectiveGitFramework_Prefix.pch; sourceTree = ""; }; 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTObjectDatabase.h; sourceTree = ""; }; 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = GTObjectDatabase.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -494,6 +496,7 @@ 88F05AAC16011FFD00B7AD1D /* GTTagTest.m */, 88F05AAD16011FFD00B7AD1D /* GTTreeTest.m */, 88F05AAE16011FFD00B7AD1D /* GTWalkerTest.m */, + 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */, 88F05AAF16011FFD00B7AD1D /* ObjectiveGitTests-Info.plist */, 88F05AB016011FFD00B7AD1D /* ObjectiveGitTests-Prefix.pch */, 88F05A7616011E5400B7AD1D /* Supporting Files */, @@ -725,7 +728,6 @@ 88F05A6616011E5400B7AD1D /* Sources */, 88F05A6716011E5400B7AD1D /* Frameworks */, 88F05A6816011E5400B7AD1D /* Resources */, - 88F05A6916011E5400B7AD1D /* ShellScript */, ); buildRules = ( ); @@ -884,19 +886,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 88F05A6916011E5400B7AD1D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; D0A330F116027F2300A616FA /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -974,6 +963,7 @@ 88F05ABD16011FFD00B7AD1D /* GTTagTest.m in Sources */, 88F05ABE16011FFD00B7AD1D /* GTTreeTest.m in Sources */, 88F05ABF16011FFD00B7AD1D /* GTWalkerTest.m in Sources */, + 30B0FF8A166E8F8C00F2A2B4 /* GTDiffTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ObjectiveGitTests/GTDiffTest.h b/ObjectiveGitTests/GTDiffTest.h new file mode 100644 index 000000000..4f862ebab --- /dev/null +++ b/ObjectiveGitTests/GTDiffTest.h @@ -0,0 +1,13 @@ +// +// GTDiffTest.h +// ObjectiveGitFramework +// +// Created by Danny Greg on 04/12/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@interface GTDiffTest : SenTestCase + +@end diff --git a/ObjectiveGitTests/GTDiffTest.m b/ObjectiveGitTests/GTDiffTest.m new file mode 100644 index 000000000..de6e6c9ca --- /dev/null +++ b/ObjectiveGitTests/GTDiffTest.m @@ -0,0 +1,42 @@ +// +// GTDiffTest.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 04/12/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "Contants.h" + +#import "GTDiff.h" + +@interface GTDiffTest : SenTestCase + +@property (nonatomic, strong) GTRepository *repository; + +@end + +@implementation GTDiffTest + +- (GTCommit *)findCommitWithSHA:(NSString *)sha { + return (GTCommit *)[self.repository lookupObjectBySha:sha objectType:GTObjectTypeCommit error:NULL]; +} + +- (void)setUp { + self.repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_REPO_PATH(self.class)] error:NULL]; + STAssertNotNil(self.repository, @"Failed to initialise repository."); +} + +- (void)testDiffingTrees { + GTCommit *firstCommit = [self findCommitWithSHA:@"5b5b025afb0b4c913b4c338a42934a3863bf3644"]; + GTCommit *secondCommit = [self findCommitWithSHA:@"36060c58702ed4c2a40832c51758d5344201d89a"]; + STAssertNotNil(firstCommit, @"Could not find first commit to diff against"); + STAssertNotNil(secondCommit, @"Could not find second commit to diff against"); + + GTTree *firstTree = firstCommit.tree; + GTTree *secondTree = secondCommit.tree; + GTDiff *diff = [GTDiff diffOldTree:firstTree withNewTree:secondTree options:nil]; + STAssertNotNil(diff, @"Unable to create a diff object with 2 trees."); +} + +@end From c68934924b516091b0ce84abf85724b5459d99f0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 11 Dec 2012 19:01:33 +0000 Subject: [PATCH 099/157] Safer diff initialisers. --- Classes/GTDiff.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 6e03f7a68..8a6e67453 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -64,6 +64,8 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; + NSParameterAssert(tree != nil); + git_diff_list *diffList; int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, &optionsStruct); if (returnValue != GIT_OK) return nil; @@ -74,6 +76,8 @@ + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options { git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; + NSParameterAssert(repository != nil); + git_diff_list *diffList; int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, &optionsStruct); if (returnValue != GIT_OK) return nil; @@ -84,6 +88,8 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository o + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options { git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; + NSParameterAssert(tree != nil); + git_diff_list *diffList; int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, &optionsStruct); if (returnValue != GIT_OK) return nil; From 687d28ba0d493fe366b65dde02b35b75506a46fc Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 11 Dec 2012 19:03:27 +0000 Subject: [PATCH 100/157] Options struct is now created by writeback. --- Classes/GTDiff.m | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 8a6e67453..764111038 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -21,41 +21,40 @@ @implementation GTDiff -+ (git_diff_options)optionsStructFromDictionary:(NSDictionary *)dictionary { - git_diff_options newOptions; - - if (dictionary == nil) return newOptions; ++ (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(git_diff_options *)newOptions { + if (dictionary == nil || dictionary.count < 1) return NO; NSNumber *flagsNumber = dictionary[GTDiffOptionsFlagsKey]; - if (flagsNumber != nil) newOptions.flags = (uint32_t)flagsNumber.unsignedIntegerValue; + if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; NSNumber *contextLinesNumber = dictionary[GTDiffOptionsContextLinesKey]; - if (contextLinesNumber != nil) newOptions.context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; + if (contextLinesNumber != nil) newOptions->context_lines = (uint16_t)contextLinesNumber.unsignedIntegerValue; NSNumber *interHunkLinesNumber = dictionary[GTDiffOptionsInterHunkLinesKey]; - if (interHunkLinesNumber != nil) newOptions.interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; + if (interHunkLinesNumber != nil) newOptions->interhunk_lines = (uint16_t)interHunkLinesNumber.unsignedIntegerValue; // We cast to char* below to work around a current bug in libgit2, which is // fixed in https://github.com/libgit2/libgit2/pull/1118 NSString *oldPrefix = dictionary[GTDiffOptionsOldPrefixKey]; - if (oldPrefix != nil) newOptions.old_prefix = (char *)oldPrefix.UTF8String; + if (oldPrefix != nil) newOptions->old_prefix = (char *)oldPrefix.UTF8String; NSString *newPrefix = dictionary[GTDiffOptionsNewPrefixKey]; - if (newPrefix != nil) newOptions.new_prefix = (char *)newPrefix.UTF8String; + if (newPrefix != nil) newOptions->new_prefix = (char *)newPrefix.UTF8String; NSNumber *maxSizeNumber = dictionary[GTDiffOptionsMaxSizeKey]; - if (maxSizeNumber != nil) newOptions.max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; + if (maxSizeNumber != nil) newOptions->max_size = (uint16_t)maxSizeNumber.unsignedIntegerValue; - return newOptions; + return YES; } + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); - git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; + git_diff_options optionsStruct; + BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, &optionsStruct); + int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -63,11 +62,12 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: } + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { - git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; NSParameterAssert(tree != nil); + git_diff_options optionsStruct; + BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, &optionsStruct); + int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -75,11 +75,12 @@ + (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { } + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options { - git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; NSParameterAssert(repository != nil); + git_diff_options optionsStruct; + BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, &optionsStruct); + int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -87,11 +88,12 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository o } + (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options { - git_diff_options optionsStruct = [self optionsStructFromDictionary:options]; NSParameterAssert(tree != nil); + git_diff_options optionsStruct; + BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, &optionsStruct); + int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; From 31c91e0a77073a31cd43410ddbaa734fe62e783a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 11 Dec 2012 19:09:08 +0000 Subject: [PATCH 101/157] Flesh out initialisation tests. --- ObjectiveGitTests/GTDiffTest.m | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ObjectiveGitTests/GTDiffTest.m b/ObjectiveGitTests/GTDiffTest.m index de6e6c9ca..bb1f1caf3 100644 --- a/ObjectiveGitTests/GTDiffTest.m +++ b/ObjectiveGitTests/GTDiffTest.m @@ -27,7 +27,7 @@ - (void)setUp { STAssertNotNil(self.repository, @"Failed to initialise repository."); } -- (void)testDiffingTrees { +- (void)testInitialisation { GTCommit *firstCommit = [self findCommitWithSHA:@"5b5b025afb0b4c913b4c338a42934a3863bf3644"]; GTCommit *secondCommit = [self findCommitWithSHA:@"36060c58702ed4c2a40832c51758d5344201d89a"]; STAssertNotNil(firstCommit, @"Could not find first commit to diff against"); @@ -35,8 +35,17 @@ - (void)testDiffingTrees { GTTree *firstTree = firstCommit.tree; GTTree *secondTree = secondCommit.tree; - GTDiff *diff = [GTDiff diffOldTree:firstTree withNewTree:secondTree options:nil]; - STAssertNotNil(diff, @"Unable to create a diff object with 2 trees."); + GTDiff *treeDiff = [GTDiff diffOldTree:firstTree withNewTree:secondTree options:nil]; + STAssertNotNil(treeDiff, @"Unable to create a diff object with 2 trees."); + + GTDiff *indexDiff = [GTDiff diffIndexToTree:firstTree options:nil]; + STAssertNotNil(indexDiff, @"Unable to create a diff object with a tree to an index."); + + GTDiff *workingDirectoryToIndexDiff = [GTDiff diffWorkingDirectoryToIndexInRepository:self.repository options:nil]; + STAssertNotNil(workingDirectoryToIndexDiff, @"Unable to create a diff object of the index and working directory."); + + GTDiff *workingDirectoryToTreeDiff = [GTDiff diffWorkingDirectoryToTree:firstTree options:nil]; + STAssertNotNil(workingDirectoryToTreeDiff, @"Unable to create a diff with the working directory and a tree."); } @end From 07b38f7b09afc514d8ff44b89fe63f3324e294eb Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 11 Dec 2012 19:39:30 +0000 Subject: [PATCH 102/157] Rearrange setup slightly. Commits become properties. --- ObjectiveGitTests/GTDiffTest.m | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ObjectiveGitTests/GTDiffTest.m b/ObjectiveGitTests/GTDiffTest.m index bb1f1caf3..f3adca898 100644 --- a/ObjectiveGitTests/GTDiffTest.m +++ b/ObjectiveGitTests/GTDiffTest.m @@ -9,10 +9,13 @@ #import "Contants.h" #import "GTDiff.h" +#import "GTDiffHunk.h" @interface GTDiffTest : SenTestCase @property (nonatomic, strong) GTRepository *repository; +@property (nonatomic, strong) GTCommit *firstCommit; +@property (nonatomic, strong) GTCommit *secondCommit; @end @@ -25,16 +28,16 @@ - (GTCommit *)findCommitWithSHA:(NSString *)sha { - (void)setUp { self.repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_REPO_PATH(self.class)] error:NULL]; STAssertNotNil(self.repository, @"Failed to initialise repository."); + + self.firstCommit = [self findCommitWithSHA:@"5b5b025afb0b4c913b4c338a42934a3863bf3644"]; + self.secondCommit = [self findCommitWithSHA:@"36060c58702ed4c2a40832c51758d5344201d89a"]; + STAssertNotNil(self.firstCommit, @"Could not find first commit to diff against"); + STAssertNotNil(self.secondCommit, @"Could not find second commit to diff against"); } - (void)testInitialisation { - GTCommit *firstCommit = [self findCommitWithSHA:@"5b5b025afb0b4c913b4c338a42934a3863bf3644"]; - GTCommit *secondCommit = [self findCommitWithSHA:@"36060c58702ed4c2a40832c51758d5344201d89a"]; - STAssertNotNil(firstCommit, @"Could not find first commit to diff against"); - STAssertNotNil(secondCommit, @"Could not find second commit to diff against"); - - GTTree *firstTree = firstCommit.tree; - GTTree *secondTree = secondCommit.tree; + GTTree *firstTree = self.firstCommit.tree; + GTTree *secondTree = self.secondCommit.tree; GTDiff *treeDiff = [GTDiff diffOldTree:firstTree withNewTree:secondTree options:nil]; STAssertNotNil(treeDiff, @"Unable to create a diff object with 2 trees."); From a77854cc5d9f2d4148603461ce25a6ef055bfa09 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 13 Dec 2012 16:47:31 +0000 Subject: [PATCH 103/157] Add unit tests for the diff content. --- ObjectiveGitTests/GTDiffTest.m | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/ObjectiveGitTests/GTDiffTest.m b/ObjectiveGitTests/GTDiffTest.m index f3adca898..4bbe628bc 100644 --- a/ObjectiveGitTests/GTDiffTest.m +++ b/ObjectiveGitTests/GTDiffTest.m @@ -51,4 +51,26 @@ - (void)testInitialisation { STAssertNotNil(workingDirectoryToTreeDiff, @"Unable to create a diff with the working directory and a tree."); } +- (void)testDeltaCreation { + GTDiff *treeDiff = [GTDiff diffOldTree:self.firstCommit.tree withNewTree:self.secondCommit.tree options:nil]; + STAssertEquals(treeDiff.deltaCount, (NSUInteger)4, @"Incorrect delta count in diff."); + STAssertEquals([treeDiff numberOfDeltasWithType:GTDiffFileDeltaAdded], (NSUInteger)4, @"Not correctly filtering delta typs."); + + + NSArray *expectedChangeStrings = @[ @"hey", @"new file", @"hey", @"new file" ]; + __block NSUInteger index = 0; + [treeDiff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + STAssertEquals(delta.status, (GTDiffDeltaType)GTDiffFileDeltaAdded, @"Incorrect delta type,"); + for (GTDiffHunk *hunk in delta.hunks) { + STAssertEquals(hunk.lineCount, (NSUInteger)1, @"Incorrect line count"); + STAssertEqualObjects(hunk.header, @"@@ -0,0 +1 @@", @"Incorrect hunk header"); + [hunk enumerateLinesInHunkUsingBlock:^(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop) { + STAssertEqualObjects(lineContent, expectedChangeStrings[index], @"Incorrect diff line change content"); + }]; + } + + index ++; //:trollface: + }]; +} + @end From e8d25b4c85918a8c4a6f19b108eb341b85fbec8a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 13 Dec 2012 16:52:38 +0000 Subject: [PATCH 104/157] Strip trailing new lines in hunk headers. --- Classes/GTDiffHunk.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index 69f11e0a3..ec2bc52ad 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -32,7 +32,7 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd int result = git_diff_patch_get_hunk(NULL, &headerCString, &headerLength, &lineCount, delta.git_diff_patch, hunkIndex); if (result != GIT_OK) return nil; - _header = [[NSString alloc] initWithBytes:headerCString length:headerLength encoding:NSUTF8StringEncoding]; + _header = [[[NSString alloc] initWithBytes:headerCString length:headerLength encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:NSCharacterSet.newlineCharacterSet]; _lineCount = lineCount; return self; From 32e1d0cbac265b8970530b0258606b0726cbae2f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 13 Dec 2012 16:59:03 +0000 Subject: [PATCH 105/157] Strip out any newlines for diff lines too. --- Classes/GTDiffHunk.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index ec2bc52ad..928d1163a 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -48,7 +48,7 @@ - (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUIntege int result = git_diff_patch_get_line_in_hunk(&lineOrigin, &content, &contentLength, &oldLineNumber, &newLineNumber, self.delta.git_diff_patch, self.hunkIndex, idx); if (result != GIT_OK) continue; - NSString *lineString = [[NSString alloc] initWithBytes:content length:contentLength encoding:NSUTF8StringEncoding]; + NSString *lineString = [[[NSString alloc] initWithBytes:content length:contentLength encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:NSCharacterSet.newlineCharacterSet]; BOOL stop = NO; block(lineString, (NSUInteger)oldLineNumber, (NSUInteger)newLineNumber, lineOrigin, &stop); if (stop) return; From 5f00a30361d768221ebdf8f77cf03ffb611aa3ee Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Thu, 13 Dec 2012 17:50:59 +0000 Subject: [PATCH 106/157] Add headers to objectivegit.h. --- Classes/ObjectiveGit.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Classes/ObjectiveGit.h b/Classes/ObjectiveGit.h index 8e73ce138..4db8f02fc 100644 --- a/Classes/ObjectiveGit.h +++ b/Classes/ObjectiveGit.h @@ -47,6 +47,11 @@ #import #import +#import +#import +#import +#import + // This must be called before doing any ObjectiveGit work. Under normal // circumstances, it will automatically be called on your behalf. // If you've linked ObjectiveGit as a static library but haven't set From 3811b2c3769e32584fe84543c6899f86c1ecd05f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 13:16:52 +0000 Subject: [PATCH 107/157] Create a spec for the diff tests and move initialisation to it. --- .../project.pbxproj | 4 ++ ObjectiveGitTests/GTDiffSpec.m | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 ObjectiveGitTests/GTDiffSpec.m diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index 37e2824c7..63aea1eef 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -74,6 +74,7 @@ 3011D8781668F29600CE3409 /* GTDiffDelta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3011D8751668F29600CE3409 /* GTDiffDelta.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3011D8791668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; 3011D87A1668F29600CE3409 /* GTDiffDelta.m in Sources */ = {isa = PBXBuildFile; fileRef = 3011D8761668F29600CE3409 /* GTDiffDelta.m */; }; + 30865A91167F503400B1AB6E /* GTDiffSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 30865A90167F503400B1AB6E /* GTDiffSpec.m */; }; 30A3D6541667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; @@ -281,6 +282,7 @@ 3011D8701668E78500CE3409 /* GTDiffHunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffHunk.m; sourceTree = ""; }; 3011D8751668F29600CE3409 /* GTDiffDelta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiffDelta.h; sourceTree = ""; }; 3011D8761668F29600CE3409 /* GTDiffDelta.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffDelta.m; sourceTree = ""; }; + 30865A90167F503400B1AB6E /* GTDiffSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffSpec.m; sourceTree = ""; }; 30A3D6521667F11C00C49A39 /* GTDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiff.h; sourceTree = ""; }; 30A3D6531667F11C00C49A39 /* GTDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiff.m; sourceTree = ""; }; 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffTest.m; sourceTree = ""; }; @@ -497,6 +499,7 @@ 88F05AAD16011FFD00B7AD1D /* GTTreeTest.m */, 88F05AAE16011FFD00B7AD1D /* GTWalkerTest.m */, 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */, + 30865A90167F503400B1AB6E /* GTDiffSpec.m */, 88F05AAF16011FFD00B7AD1D /* ObjectiveGitTests-Info.plist */, 88F05AB016011FFD00B7AD1D /* ObjectiveGitTests-Prefix.pch */, 88F05A7616011E5400B7AD1D /* Supporting Files */, @@ -964,6 +967,7 @@ 88F05ABE16011FFD00B7AD1D /* GTTreeTest.m in Sources */, 88F05ABF16011FFD00B7AD1D /* GTWalkerTest.m in Sources */, 30B0FF8A166E8F8C00F2A2B4 /* GTDiffTest.m in Sources */, + 30865A91167F503400B1AB6E /* GTDiffSpec.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m new file mode 100644 index 000000000..da6bbb6d6 --- /dev/null +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -0,0 +1,46 @@ +// +// GTDiffSpec.m +// ObjectiveGitFramework +// +// Created by Danny Greg on 17/12/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "Contants.h" + +SpecBegin(GTDiff) + +__block GTRepository *repository = nil; +__block GTCommit *firstCommit = nil; +__block GTCommit *secondCommit = nil; + +describe(@"GTDiff initialisation", ^{ + beforeEach(^{ + repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_REPO_PATH(self.class)] error:NULL]; + expect(repository).toNot.beNil(); + + firstCommit = (GTCommit *)[repository lookupObjectBySha:@"5b5b025afb0b4c913b4c338a42934a3863bf3644" objectType:GTObjectTypeCommit error:NULL]; + expect(firstCommit).toNot.beNil(); + + secondCommit = (GTCommit *)[repository lookupObjectBySha:@"36060c58702ed4c2a40832c51758d5344201d89a" objectType:GTObjectTypeCommit error:NULL]; + expect(secondCommit).toNot.beNil(); + }); + + it(@"should be able to initialise a diff from 2 trees", ^{ + expect([GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]).toNot.beNil(); + }); + + it(@"should be able to initialise a diff against the index with a tree", ^{ + expect([GTDiff diffIndexToTree:secondCommit.tree options:nil]).toNot.beNil(); + }); + + it(@"should be able to initialise a diff against a working directory and a tree", ^{ + expect([GTDiff diffWorkingDirectoryToTree:firstCommit.tree options:nil]).toNot.beNil(); + }); + + it(@"should be able to initialse a diff against an index from a repo's working directory", ^{ + expect([GTDiff diffWorkingDirectoryToIndexInRepository:repository options:nil]).toNot.beNil(); + }); +}); + +SpecEnd From 85f6dcf9147c7f799b5cadf62988950cafa943e9 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 13:17:54 +0000 Subject: [PATCH 108/157] Remove old diff tests. --- .../project.pbxproj | 4 - ObjectiveGitTests/GTDiffTest.m | 76 ------------------- 2 files changed, 80 deletions(-) delete mode 100644 ObjectiveGitTests/GTDiffTest.m diff --git a/ObjectiveGitFramework.xcodeproj/project.pbxproj b/ObjectiveGitFramework.xcodeproj/project.pbxproj index 63aea1eef..bbc2c77f5 100644 --- a/ObjectiveGitFramework.xcodeproj/project.pbxproj +++ b/ObjectiveGitFramework.xcodeproj/project.pbxproj @@ -79,7 +79,6 @@ 30A3D6551667F11C00C49A39 /* GTDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A3D6521667F11C00C49A39 /* GTDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30A3D6561667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; 30A3D6571667F11C00C49A39 /* GTDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 30A3D6531667F11C00C49A39 /* GTDiff.m */; }; - 30B0FF8A166E8F8C00F2A2B4 /* GTDiffTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */; }; 3E0A23E5159E0FDB00A6068F /* GTObjectDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 55C8054F13861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; 55C8055013861FE7004DCB0F /* GTObjectDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */; }; @@ -285,7 +284,6 @@ 30865A90167F503400B1AB6E /* GTDiffSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffSpec.m; sourceTree = ""; }; 30A3D6521667F11C00C49A39 /* GTDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTDiff.h; sourceTree = ""; }; 30A3D6531667F11C00C49A39 /* GTDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiff.m; sourceTree = ""; }; - 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTDiffTest.m; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* ObjectiveGitFramework_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectiveGitFramework_Prefix.pch; sourceTree = ""; }; 55C8054C13861F34004DCB0F /* GTObjectDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTObjectDatabase.h; sourceTree = ""; }; 55C8054D13861F34004DCB0F /* GTObjectDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = GTObjectDatabase.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -498,7 +496,6 @@ 88F05AAC16011FFD00B7AD1D /* GTTagTest.m */, 88F05AAD16011FFD00B7AD1D /* GTTreeTest.m */, 88F05AAE16011FFD00B7AD1D /* GTWalkerTest.m */, - 30B0FF89166E8F8C00F2A2B4 /* GTDiffTest.m */, 30865A90167F503400B1AB6E /* GTDiffSpec.m */, 88F05AAF16011FFD00B7AD1D /* ObjectiveGitTests-Info.plist */, 88F05AB016011FFD00B7AD1D /* ObjectiveGitTests-Prefix.pch */, @@ -966,7 +963,6 @@ 88F05ABD16011FFD00B7AD1D /* GTTagTest.m in Sources */, 88F05ABE16011FFD00B7AD1D /* GTTreeTest.m in Sources */, 88F05ABF16011FFD00B7AD1D /* GTWalkerTest.m in Sources */, - 30B0FF8A166E8F8C00F2A2B4 /* GTDiffTest.m in Sources */, 30865A91167F503400B1AB6E /* GTDiffSpec.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ObjectiveGitTests/GTDiffTest.m b/ObjectiveGitTests/GTDiffTest.m deleted file mode 100644 index 4bbe628bc..000000000 --- a/ObjectiveGitTests/GTDiffTest.m +++ /dev/null @@ -1,76 +0,0 @@ -// -// GTDiffTest.m -// ObjectiveGitFramework -// -// Created by Danny Greg on 04/12/2012. -// Copyright (c) 2012 GitHub, Inc. All rights reserved. -// - -#import "Contants.h" - -#import "GTDiff.h" -#import "GTDiffHunk.h" - -@interface GTDiffTest : SenTestCase - -@property (nonatomic, strong) GTRepository *repository; -@property (nonatomic, strong) GTCommit *firstCommit; -@property (nonatomic, strong) GTCommit *secondCommit; - -@end - -@implementation GTDiffTest - -- (GTCommit *)findCommitWithSHA:(NSString *)sha { - return (GTCommit *)[self.repository lookupObjectBySha:sha objectType:GTObjectTypeCommit error:NULL]; -} - -- (void)setUp { - self.repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_REPO_PATH(self.class)] error:NULL]; - STAssertNotNil(self.repository, @"Failed to initialise repository."); - - self.firstCommit = [self findCommitWithSHA:@"5b5b025afb0b4c913b4c338a42934a3863bf3644"]; - self.secondCommit = [self findCommitWithSHA:@"36060c58702ed4c2a40832c51758d5344201d89a"]; - STAssertNotNil(self.firstCommit, @"Could not find first commit to diff against"); - STAssertNotNil(self.secondCommit, @"Could not find second commit to diff against"); -} - -- (void)testInitialisation { - GTTree *firstTree = self.firstCommit.tree; - GTTree *secondTree = self.secondCommit.tree; - GTDiff *treeDiff = [GTDiff diffOldTree:firstTree withNewTree:secondTree options:nil]; - STAssertNotNil(treeDiff, @"Unable to create a diff object with 2 trees."); - - GTDiff *indexDiff = [GTDiff diffIndexToTree:firstTree options:nil]; - STAssertNotNil(indexDiff, @"Unable to create a diff object with a tree to an index."); - - GTDiff *workingDirectoryToIndexDiff = [GTDiff diffWorkingDirectoryToIndexInRepository:self.repository options:nil]; - STAssertNotNil(workingDirectoryToIndexDiff, @"Unable to create a diff object of the index and working directory."); - - GTDiff *workingDirectoryToTreeDiff = [GTDiff diffWorkingDirectoryToTree:firstTree options:nil]; - STAssertNotNil(workingDirectoryToTreeDiff, @"Unable to create a diff with the working directory and a tree."); -} - -- (void)testDeltaCreation { - GTDiff *treeDiff = [GTDiff diffOldTree:self.firstCommit.tree withNewTree:self.secondCommit.tree options:nil]; - STAssertEquals(treeDiff.deltaCount, (NSUInteger)4, @"Incorrect delta count in diff."); - STAssertEquals([treeDiff numberOfDeltasWithType:GTDiffFileDeltaAdded], (NSUInteger)4, @"Not correctly filtering delta typs."); - - - NSArray *expectedChangeStrings = @[ @"hey", @"new file", @"hey", @"new file" ]; - __block NSUInteger index = 0; - [treeDiff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { - STAssertEquals(delta.status, (GTDiffDeltaType)GTDiffFileDeltaAdded, @"Incorrect delta type,"); - for (GTDiffHunk *hunk in delta.hunks) { - STAssertEquals(hunk.lineCount, (NSUInteger)1, @"Incorrect line count"); - STAssertEqualObjects(hunk.header, @"@@ -0,0 +1 @@", @"Incorrect hunk header"); - [hunk enumerateLinesInHunkUsingBlock:^(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop) { - STAssertEqualObjects(lineContent, expectedChangeStrings[index], @"Incorrect diff line change content"); - }]; - } - - index ++; //:trollface: - }]; -} - -@end From 0e96d8a88eac33b10122f224e4670b01f9ba0b51 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 13:27:26 +0000 Subject: [PATCH 109/157] Add the Test_App repo into our test fixtures. --- .../fixtures/Test_App/.gitignore | 15 + .../Test_App/English.lproj/InfoPlist.strings | 1 + .../Test_App/English.lproj/MainMenu.xib | 4229 +++++++++++++++++ ObjectiveGitTests/fixtures/Test_App/README | 14 + .../fixtures/Test_App/README1.txt | 26 + ObjectiveGitTests/fixtures/Test_App/REAME_ | 1 + .../fixtures/Test_App/Test-Info.plist | 32 + .../Test_App/Test.xcodeproj/project.pbxproj | 557 +++ .../fixtures/Test_App/TestAppDelegate.h | 17 + .../fixtures/Test_App/TestAppDelegate.m | 22 + .../fixtures/Test_App/TestAppWindow.xib | 2572 ++++++++++ .../Test_App/TestAppWindowController.h | 27 + .../Test_App/TestAppWindowController.m | 87 + .../fixtures/Test_App/TestSearchField.h | 16 + .../fixtures/Test_App/TestSearchField.m | 29 + .../fixtures/Test_App/TestSearchFieldCell.h | 16 + .../fixtures/Test_App/TestSearchFieldCell.m | 15 + .../fixtures/Test_App/Test_Prefix.pch | 9 + .../fixtures/Test_App/dolla$billy'all.m | 20 + .../fixtures/Test_App/main copy.m | 23 + ObjectiveGitTests/fixtures/Test_App/main.m | 18 + 21 files changed, 7746 insertions(+) create mode 100644 ObjectiveGitTests/fixtures/Test_App/.gitignore create mode 100644 ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings create mode 100644 ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib create mode 100644 ObjectiveGitTests/fixtures/Test_App/README create mode 100644 ObjectiveGitTests/fixtures/Test_App/README1.txt create mode 100644 ObjectiveGitTests/fixtures/Test_App/REAME_ create mode 100644 ObjectiveGitTests/fixtures/Test_App/Test-Info.plist create mode 100644 ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchField.h create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchField.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h create mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch create mode 100644 ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/main copy.m create mode 100644 ObjectiveGitTests/fixtures/Test_App/main.m diff --git a/ObjectiveGitTests/fixtures/Test_App/.gitignore b/ObjectiveGitTests/fixtures/Test_App/.gitignore new file mode 100644 index 000000000..6ff33a286 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +*.swp +*~.nib + +build/* + +*.pbxuser +*.perspective +*.perspectivev3 + +*.mode1v3 +*.mode2v3 + +project.xcworkspace +*/xcuserdata/ diff --git a/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings b/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings new file mode 100644 index 000000000..b92732c79 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings @@ -0,0 +1 @@ +/* Localized versions of Info.plist keys */ diff --git a/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib b/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib new file mode 100644 index 000000000..a672169f8 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib @@ -0,0 +1,4229 @@ + + + + 1060 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 804 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + YES + + + Test + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + Test + + YES + + + About Test + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide Test + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit Test + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + YES + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + YES + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + YES + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + YES + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + YES + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + YES + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + YES + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + YES + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + YES + + + Font + + 2147483647 + + + submenuAction: + + Font + + YES + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + YES + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + Ligature + + YES + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + YES + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + YES + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + YES + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + YES + + + Test Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 123}, {882, 627}} + 1954021376 + Test + NSWindow + + {3.40282e+38, 3.40282e+38} + + + 256 + {882, 627} + + + + {{0, 0}, {1920, 1178}} + {3.40282e+38, 3.40282e+38} + + + TestAppDelegate + + + NSFontManager + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + addFontTrait: + + + + 421 + + + + addFontTrait: + + + + 422 + + + + modifyFont: + + + + 423 + + + + orderFrontFontPanel: + + + + 424 + + + + modifyFont: + + + + 425 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + terminate: + + + + 449 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + delegate + + + + 495 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + window + + + + 532 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + + + + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 217 + + + YES + + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + YES + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + YES + + + + + + 126 + + + + + 205 + + + YES + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + YES + + + + + + 216 + + + YES + + + + + + 200 + + + YES + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + YES + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + YES + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + YES + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + 297 + + + + + 298 + + + + + 211 + + + YES + + + + + + 212 + + + YES + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + YES + + + + + + 349 + + + YES + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + 375 + + + YES + + + + + + 376 + + + YES + + + + + + + 377 + + + YES + + + + + + 388 + + + YES + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + YES + + + + + + 398 + + + YES + + + + + + 399 + + + YES + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + YES + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + YES + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + YES + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 420 + + + + + 450 + + + YES + + + + + + 451 + + + YES + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + YES + + + + + + 491 + + + YES + + + + + + 492 + + + + + 494 + + + + + 496 + + + YES + + + + + + 497 + + + YES + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + YES + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + YES + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + + + YES + + YES + -3.IBPluginDependency + 112.IBPluginDependency + 112.ImportedFromIB2 + 124.IBPluginDependency + 124.ImportedFromIB2 + 125.IBPluginDependency + 125.ImportedFromIB2 + 125.editorWindowContentRectSynchronizationRect + 126.IBPluginDependency + 126.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 130.editorWindowContentRectSynchronizationRect + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 195.IBPluginDependency + 195.ImportedFromIB2 + 196.IBPluginDependency + 196.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 200.IBEditorWindowLastContentRect + 200.IBPluginDependency + 200.ImportedFromIB2 + 200.editorWindowContentRectSynchronizationRect + 201.IBPluginDependency + 201.ImportedFromIB2 + 202.IBPluginDependency + 202.ImportedFromIB2 + 203.IBPluginDependency + 203.ImportedFromIB2 + 204.IBPluginDependency + 204.ImportedFromIB2 + 205.IBEditorWindowLastContentRect + 205.IBPluginDependency + 205.ImportedFromIB2 + 205.editorWindowContentRectSynchronizationRect + 206.IBPluginDependency + 206.ImportedFromIB2 + 207.IBPluginDependency + 207.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 209.IBPluginDependency + 209.ImportedFromIB2 + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 212.IBPluginDependency + 212.ImportedFromIB2 + 212.editorWindowContentRectSynchronizationRect + 213.IBPluginDependency + 213.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 220.IBEditorWindowLastContentRect + 220.IBPluginDependency + 220.ImportedFromIB2 + 220.editorWindowContentRectSynchronizationRect + 221.IBPluginDependency + 221.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect + 24.IBPluginDependency + 24.ImportedFromIB2 + 24.editorWindowContentRectSynchronizationRect + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 29.WindowOrigin + 29.editorWindowContentRectSynchronizationRect + 295.IBPluginDependency + 296.IBEditorWindowLastContentRect + 296.IBPluginDependency + 296.editorWindowContentRectSynchronizationRect + 297.IBPluginDependency + 298.IBPluginDependency + 346.IBPluginDependency + 346.ImportedFromIB2 + 348.IBPluginDependency + 348.ImportedFromIB2 + 349.IBEditorWindowLastContentRect + 349.IBPluginDependency + 349.ImportedFromIB2 + 349.editorWindowContentRectSynchronizationRect + 350.IBPluginDependency + 350.ImportedFromIB2 + 351.IBPluginDependency + 351.ImportedFromIB2 + 354.IBPluginDependency + 354.ImportedFromIB2 + 371.IBEditorWindowLastContentRect + 371.IBPluginDependency + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.maxSize + 372.IBPluginDependency + 375.IBPluginDependency + 376.IBEditorWindowLastContentRect + 376.IBPluginDependency + 377.IBPluginDependency + 388.IBEditorWindowLastContentRect + 388.IBPluginDependency + 389.IBPluginDependency + 390.IBPluginDependency + 391.IBPluginDependency + 392.IBPluginDependency + 393.IBPluginDependency + 394.IBPluginDependency + 395.IBPluginDependency + 396.IBPluginDependency + 397.IBPluginDependency + 398.IBPluginDependency + 399.IBPluginDependency + 400.IBPluginDependency + 401.IBPluginDependency + 402.IBPluginDependency + 403.IBPluginDependency + 404.IBPluginDependency + 405.IBPluginDependency + 406.IBPluginDependency + 407.IBPluginDependency + 408.IBPluginDependency + 409.IBPluginDependency + 410.IBPluginDependency + 411.IBPluginDependency + 412.IBPluginDependency + 413.IBPluginDependency + 414.IBPluginDependency + 415.IBPluginDependency + 416.IBPluginDependency + 417.IBPluginDependency + 418.IBPluginDependency + 419.IBPluginDependency + 450.IBPluginDependency + 451.IBEditorWindowLastContentRect + 451.IBPluginDependency + 452.IBPluginDependency + 453.IBPluginDependency + 454.IBPluginDependency + 457.IBPluginDependency + 459.IBPluginDependency + 460.IBPluginDependency + 462.IBPluginDependency + 465.IBPluginDependency + 466.IBPluginDependency + 485.IBPluginDependency + 490.IBPluginDependency + 491.IBEditorWindowLastContentRect + 491.IBPluginDependency + 492.IBPluginDependency + 496.IBPluginDependency + 497.IBEditorWindowLastContentRect + 497.IBPluginDependency + 498.IBPluginDependency + 499.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 500.IBPluginDependency + 501.IBPluginDependency + 502.IBPluginDependency + 503.IBPluginDependency + 504.IBPluginDependency + 505.IBPluginDependency + 506.IBPluginDependency + 507.IBPluginDependency + 508.IBEditorWindowLastContentRect + 508.IBPluginDependency + 509.IBPluginDependency + 510.IBPluginDependency + 511.IBPluginDependency + 512.IBPluginDependency + 513.IBPluginDependency + 514.IBPluginDependency + 515.IBPluginDependency + 516.IBPluginDependency + 517.IBPluginDependency + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBEditorWindowLastContentRect + 57.IBPluginDependency + 57.ImportedFromIB2 + 57.editorWindowContentRectSynchronizationRect + 58.IBPluginDependency + 58.ImportedFromIB2 + 72.IBPluginDependency + 72.ImportedFromIB2 + 73.IBPluginDependency + 73.ImportedFromIB2 + 74.IBPluginDependency + 74.ImportedFromIB2 + 75.IBPluginDependency + 75.ImportedFromIB2 + 77.IBPluginDependency + 77.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 79.IBPluginDependency + 79.ImportedFromIB2 + 80.IBPluginDependency + 80.ImportedFromIB2 + 81.IBEditorWindowLastContentRect + 81.IBPluginDependency + 81.ImportedFromIB2 + 81.editorWindowContentRectSynchronizationRect + 82.IBPluginDependency + 82.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{522, 812}, {146, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{753, 187}, {275, 113}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {275, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{547, 180}, {254, 283}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{187, 434}, {243, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {167, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{753, 217}, {238, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {241, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{654, 239}, {194, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + {{380, 836}, {396, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{6, 978}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + {{604, 269}, {231, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{746, 287}, {220, 133}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {215, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{239, 135}, {882, 627}} + com.apple.InterfaceBuilder.CocoaPlugin + {{239, 135}, {882, 627}} + + {{33, 99}, {480, 360}} + {3.40282e+38, 3.40282e+38} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{591, 420}, {83, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{523, 2}, {178, 283}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{753, 197}, {170, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{725, 289}, {246, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{674, 260}, {204, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{878, 180}, {164, 173}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + {{286, 129}, {275, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{452, 109}, {196, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{145, 474}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 562 + + + + YES + + TestAppDelegate + NSObject + + window + NSWindow + + + window + + window + NSWindow + + + + IBProjectSource + TestAppDelegate.h + + + + + YES + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSApplication + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + id + id + id + id + id + id + + + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocument + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentScripting.h + + + + NSDocumentController + NSObject + + YES + + YES + clearRecentDocuments: + newDocument: + openDocument: + saveAllDocuments: + + + YES + id + id + id + id + + + + YES + + YES + clearRecentDocuments: + newDocument: + openDocument: + saveAllDocuments: + + + YES + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSFontManager + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSView + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSView+BWAdditions.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + NSWindow + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../Test.xcodeproj + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + + + diff --git a/ObjectiveGitTests/fixtures/Test_App/README b/ObjectiveGitTests/fixtures/Test_App/README new file mode 100644 index 000000000..69d7920c2 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/README @@ -0,0 +1,14 @@ +blah +blah +blah +blah +blah +blah +blah +blah +blah +blah +blah +blah +blah +2 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/README1.txt b/ObjectiveGitTests/fixtures/Test_App/README1.txt new file mode 100644 index 000000000..847cd4b33 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/README1.txt @@ -0,0 +1,26 @@ +The ftplugin directory is for Vim plugin scripts that are only used for a +specific filetype. + +All files ending in .vim in this directory and subdirectories will be sourced +by Vim when it detects the filetype that matches the name of the file or +subdirectory. +For example, these are all loaded for the "c" filetype: + + c.vim + c_extra.vim + c/settings.vim + +Note that the "_" in "c_extra.vim" is required to separate the filetype name +from the following arbitrary name. + +The filetype plugins are only loaded when the ":filetype plugin" command has +been used. + +The default filetype plugin files contain settings that 95% of the users will +want to use. They do not contain personal preferences, like the value of +'shiftwidth'. +ede + +If you want to do additional settings, or overrule the default filetype +plugin, you can create your own plugin file. See ":help ftplugin" in Vim. + diff --git a/ObjectiveGitTests/fixtures/Test_App/REAME_ b/ObjectiveGitTests/fixtures/Test_App/REAME_ new file mode 100644 index 000000000..8b4a21733 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/REAME_ @@ -0,0 +1 @@ +The wild west diff --git a/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist b/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist new file mode 100644 index 000000000..f696cb233 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj b/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj new file mode 100644 index 000000000..24b91641b --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj @@ -0,0 +1,557 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; + 256AC3DA0F4B6AC300CF3369 /* TestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */; }; + 516678331293193900628CF6 /* GHGitHubOrganization.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678321293193900628CF6 /* GHGitHubOrganization.m */; }; + 516678441293196400628CF6 /* NSError+GHClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678431293196400628CF6 /* NSError+GHClient.m */; }; + 516678471293198D00628CF6 /* GHImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678461293198D00628CF6 /* GHImageLoader.m */; }; + 5166784F129319C900628CF6 /* NSString+Git.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166784E129319C900628CF6 /* NSString+Git.m */; }; + 5166785612931A3100628CF6 /* GHGitBranch.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166785312931A3100628CF6 /* GHGitBranch.m */; }; + 5166785712931A3100628CF6 /* GHGitFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166785512931A3100628CF6 /* GHGitFile.m */; }; + 517FD97112530D97001DE593 /* GHGitRepository.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96912530D97001DE593 /* GHGitRepository.m */; }; + 517FD97212530D97001DE593 /* GHGitHubUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96B12530D97001DE593 /* GHGitHubUser.m */; }; + 517FD97312530D97001DE593 /* GHGitHubClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96D12530D97001DE593 /* GHGitHubClient.m */; }; + 517FD97412530D97001DE593 /* GHClientTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96F12530D97001DE593 /* GHClientTransaction.m */; }; + 517FD9A112530E73001DE593 /* CDataScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98912530E73001DE593 /* CDataScanner.m */; }; + 517FD9A212530E73001DE593 /* CExtensibleJSONDataSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */; }; + 517FD9A312530E73001DE593 /* CDataScanner_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */; }; + 517FD9A412530E73001DE593 /* NSCharacterSet_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */; }; + 517FD9A512530E73001DE593 /* NSDictionary_JSONExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */; }; + 517FD9A612530E73001DE593 /* NSScanner_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99512530E73001DE593 /* NSScanner_Extensions.m */; }; + 517FD9A712530E73001DE593 /* CJSONDataSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99812530E73001DE593 /* CJSONDataSerializer.m */; }; + 517FD9A812530E73001DE593 /* CJSONDeserializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99A12530E73001DE593 /* CJSONDeserializer.m */; }; + 517FD9A912530E73001DE593 /* CJSONScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99C12530E73001DE593 /* CJSONScanner.m */; }; + 517FD9AA12530E73001DE593 /* CJSONSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99E12530E73001DE593 /* CJSONSerializer.m */; }; + 517FD9AB12530E73001DE593 /* CSerializedJSONData.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD9A012530E73001DE593 /* CSerializedJSONData.m */; }; + 517FD9B712530F03001DE593 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD9B512530F03001DE593 /* NSData+Base64.m */; }; + 517FD9C112531F18001DE593 /* BWToolkitFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */; }; + 517FDB4912531F79001DE593 /* BWToolkitFramework.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */; }; + 517FDB6B12532C75001DE593 /* TestAppWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDB6A12532C75001DE593 /* TestAppWindowController.m */; }; + 517FDB6D12532CAD001DE593 /* TestAppWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */; }; + 517FDC0F1253D5B7001DE593 /* TestSearchField.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDC0E1253D5B7001DE593 /* TestSearchField.m */; }; + 517FDC121253D5C0001DE593 /* TestSearchFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */; }; + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 517FDB4712531F45001DE593 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 517FDB4912531F79001DE593 /* BWToolkitFramework.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; + 256AC3D80F4B6AC300CF3369 /* TestAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestAppDelegate.h; sourceTree = ""; }; + 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestAppDelegate.m; sourceTree = ""; }; + 256AC3F00F4B6AF500CF3369 /* Test_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Test_Prefix.pch; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 516678311293193900628CF6 /* GHGitHubOrganization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubOrganization.h; path = ../Objc_Client/GHGitHubOrganization.h; sourceTree = SOURCE_ROOT; }; + 516678321293193900628CF6 /* GHGitHubOrganization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubOrganization.m; path = ../Objc_Client/GHGitHubOrganization.m; sourceTree = SOURCE_ROOT; }; + 516678421293196400628CF6 /* NSError+GHClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSError+GHClient.h"; path = "../Objc_Client/NSError+GHClient.h"; sourceTree = SOURCE_ROOT; }; + 516678431293196400628CF6 /* NSError+GHClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSError+GHClient.m"; path = "../Objc_Client/NSError+GHClient.m"; sourceTree = SOURCE_ROOT; }; + 516678451293198D00628CF6 /* GHImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHImageLoader.h; path = ../Objc_Client/GHImageLoader.h; sourceTree = SOURCE_ROOT; }; + 516678461293198D00628CF6 /* GHImageLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHImageLoader.m; path = ../Objc_Client/GHImageLoader.m; sourceTree = SOURCE_ROOT; }; + 5166784D129319C900628CF6 /* NSString+Git.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+Git.h"; path = "../Objc_Client/NSString+Git.h"; sourceTree = SOURCE_ROOT; }; + 5166784E129319C900628CF6 /* NSString+Git.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+Git.m"; path = "../Objc_Client/NSString+Git.m"; sourceTree = SOURCE_ROOT; }; + 5166785212931A3100628CF6 /* GHGitBranch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitBranch.h; path = ../Objc_Client/GHGitBranch.h; sourceTree = SOURCE_ROOT; }; + 5166785312931A3100628CF6 /* GHGitBranch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitBranch.m; path = ../Objc_Client/GHGitBranch.m; sourceTree = SOURCE_ROOT; }; + 5166785412931A3100628CF6 /* GHGitFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitFile.h; path = ../Objc_Client/GHGitFile.h; sourceTree = SOURCE_ROOT; }; + 5166785512931A3100628CF6 /* GHGitFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitFile.m; path = ../Objc_Client/GHGitFile.m; sourceTree = SOURCE_ROOT; }; + 517FD96912530D97001DE593 /* GHGitRepository.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitRepository.m; path = ../Objc_Client/GHGitRepository.m; sourceTree = SOURCE_ROOT; }; + 517FD96A12530D97001DE593 /* GHGitRepository.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitRepository.h; path = ../Objc_Client/GHGitRepository.h; sourceTree = SOURCE_ROOT; }; + 517FD96B12530D97001DE593 /* GHGitHubUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubUser.m; path = ../Objc_Client/GHGitHubUser.m; sourceTree = SOURCE_ROOT; }; + 517FD96C12530D97001DE593 /* GHGitHubUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubUser.h; path = ../Objc_Client/GHGitHubUser.h; sourceTree = SOURCE_ROOT; }; + 517FD96D12530D97001DE593 /* GHGitHubClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubClient.m; path = ../Objc_Client/GHGitHubClient.m; sourceTree = SOURCE_ROOT; }; + 517FD96E12530D97001DE593 /* GHGitHubClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubClient.h; path = ../Objc_Client/GHGitHubClient.h; sourceTree = SOURCE_ROOT; }; + 517FD96F12530D97001DE593 /* GHClientTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHClientTransaction.m; path = ../Objc_Client/GHClientTransaction.m; sourceTree = SOURCE_ROOT; }; + 517FD97012530D97001DE593 /* GHClientTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHClientTransaction.h; path = ../Objc_Client/GHClientTransaction.h; sourceTree = SOURCE_ROOT; }; + 517FD98812530E73001DE593 /* CDataScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDataScanner.h; path = ../TouchJSON/Source/CDataScanner.h; sourceTree = SOURCE_ROOT; }; + 517FD98912530E73001DE593 /* CDataScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDataScanner.m; path = ../TouchJSON/Source/CDataScanner.m; sourceTree = SOURCE_ROOT; }; + 517FD98B12530E73001DE593 /* CExtensibleJSONDataSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtensibleJSONDataSerializer.h; sourceTree = ""; }; + 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtensibleJSONDataSerializer.m; sourceTree = ""; }; + 517FD98E12530E73001DE593 /* CDataScanner_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDataScanner_Extensions.h; sourceTree = ""; }; + 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDataScanner_Extensions.m; sourceTree = ""; }; + 517FD99012530E73001DE593 /* NSCharacterSet_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCharacterSet_Extensions.h; sourceTree = ""; }; + 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCharacterSet_Extensions.m; sourceTree = ""; }; + 517FD99212530E73001DE593 /* NSDictionary_JSONExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDictionary_JSONExtensions.h; sourceTree = ""; }; + 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDictionary_JSONExtensions.m; sourceTree = ""; }; + 517FD99412530E73001DE593 /* NSScanner_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSScanner_Extensions.h; sourceTree = ""; }; + 517FD99512530E73001DE593 /* NSScanner_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSScanner_Extensions.m; sourceTree = ""; }; + 517FD99712530E73001DE593 /* CJSONDataSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONDataSerializer.h; sourceTree = ""; }; + 517FD99812530E73001DE593 /* CJSONDataSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONDataSerializer.m; sourceTree = ""; }; + 517FD99912530E73001DE593 /* CJSONDeserializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONDeserializer.h; sourceTree = ""; }; + 517FD99A12530E73001DE593 /* CJSONDeserializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONDeserializer.m; sourceTree = ""; }; + 517FD99B12530E73001DE593 /* CJSONScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONScanner.h; sourceTree = ""; }; + 517FD99C12530E73001DE593 /* CJSONScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONScanner.m; sourceTree = ""; }; + 517FD99D12530E73001DE593 /* CJSONSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONSerializer.h; sourceTree = ""; }; + 517FD99E12530E73001DE593 /* CJSONSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONSerializer.m; sourceTree = ""; }; + 517FD99F12530E73001DE593 /* CSerializedJSONData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSerializedJSONData.h; sourceTree = ""; }; + 517FD9A012530E73001DE593 /* CSerializedJSONData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSerializedJSONData.m; sourceTree = ""; }; + 517FD9B512530F03001DE593 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "../Objc_Client/NSData+Base64.m"; sourceTree = SOURCE_ROOT; }; + 517FD9B612530F03001DE593 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "../Objc_Client/NSData+Base64.h"; sourceTree = SOURCE_ROOT; }; + 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BWToolkitFramework.framework; path = /Users/ricioppo/Source/GitHub/BWToolkitFramework.framework; sourceTree = ""; }; + 517FDB6912532C75001DE593 /* TestAppWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestAppWindowController.h; sourceTree = ""; }; + 517FDB6A12532C75001DE593 /* TestAppWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestAppWindowController.m; sourceTree = ""; }; + 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestAppWindow.xib; sourceTree = ""; }; + 517FDC0D1253D5B7001DE593 /* TestSearchField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSearchField.h; sourceTree = ""; }; + 517FDC0E1253D5B7001DE593 /* TestSearchField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSearchField.m; sourceTree = ""; }; + 517FDC101253D5C0001DE593 /* TestSearchFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSearchFieldCell.h; sourceTree = ""; }; + 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSearchFieldCell.m; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Test-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Test-Info.plist"; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Test.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 517FD9C112531F18001DE593 /* BWToolkitFramework.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 256AC3D80F4B6AC300CF3369 /* TestAppDelegate.h */, + 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */, + 517FDB6812532C4C001DE593 /* Window Controller */, + 517FD96312530D84001DE593 /* GitHub Client */, + 517FDC0C1253D583001DE593 /* Controls */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* Test.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* Test */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 517FD98212530E56001DE593 /* Libraries */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = Test; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 256AC3F00F4B6AF500CF3369 /* Test_Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D1107310486CEB800E47090 /* Test-Info.plist */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, + 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 516678341293193F00628CF6 /* Utilities */ = { + isa = PBXGroup; + children = ( + 516678451293198D00628CF6 /* GHImageLoader.h */, + 516678461293198D00628CF6 /* GHImageLoader.m */, + 517FD9B512530F03001DE593 /* NSData+Base64.m */, + 517FD9B612530F03001DE593 /* NSData+Base64.h */, + 516678421293196400628CF6 /* NSError+GHClient.h */, + 516678431293196400628CF6 /* NSError+GHClient.m */, + 5166784D129319C900628CF6 /* NSString+Git.h */, + 5166784E129319C900628CF6 /* NSString+Git.m */, + ); + name = Utilities; + sourceTree = ""; + }; + 517FD96312530D84001DE593 /* GitHub Client */ = { + isa = PBXGroup; + children = ( + 517FD96E12530D97001DE593 /* GHGitHubClient.h */, + 517FD96D12530D97001DE593 /* GHGitHubClient.m */, + 517FD97012530D97001DE593 /* GHClientTransaction.h */, + 517FD96F12530D97001DE593 /* GHClientTransaction.m */, + 517FD97512530DA3001DE593 /* Model */, + ); + name = "GitHub Client"; + sourceTree = ""; + }; + 517FD97512530DA3001DE593 /* Model */ = { + isa = PBXGroup; + children = ( + 517FD96A12530D97001DE593 /* GHGitRepository.h */, + 517FD96912530D97001DE593 /* GHGitRepository.m */, + 5166785212931A3100628CF6 /* GHGitBranch.h */, + 5166785312931A3100628CF6 /* GHGitBranch.m */, + 5166785412931A3100628CF6 /* GHGitFile.h */, + 5166785512931A3100628CF6 /* GHGitFile.m */, + 517FD96C12530D97001DE593 /* GHGitHubUser.h */, + 517FD96B12530D97001DE593 /* GHGitHubUser.m */, + 516678311293193900628CF6 /* GHGitHubOrganization.h */, + 516678321293193900628CF6 /* GHGitHubOrganization.m */, + 516678341293193F00628CF6 /* Utilities */, + ); + name = Model; + sourceTree = ""; + }; + 517FD98212530E56001DE593 /* Libraries */ = { + isa = PBXGroup; + children = ( + 517FD98312530E5D001DE593 /* TouchJSON */, + ); + name = Libraries; + sourceTree = ""; + }; + 517FD98312530E5D001DE593 /* TouchJSON */ = { + isa = PBXGroup; + children = ( + 517FD98812530E73001DE593 /* CDataScanner.h */, + 517FD98912530E73001DE593 /* CDataScanner.m */, + 517FD98A12530E73001DE593 /* Experimental */, + 517FD98D12530E73001DE593 /* Extensions */, + 517FD99612530E73001DE593 /* JSON */, + ); + name = TouchJSON; + sourceTree = ""; + }; + 517FD98A12530E73001DE593 /* Experimental */ = { + isa = PBXGroup; + children = ( + 517FD98B12530E73001DE593 /* CExtensibleJSONDataSerializer.h */, + 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */, + ); + name = Experimental; + path = ../TouchJSON/Source/Experimental; + sourceTree = SOURCE_ROOT; + }; + 517FD98D12530E73001DE593 /* Extensions */ = { + isa = PBXGroup; + children = ( + 517FD98E12530E73001DE593 /* CDataScanner_Extensions.h */, + 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */, + 517FD99012530E73001DE593 /* NSCharacterSet_Extensions.h */, + 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */, + 517FD99212530E73001DE593 /* NSDictionary_JSONExtensions.h */, + 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */, + 517FD99412530E73001DE593 /* NSScanner_Extensions.h */, + 517FD99512530E73001DE593 /* NSScanner_Extensions.m */, + ); + name = Extensions; + path = ../TouchJSON/Source/Extensions; + sourceTree = SOURCE_ROOT; + }; + 517FD99612530E73001DE593 /* JSON */ = { + isa = PBXGroup; + children = ( + 517FD99712530E73001DE593 /* CJSONDataSerializer.h */, + 517FD99812530E73001DE593 /* CJSONDataSerializer.m */, + 517FD99912530E73001DE593 /* CJSONDeserializer.h */, + 517FD99A12530E73001DE593 /* CJSONDeserializer.m */, + 517FD99B12530E73001DE593 /* CJSONScanner.h */, + 517FD99C12530E73001DE593 /* CJSONScanner.m */, + 517FD99D12530E73001DE593 /* CJSONSerializer.h */, + 517FD99E12530E73001DE593 /* CJSONSerializer.m */, + 517FD99F12530E73001DE593 /* CSerializedJSONData.h */, + 517FD9A012530E73001DE593 /* CSerializedJSONData.m */, + ); + name = JSON; + path = ../TouchJSON/Source/JSON; + sourceTree = SOURCE_ROOT; + }; + 517FDB6812532C4C001DE593 /* Window Controller */ = { + isa = PBXGroup; + children = ( + 517FDB6912532C75001DE593 /* TestAppWindowController.h */, + 517FDB6A12532C75001DE593 /* TestAppWindowController.m */, + ); + name = "Window Controller"; + sourceTree = ""; + }; + 517FDC0C1253D583001DE593 /* Controls */ = { + isa = PBXGroup; + children = ( + 517FDC0D1253D5B7001DE593 /* TestSearchField.h */, + 517FDC0E1253D5B7001DE593 /* TestSearchField.m */, + 517FDC101253D5C0001DE593 /* TestSearchFieldCell.h */, + 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */, + ); + name = Controls; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* Test */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Test" */; + buildPhases = ( + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + 517FDB4712531F45001DE593 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Test; + productInstallPath = "$(HOME)/Applications"; + productName = Test; + productReference = 8D1107320486CEB800E47090 /* Test.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + ORGANIZATIONNAME = GitHub; + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Test" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* Test */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D1107260486CEB800E47090 /* Test */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, + 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, + 517FDB6D12532CAD001DE593 /* TestAppWindow.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072D0486CEB800E47090 /* main.m in Sources */, + 256AC3DA0F4B6AC300CF3369 /* TestAppDelegate.m in Sources */, + 517FD97112530D97001DE593 /* GHGitRepository.m in Sources */, + 517FD97212530D97001DE593 /* GHGitHubUser.m in Sources */, + 517FD97312530D97001DE593 /* GHGitHubClient.m in Sources */, + 517FD97412530D97001DE593 /* GHClientTransaction.m in Sources */, + 517FD9A112530E73001DE593 /* CDataScanner.m in Sources */, + 517FD9A212530E73001DE593 /* CExtensibleJSONDataSerializer.m in Sources */, + 517FD9A312530E73001DE593 /* CDataScanner_Extensions.m in Sources */, + 517FD9A412530E73001DE593 /* NSCharacterSet_Extensions.m in Sources */, + 517FD9A512530E73001DE593 /* NSDictionary_JSONExtensions.m in Sources */, + 517FD9A612530E73001DE593 /* NSScanner_Extensions.m in Sources */, + 517FD9A712530E73001DE593 /* CJSONDataSerializer.m in Sources */, + 517FD9A812530E73001DE593 /* CJSONDeserializer.m in Sources */, + 517FD9A912530E73001DE593 /* CJSONScanner.m in Sources */, + 517FD9AA12530E73001DE593 /* CJSONSerializer.m in Sources */, + 517FD9AB12530E73001DE593 /* CSerializedJSONData.m in Sources */, + 517FD9B712530F03001DE593 /* NSData+Base64.m in Sources */, + 517FDB6B12532C75001DE593 /* TestAppWindowController.m in Sources */, + 517FDC0F1253D5B7001DE593 /* TestSearchField.m in Sources */, + 517FDC121253D5C0001DE593 /* TestSearchFieldCell.m in Sources */, + 516678331293193900628CF6 /* GHGitHubOrganization.m in Sources */, + 516678441293196400628CF6 /* NSError+GHClient.m in Sources */, + 516678471293198D00628CF6 /* GHImageLoader.m in Sources */, + 5166784F129319C900628CF6 /* NSString+Git.m in Sources */, + 5166785612931A3100628CF6 /* GHGitBranch.m in Sources */, + 5166785712931A3100628CF6 /* GHGitFile.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 1DDD58150DA1D0A300B32029 /* English */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/..\"", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Test_Prefix.pch; + INFOPLIST_FILE = "Test-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Test; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/..\"", + ); + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Test_Prefix.pch; + INFOPLIST_FILE = "Test-Info.plist"; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = Test; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h new file mode 100644 index 000000000..2859ba1e4 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h @@ -0,0 +1,17 @@ +// +// TestAppDelegate.h +// Test +// +// Created by Joe Ricioppo on 9/28/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import + +@class TestAppWindowController; + +@interface TestAppDelegate : NSObject {} + +@property (nonatomic, retain) TestAppWindowController *windowController; + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m new file mode 100644 index 000000000..b5ccf61e8 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m @@ -0,0 +1,22 @@ +// +// TestAppDelegate.m +// Test +// +// Created by Joe Ricioppo on 9/28/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import "TestAppDelegate.h" +#import "TestAppWindowController.h" + +@implementation TestAppDelegate + +@synthesize windowController; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + + self.windowController = [[TestAppWindowController alloc] initWithWindowNibName:@"TestAppWindow"]; + [self.windowController showWindow:self]; +} + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib b/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib new file mode 100644 index 000000000..aec9598c4 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib @@ -0,0 +1,2572 @@ + + + + 1060 + 10F569 + 804 + 1038.29 + 461.00 + + YES + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.brandonwalkin.BWToolkit + + + YES + 804 + 1.2.5 + + + + YES + + + + YES + com.brandonwalkin.BWToolkit + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + TestAppWindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {480, 270}} + 544735232 + Window + NSWindow + + {3.40282e+38, 3.40282e+38} + + + 256 + {480, 270} + + {{0, 0}, {1680, 1028}} + {3.40282e+38, 3.40282e+38} + + + 8223 + 2 + {{247, 193}, {836, 587}} + 611844096 + Window + NSPanel + + {400, 300} + + + 256 + + YES + + + 268 + {{19, 545}, {139, 22}} + + YES + + -2076049856 + 133120 + + LucidaGrande + 11 + 16 + + + 109199615 + 129 + + + 400 + 75 + + + Item 1 + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Item 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item 3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 1 + YES + YES + 2 + + + + + 4370 + + YES + + + 2304 + + YES + + + 4352 + {491, 521} + + YES + + + -2147483392 + {{-26, 0}, {16, 17}} + + + YES + + 488 + 40 + 1000 + + 75628032 + 0 + + + LucidaGrande + 11 + 3100 + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + 3 + MAA + + + + + 337772096 + 2048 + Text Cell + + LucidaGrande-Bold + 11 + 16 + + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2ODY1AA + + + + 1 + MSAxIDEAA + + + 3 + YES + + + + 3 + 2 + + 4 + MSAwLjE0MDAwMDAwMDYAA + + + 6 + System + gridColor + + 3 + MC41AA + + + 20 + -692060160 + + + 4 + 15 + 0 + YES + 0 + + + {491, 521} + + + + + 4 + + + + -2147483392 + {{-100, -100}, {15, 120}} + + 2 + + _doScroller: + 0.99253731966018677 + + + + -2147483392 + {{-100, -100}, {225, 15}} + + 1 + + _doScroller: + 0.57142859697341919 + + + {{21, 20}, {491, 521}} + + + 528 + + + + QSAAAEEgAABBsAAAQbAAAA + + + + 266 + {{162, 551}, {654, 14}} + + YES + + 338820672 + 272761856 + + + + YES + + 1 + MC40OTI1MzcxNDA4IDAuNTQ0OTk5MTgyMiAwLjU5MTgzNjc1MDUAA + + + YES + YES + NO + + 1 + MCAwIDAAA + + + YES + + YES + NSColor + NSFont + NSOriginalFont + NSParagraphStyle + NSShadow + + + YES + + 1 + MC40OTI1MzcxNDA4IDAuNTQ0OTk5MTgyMiAwLjU5MTgzNjc1MDUAA + + + + + 4 + 2 + + + + -1 + + + + + + 1 + MC4zMjk3MTQ5MjQxIDAuMzc5MjE3MjY3IDAuNDMzNjczNDcxMgA + + + 1 + MC41NjA2NDczNjg0IDAuNjA1Mzg4OTk5IDAuNjU4MTYzMjQ5NQA + + + + + + + 265 + {{565, 527}, {39, 14}} + + YES + + 68288064 + 272761856 + Name: + + + + 6 + System + controlColor + + + + 6 + System + controlTextColor + + + + + + + 265 + {{535, 442}, {69, 14}} + + YES + + 68288064 + 272761856 + Description: + + + + + + + + + 265 + + YES + + + 2304 + + YES + + + 2322 + {193, 216} + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum Et harumd und lookum like Greek to me, dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda + + + YES + + YES + + YES + NSColor + NSFont + NSParagraphStyle + + + YES + + 1 + MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA + + + LucidaGrande + 10 + 2843 + + + 3 + + YES + + 0.0 + + + 56 + + + 112 + + + 168 + + + 224 + + + 280 + + + 336 + + + 392 + + + 448 + + + 504 + + + 560 + + + 616 + + + 672 + + + 728 + + + 784 + + + 840 + + + 896 + + + 952 + + + 1008 + + + 1064 + + + 1120 + + + 1176 + + + 1232 + + + 1288 + + + 1344 + + + 1400 + + + 1456 + + + 1512 + + + 1568 + + + 1624 + + + 1680 + + + 1736 + + + + + + + YES + + YES + NSColor + NSFont + NSParagraphStyle + + + YES + + + LucidaGrande-Bold + 10 + 16 + + + 3 + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GQAEAQgADAEiAAcBhAQAA + + + + + YES + + + 6 + + + + 193 + 1 + + + 2757 + 0 + + + + YES + + YES + NSBackgroundColor + NSColor + + + YES + + 6 + System + selectedTextBackgroundColor + + + + 6 + System + selectedTextColor + + + + + + 3 + MC44MTM4Njg2NDE5AA + + + YES + + YES + NSColor + NSUnderline + + + YES + + 1 + MCAwIDEAA + + + + + + + 6 + {480, 1e+07} + {180, 135} + + + + {193, 102} + + + + + 3 + MQA + + + {4, -5} + 1 + + 2 + + + + 256 + {{193, 0}, {12, 102}} + + YES + 2 + + _doScroller: + 0.47222220897674561 + + + + -2147483392 + {{-100, -100}, {87, 18}} + + 1 + + _doScroller: + 1 + 0.94565218687057495 + + + {{610, 354}, {205, 102}} + + + 592 + + + + + + + 265 + {{606, 527}, {213, 14}} + + YES + + 68288064 + 272761856 + + + repo + + + + + + + + 265 + {{539, 505}, {65, 14}} + + YES + + 68288064 + 272761856 + Homepage: + + + + + + + + + 265 + {{606, 505}, {213, 14}} + + YES + + 68288064 + 272761856 + + + url + + + + + + + + 265 + {{567, 483}, {37, 14}} + + YES + + 68288064 + 272761856 + Forks: + + + + + + + + + 265 + {{606, 483}, {213, 14}} + + YES + + 68288064 + 272761856 + + + billions + + + + + + + + 265 + {{563, 464}, {41, 14}} + + YES + + 68288064 + 272761856 + Issues: + + + + + + + + + 265 + {{606, 464}, {213, 14}} + + YES + + 68288064 + 272761856 + + + none + + + + + + + + 268 + {{537, 313}, {81, 28}} + + YES + + 67239424 + 134348800 + Follow + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{629, 313}, {81, 28}} + + YES + + 67239424 + 134348800 + Fork + + + -2038284033 + 129 + + + 200 + 25 + + + + {836, 587} + + + {{0, 0}, {1440, 878}} + {400, 319} + {3.40282e+38, 3.40282e+38} + + + YES + + + + YES + name + searchResults + homepage + numberOfForks + numberOfIssues + repoDescription + @count + + YES + + YES + YES + YES + YES + YES + + + + + YES + + + window + + + + 19 + + + + searchPredicatePopupButton + + + + 21 + + + + searchRelultsTableView + + + + 22 + + + + searchField + + + + 33 + + + + value: searchString + + + + + + value: searchString + value + searchString + 2 + + + 37 + + + + content: searchPredicates + + + + + + content: searchPredicates + content + searchPredicates + 2 + + + 40 + + + + searchGitHub: + + + + 44 + + + + contentArray: searchResults + + + + + + contentArray: searchResults + contentArray + searchResults + 2 + + + 49 + + + + searchResultsArrayController + + + + 50 + + + + value: arrangedObjects.name + + + + + + value: arrangedObjects.name + value + arrangedObjects.name + + YES + + YES + NSConditionallySetsEditable + NSRaisesForNotApplicableKeys + + + YES + + + + + 2 + + + 55 + + + + value: selection.name + + + + + + value: selection.name + value + selection.name + + YES + + YES + NSNoSelectionPlaceholder + NSRaisesForNotApplicableKeys + + + YES + repo + + + + 2 + + + 122 + + + + value: selection.numberOfIssues + + + + + + value: selection.numberOfIssues + value + selection.numberOfIssues + + YES + + YES + NSNoSelectionPlaceholder + NSNullPlaceholder + NSRaisesForNotApplicableKeys + + + YES + none + none + + + + 2 + + + 128 + + + + value: selection.numberOfForks + + + + + + value: selection.numberOfForks + value + selection.numberOfForks + + YES + + YES + NSNoSelectionPlaceholder + NSNullPlaceholder + NSRaisesForNotApplicableKeys + + + YES + billions + none + + + + 2 + + + 129 + + + + value: selection.homepage + + + + + + value: selection.homepage + value + selection.homepage + + YES + + YES + NSNoSelectionPlaceholder + NSNullPlaceholder + NSRaisesForNotApplicableKeys + + + YES + url + slacker + + + + 2 + + + 132 + + + + attributedString: selection.repoDescription + + + + + + attributedString: selection.repoDescription + attributedString + selection.repoDescription + + YES + + YES + NSConditionallySetsEditable + NSNoSelectionPlaceholder + NSNullPlaceholder + NSRaisesForNotApplicableKeys + + + YES + + it's awesome + slacker + + + + 2 + + + 133 + + + + enabled: selectedObjects.@count + + + + + + enabled: selectedObjects.@count + enabled + selectedObjects.@count + + NSRaisesForNotApplicableKeys + + + 2 + + + 145 + + + + enabled: selectedObjects.@count + + + + + + enabled: selectedObjects.@count + enabled + selectedObjects.@count + 2 + + + 148 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + + + 3 + + + YES + + + + + + 4 + + + YES + + + + + + + + + + + + + + + + + + + + 6 + + + YES + + + + + + + + 7 + + + YES + + + + + + 8 + + + YES + + + + + + 9 + + + YES + + + + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + YES + + + + + + 14 + + + + + 15 + + + + + 16 + + + YES + + + + + + 17 + + + + + 23 + + + + + 31 + + + YES + + + + + + 32 + + + + + 45 + + + searchResultsArrayController + + + 58 + + + YES + + + + + + 59 + + + + + 60 + + + YES + + + + + + 61 + + + + + 62 + + + YES + + + + + + + + 63 + + + + + 64 + + + + + 65 + + + + + 66 + + + YES + + + + + + 67 + + + + + 68 + + + YES + + + + + + 69 + + + YES + + + + + + 70 + + + + + 71 + + + + + 72 + + + YES + + + + + + 73 + + + YES + + + + + + 74 + + + + + 75 + + + + + 76 + + + YES + + + + + + 77 + + + YES + + + + + + 78 + + + + + 79 + + + + + 134 + + + YES + + + + + + 135 + + + + + 136 + + + YES + + + + + + 137 + + + + + + + YES + + YES + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 1.WindowOrigin + 1.editorWindowContentRectSynchronizationRect + 10.IBPluginDependency + 11.IBPluginDependency + 12.IBPluginDependency + 13.IBPluginDependency + 134.IBPluginDependency + 134.IBViewBoundsToFrameTransform + 135.IBPluginDependency + 136.IBPluginDependency + 136.IBViewBoundsToFrameTransform + 137.IBPluginDependency + 14.IBPluginDependency + 15.IBPluginDependency + 16.IBPluginDependency + 17.IBPluginDependency + 2.IBPluginDependency + 3.IBEditorWindowLastContentRect + 3.IBPluginDependency + 3.IBWindowTemplateEditedContentRect + 3.NSWindowTemplate.visibleAtLaunch + 3.windowTemplate.hasMinSize + 3.windowTemplate.minSize + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 4.IBPluginDependency + 45.IBPluginDependency + 58.IBPluginDependency + 58.IBViewBoundsToFrameTransform + 59.IBPluginDependency + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + 61.IBPluginDependency + 62.IBPluginDependency + 62.IBViewBoundsToFrameTransform + 63.IBPluginDependency + 64.IBPluginDependency + 65.IBPluginDependency + 66.IBPluginDependency + 66.IBViewBoundsToFrameTransform + 67.IBPluginDependency + 68.IBPluginDependency + 68.IBViewBoundsToFrameTransform + 69.IBPluginDependency + 69.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 70.IBPluginDependency + 71.IBPluginDependency + 72.IBPluginDependency + 72.IBViewBoundsToFrameTransform + 73.IBPluginDependency + 73.IBViewBoundsToFrameTransform + 74.IBPluginDependency + 75.IBPluginDependency + 76.IBPluginDependency + 76.IBViewBoundsToFrameTransform + 77.IBPluginDependency + 77.IBViewBoundsToFrameTransform + 78.IBPluginDependency + 79.IBPluginDependency + 8.IBPluginDependency + 9.IBEditorWindowLastContentRect + 9.IBPluginDependency + + + YES + {{322, 586}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + {{322, 586}, {480, 270}} + + {196, 240} + {{202, 428}, {480, 270}} + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEBkAAw6mAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEBkAAw6mAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.apple.InterfaceBuilder.CocoaPlugin + {{256, 152}, {836, 587}} + com.apple.InterfaceBuilder.CocoaPlugin + {{256, 152}, {836, 587}} + + + {400, 300} + com.brandonwalkin.BWToolkit + + P4AAAL+AAABDIgAAxAzAAA + + com.brandonwalkin.BWToolkit + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEDUAAxAbAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABBqAAAxAbAAA + + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEBcAAxAFAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEGIAAxAFAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEF4AAxAbAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEBsAAxAFAAA + + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEF4AAxAFAAA + + com.brandonwalkin.BWToolkit + + P4AAAL+AAABBmAAAxA1AAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEDcAAw/eAAA + + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEF4AAw/eAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEDcAAw/eAAA + + com.brandonwalkin.BWToolkit + + P4AAAL+AAABEF4AAw/eAAA + + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + com.brandonwalkin.BWToolkit + {{282, 657}, {139, 54}} + com.brandonwalkin.BWToolkit + + + + YES + + + YES + + + + + YES + + + YES + + + + 148 + + + + YES + + TestAppWindowController + NSWindowController + + searchGitHub: + id + + + searchGitHub: + + searchGitHub: + id + + + + YES + + YES + searchField + searchPredicatePopupButton + searchRelultsTableView + searchResultsArrayController + + + YES + BWStyledTextField + BWTransparentPopUpButton + BWTransparentTableView + NSArrayController + + + + YES + + YES + searchField + searchPredicatePopupButton + searchRelultsTableView + searchResultsArrayController + + + YES + + searchField + BWStyledTextField + + + searchPredicatePopupButton + BWTransparentPopUpButton + + + searchRelultsTableView + BWTransparentTableView + + + searchResultsArrayController + NSArrayController + + + + + IBProjectSource + TestAppWindowController.h + + + + + YES + + BWStyledTextField + NSTextField + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWStyledTextField.h + + + + BWStyledTextFieldCell + NSTextFieldCell + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWStyledTextFieldCell.h + + + + BWTransparentButton + NSButton + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentButton.h + + + + BWTransparentButtonCell + NSButtonCell + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentButtonCell.h + + + + BWTransparentPopUpButton + NSPopUpButton + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentPopUpButton.h + + + + BWTransparentPopUpButtonCell + NSPopUpButtonCell + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentPopUpButtonCell.h + + + + BWTransparentScrollView + NSScrollView + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentScrollView.h + + + + BWTransparentScroller + NSScroller + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentScroller.h + + + + BWTransparentTableView + NSTableView + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentTableView.h + + + + BWTransparentTableViewCell + NSTextFieldCell + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentTableViewCell.h + + + + BWTransparentTextFieldCell + NSTextFieldCell + + IBFrameworkSource + BWToolkitFramework.framework/Headers/BWTransparentTextFieldCell.h + + + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSApplication + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h + + + + NSArrayController + NSObjectController + + IBFrameworkSource + AppKit.framework/Headers/NSArrayController.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSController + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSController.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSManagedObjectContext + NSObject + + IBFrameworkSource + CoreData.framework/Headers/NSManagedObjectContext.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMenuItemCell + NSButtonCell + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItemCell.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObjectController + NSController + + IBFrameworkSource + AppKit.framework/Headers/NSObjectController.h + + + + NSPanel + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSPanel.h + + + + NSPopUpButton + NSButton + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButton.h + + + + NSPopUpButtonCell + NSMenuItemCell + + IBFrameworkSource + AppKit.framework/Headers/NSPopUpButtonCell.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSScrollView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSScrollView.h + + + + NSScroller + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSScroller.h + + + + NSTableColumn + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableColumn.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSUserDefaultsController + NSController + + IBFrameworkSource + AppKit.framework/Headers/NSUserDefaultsController.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSView + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSView+BWAdditions.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + NSWindow + + IBFrameworkSource + BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h + + + + NSWindowController + NSResponder + + showWindow: + id + + + showWindow: + + showWindow: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSWindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + Test.xcodeproj + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + + + diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h new file mode 100644 index 000000000..157951e32 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h @@ -0,0 +1,27 @@ +// +// TestAppWindowController.h +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// duuuuuuuude + +#import +#import + +@interface TestAppWindowController : NSWindowController {} + +@property (nonatomic, copy) NSString *searchString; +@property (nonatomic, retain) IBOutlet BWStyledTextField *searchField; + +@property (nonatomic, retain) NSArray *searchPredicates; +@property (nonatomic, retain) IBOutlet BWTransparentPopUpButton *searchPredicatePopupButton; + +@property (nonatomic, copy) NSArray *searchResults; +@property (nonatomic, retain) IBOutlet NSArrayController *searchResultsArrayController; +@property (nonatomic, retain) IBOutlet BWTransparentTableView *searchRelultsTableView; + + +- (IBAction)searchGitHub:(id)sender; + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m new file mode 100644 index 000000000..687dc23bd --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m @@ -0,0 +1,87 @@ +// +// TestAppWindowController.m +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import "TestAppWindowController.h" +#import "GHGitHubClient.h" +#import "GHGitHubUser.h" +#import "GHGitRepository.h" + +static NSString * const kEverything = @"Everything"; +static NSString * const kRepositories = @"Repositories"; +static NSString * const kUsers = @"Users"; +static NSString * const kCode = @"Code"; + +enum { GHSearchPredicateEverything = 0, GHSearchPredicateRepositories, GHSearchPredicateUsers, GHSearchPredicateCode}; + +@interface TestAppWindowController () +- (NSArray *)unknownUserResults; +@end + + +@implementation TestAppWindowController + +@synthesize searchString; +@synthesize searchField; + +@synthesize searchPredicates; +@synthesize searchPredicatePopupButton; + +@synthesize searchResults; +@synthesize searchResultsArrayController; +@synthesize searchRelultsTableView; + +- (void)dealloc { + + self.searchString = nil; + self.searchResults = nil; + self.searchPredicates = nil; + [super dealloc]; +} + +#pragma mark - + +- (void)windowDidLoad { + + [self.window setHidesOnDeactivate:YES]; + + self.searchPredicates = [NSArray arrayWithObjects: kEverything, kRepositories, kUsers, kCode, nil]; + + [[GHGitHubClient sharedClient] requestRepositoryWithName:@"controls" forUserWithName:@"joericioppo" completionBlock:^(GHGitRepository *repository, NSError *error) { + NSLog(@"[%@ %s], repository: %@", self, _cmd, repository); + }]; +} + +- (IBAction)searchGitHub:(id)sender { + + NSInteger selectedPredicate = [self.searchPredicatePopupButton indexOfSelectedItem]; + + switch (selectedPredicate) { + case GHSearchPredicateEverything: + break; + case GHSearchPredicateRepositories: + break; + case GHSearchPredicateUsers: + [[GHGitHubClient sharedClient] requestRepositoriesForUserWithName:self.searchString completionBlock:^(NSArray *repositories, NSError *error) { + self.searchResults = repositories ?: [self unknownUserResults]; + }]; + break; + case GHSearchPredicateCode: + break; + default: + break; + } +} + +- (NSArray *)unknownUserResults { + + + // blah blah blah + return [NSArray arrayWithObject:[NSDictionary dictionaryWithObject:@"We don't know anyone with that name.." forKey:@"name"]]; +} + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h new file mode 100644 index 000000000..b9f5d89e1 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h @@ -0,0 +1,16 @@ +// +// TestSearchField.h +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 GitHub. All rights reserved. +// + +#import + + +@interface TestSearchField : NSSearchField { + +} + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m new file mode 100644 index 000000000..c65b1936a --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m @@ -0,0 +1,29 @@ +// +// TestSearchField.m +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 GitHub. All rights reserved. +// + +#import "TestSearchField.h" +#import "TestSearchFieldCell.h" + +@implementation TestSearchField + ++ (Class)cellClass { + + return [TestSearchFieldCell class]; +} + +- (id) initWithFrame:(NSRect)frame { + + if (self = [super initWithFrame:frame]) { + + self.drawsBackground = NO; + } + + return self; +} + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h new file mode 100644 index 000000000..bbdf80ca9 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h @@ -0,0 +1,16 @@ +// +// TestSearchFieldCell.h +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 GitHub. All rights reserved. +// + +#import + + +@interface TestSearchFieldCell : NSSearchFieldCell { + +} + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m new file mode 100644 index 000000000..fbdfc342f --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m @@ -0,0 +1,15 @@ +// +// TestSearchFieldCell.m +// Test +// +// Created by Joe Ricioppo on 9/29/10. +// Copyright 2010 GitHub. All rights reserved. +// + +#import "TestSearchFieldCell.h" + + +@implementation TestSearchFieldCell + + +@end diff --git a/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch b/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch new file mode 100644 index 000000000..6eee0b8fb --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header for all source files of the 'Test' target in the 'Test' project +// + +#ifdef __OBJC__ + #import +#endif + +3454 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m b/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m new file mode 100644 index 000000000..ca8b685a3 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m @@ -0,0 +1,20 @@ +//a +// main.m +// Test +// +// Created by Joe Ricioppo on 9/28/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// +d + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} +123456789 +123456789 +123456789 +123456789 +12 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/main copy.m b/ObjectiveGitTests/fixtures/Test_App/main copy.m new file mode 100644 index 000000000..67a236e0e --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/main copy.m @@ -0,0 +1,23 @@ +// +// main.m +// Test +// +// Created by Joe Ricioppo on 9/28/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +1 + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} +123456789 +123456789 +123456789 +123456789 +12 +123456789 +12 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/main.m b/ObjectiveGitTests/fixtures/Test_App/main.m new file mode 100644 index 000000000..e4482d521 --- /dev/null +++ b/ObjectiveGitTests/fixtures/Test_App/main.m @@ -0,0 +1,18 @@ +// +// main.m +// Test +// +// Created by Joe Ricioppo on 9/28/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} +123456789 +123456789 +123456789 +123456789!blah! From 2d22b60edf52925fb2361588d739185ecddc2d3b Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 13:40:32 +0000 Subject: [PATCH 110/157] Add an inline function to get the new test app fixture. Also copy the entire fixtures folder if on iOS, rather than the single repository. --- ObjectiveGitTests/Contants.h | 39 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/ObjectiveGitTests/Contants.h b/ObjectiveGitTests/Contants.h index 7ca512d6f..90b66bff2 100644 --- a/ObjectiveGitTests/Contants.h +++ b/ObjectiveGitTests/Contants.h @@ -45,7 +45,6 @@ #import "GTReference.h" #import "GTBranch.h" - static inline NSString *TEST_REPO_PATH(Class cls) { #if TARGET_OS_IPHONE return [NSTemporaryDirectory() stringByAppendingFormat:@"fixtures/testrepo.git"]; @@ -62,29 +61,29 @@ static inline NSString *TEST_INDEX_PATH(Class cls) { #endif } +static inline NSString *TEST_APP_REPO_PATH(Class cls) { + NSString *subpath = @"fixtures/Test_App/.git"; +#if TARGET_OS_IPHONE + return [NSTemporaryDirectory() stringByAppendingFormat:subpath]; +#else + return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:subpath]; +#endif +} + static inline void CREATE_WRITABLE_FIXTURES(void) { #if TARGET_OS_IPHONE NSFileManager *fm = [NSFileManager defaultManager]; + NSString *fixturesPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"fixtures"]; + + if([fm fileExistsAtPath:fixturesPath]) + [fm removeItemAtPath:fixturesPath error:nil]; + + NSError *err = nil; + if (![fm copyItemAtPath:[NSBundle.mainBundle.resourcePath stringByAppendingPathComponent:@"fixtures"] toPath:fixturesPath error:&err]) { + NSLog(@"Failed to copy fixtures: %@", err.localizedDescription); + [NSException raise:@"Fixture Setup Error:" format:err.localizedDescription, nil]; + } - if([fm fileExistsAtPath:TEST_REPO_PATH()]) - [fm removeItemAtPath:TEST_REPO_PATH() error:nil]; - - NSString *repoInBundle = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"fixtures/testrepo.git"]; - - NSString *fixturesDir = [TEST_REPO_PATH() stringByDeletingPathExtension]; - NSError *error = nil; - [fm createDirectoryAtPath:fixturesDir withIntermediateDirectories:YES attributes:nil error:&error]; - if (error) { - NSLog(@"%@", [error localizedDescription]); - [NSException raise:@"Fixture Setup Error:" format:[error localizedDescription]]; - } - - [fm copyItemAtPath:repoInBundle toPath:TEST_REPO_PATH() error:&error]; - if (error) { - NSLog(@"%@", [error localizedDescription]); - [NSException raise:@"Fixture Setup Error:" format:[error localizedDescription]]; - } - #endif } From 3ef89785434ba326e22eab14439b27e362353b55 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:22:07 +0000 Subject: [PATCH 111/157] Use the zipped up fixtures instead. --- ObjectiveGitTests/fixtures/Fixtures.zip | Bin 0 -> 344531 bytes .../fixtures/Test_App/.gitignore | 15 - .../Test_App/English.lproj/InfoPlist.strings | 1 - .../Test_App/English.lproj/MainMenu.xib | 4229 ----------------- ObjectiveGitTests/fixtures/Test_App/README | 14 - .../fixtures/Test_App/README1.txt | 26 - ObjectiveGitTests/fixtures/Test_App/REAME_ | 1 - .../fixtures/Test_App/Test-Info.plist | 32 - .../Test_App/Test.xcodeproj/project.pbxproj | 557 --- .../fixtures/Test_App/TestAppDelegate.h | 17 - .../fixtures/Test_App/TestAppDelegate.m | 22 - .../fixtures/Test_App/TestAppWindow.xib | 2572 ---------- .../Test_App/TestAppWindowController.h | 27 - .../Test_App/TestAppWindowController.m | 87 - .../fixtures/Test_App/TestSearchField.h | 16 - .../fixtures/Test_App/TestSearchField.m | 29 - .../fixtures/Test_App/TestSearchFieldCell.h | 16 - .../fixtures/Test_App/TestSearchFieldCell.m | 15 - .../fixtures/Test_App/Test_Prefix.pch | 9 - .../fixtures/Test_App/dolla$billy'all.m | 20 - .../fixtures/Test_App/main copy.m | 23 - ObjectiveGitTests/fixtures/Test_App/main.m | 18 - ObjectiveGitTests/fixtures/testrepo.git/HEAD | 1 - .../fixtures/testrepo.git/config | 6 - .../fixtures/testrepo.git/description | 1 - ObjectiveGitTests/fixtures/testrepo.git/index | Bin 176 -> 0 bytes .../fixtures/testrepo.git/info/exclude | 6 - .../fixtures/testrepo.git/logs/HEAD | 3 - .../testrepo.git/logs/refs/heads/master | 3 - .../04/7142d55581bfb3a703eec247e4fadd5666e789 | Bin 123 -> 0 bytes .../08/ca5b320ed2111f62ec74158b52242757664516 | 2 - .../0c/37a5391bbff43c37f0d0371823a5509eed5b1d | Bin 134 -> 0 bytes .../13/85f264afb75a56a5bec74243be9b367ba4ca08 | Bin 19 -> 0 bytes .../18/1037049a54a1eb5fab404658a3a250b44335d7 | Bin 51 -> 0 bytes .../18/10dff58d8a660512d4832e740f692884338ccd | Bin 119 -> 0 bytes .../23/c5964c265e17b12ce89320ec21b5015f033a66 | 2 - .../2c/8611f5dacf3c106cd90f4b71e40f87c64cfdab | Bin 122 -> 0 bytes .../2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 | Bin 125 -> 0 bytes .../31/b7680598f36b4e8d0948ddf13ee17d009e9a80 | Bin 122 -> 0 bytes .../32/4d981d11440240df53e825b6eba0afddcb39fa | 2 - .../36/060c58702ed4c2a40832c51758d5344201d89a | 2 - .../36/a1a2e1ebed3bb4de53d2d0d3982dd724caa7de | 2 - .../45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 | Bin 18 -> 0 bytes .../46/bf0f2b6d602a0d0a8971216dfb81692bde5286 | Bin 122 -> 0 bytes .../49/4a45810d66a43ff2ed747db6f13d7779436de5 | 2 - .../4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 | 2 - .../4b/d7c21254336b430f3dcaca0bf27124edbfd979 | 2 - .../58/2ab21929a82c7c1c10521f371fa011e41a6730 | 3 - .../58/3cf9deb2f587481b3e88f700066764351c5a98 | 2 - .../5b/5b025afb0b4c913b4c338a42934a3863bf3644 | 2 - .../61/9f9935957e010c419cb9d15621916ddfcc0b96 | Bin 116 -> 0 bytes .../63/b661110a0c7e53c5db0389de17f6aee08b21c3 | Bin 122 -> 0 bytes .../6d/e3956f865eb06b3cf5707325df92f3526d9927 | 2 - .../75/057dd4114e74cca1d750d0aee1647c903cb60a | Bin 119 -> 0 bytes .../81/4889a078c031f61ed08ab5fa863aea9314344d | Bin 82 -> 0 bytes .../84/96071c1b46c854b31185ea97743be6a8774479 | Bin 126 -> 0 bytes .../92/867bc5db73e8182a7bf7387dabda57efa9f0c8 | 2 - .../9f/d738e8f7967c078dceed8190330fc8648ee56a | 3 - .../a3/5622ee2ca7c7cf68abdcad335588fbb8bca9ec | 2 - .../a4/a7dce85cf63874e984719f4fdd239f5145052f | 2 - .../a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd | Bin 28 -> 0 bytes .../a8/233120f6ad708f843d861ce2b7228ec4e3dec6 | Bin 26 -> 0 bytes .../b5/fd0db2023fefaad6d654498b19da0452d6ed6f | 2 - .../b6/8f98fb09ce029c462ab6cb4b0a6bd388991008 | 2 - .../b8/f63858750d58a047fb01de56600a848d148c5c | 2 - .../be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 | 3 - .../c4/7800c7266a2be04c571c04d5a6614691ea99bd | 3 - .../c4/dc1555e4d4fa0e0c9c3fc46734c7c35b3ce90b | Bin 116 -> 0 bytes .../d5/8bc7e528c2ed684024ed09c0a866515cbaa93d | 2 - .../dc/e40996517d8183ba11d2d0de35c5513db7cd6b | 2 - .../e3/02ade1ce3d2729bbe053dd8f923b294336437e | 2 - .../e4/065ef1811aa1279362c275aab504b846067a9f | 2 - .../e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 | Bin 15 -> 0 bytes .../e7/d45d5c5b1d3897cba0fb342df207b833b83d7c | 3 - .../eb/283b26b265cf3b3c509d32f47adddee83624a4 | 3 - .../f0/a804583c8dd509d1a0e6fac899a85d31ac121e | 2 - .../f3/4546500875044d9a2ae8804171897c81364721 | Bin 122 -> 0 bytes .../f6/0079018b664e4e79329a7ef9559c8d9e0378d1 | Bin 82 -> 0 bytes .../fa/49b077972391ad58037050f2a75f74e3671e92 | Bin 24 -> 0 bytes .../fd/093bff70906175335656e6ce6ae05783708765 | Bin 82 -> 0 bytes ...c6adf9f61318f041845b01440d09aa7a91e1b5.idx | Bin 1240 -> 0 bytes ...6adf9f61318f041845b01440d09aa7a91e1b5.pack | Bin 491 -> 0 bytes .../fixtures/testrepo.git/packed-refs | 2 - .../fixtures/testrepo.git/refs/heads/master | 1 - .../fixtures/testrepo.git/refs/tags/v0.9 | 1 - .../fixtures/testrepo.git/refs/tags/v1.0 | 1 - 86 files changed, 7833 deletions(-) create mode 100644 ObjectiveGitTests/fixtures/Fixtures.zip delete mode 100644 ObjectiveGitTests/fixtures/Test_App/.gitignore delete mode 100644 ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings delete mode 100644 ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib delete mode 100644 ObjectiveGitTests/fixtures/Test_App/README delete mode 100644 ObjectiveGitTests/fixtures/Test_App/README1.txt delete mode 100644 ObjectiveGitTests/fixtures/Test_App/REAME_ delete mode 100644 ObjectiveGitTests/fixtures/Test_App/Test-Info.plist delete mode 100644 ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchField.h delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchField.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h delete mode 100644 ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch delete mode 100644 ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/main copy.m delete mode 100644 ObjectiveGitTests/fixtures/Test_App/main.m delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/HEAD delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/config delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/description delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/index delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/info/exclude delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/logs/HEAD delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/logs/refs/heads/master delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/04/7142d55581bfb3a703eec247e4fadd5666e789 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/08/ca5b320ed2111f62ec74158b52242757664516 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/23/c5964c265e17b12ce89320ec21b5015f033a66 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/2c/8611f5dacf3c106cd90f4b71e40f87c64cfdab delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/31/b7680598f36b4e8d0948ddf13ee17d009e9a80 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/32/4d981d11440240df53e825b6eba0afddcb39fa delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/36/060c58702ed4c2a40832c51758d5344201d89a delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/36/a1a2e1ebed3bb4de53d2d0d3982dd724caa7de delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/46/bf0f2b6d602a0d0a8971216dfb81692bde5286 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/49/4a45810d66a43ff2ed747db6f13d7779436de5 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/4b/d7c21254336b430f3dcaca0bf27124edbfd979 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/58/2ab21929a82c7c1c10521f371fa011e41a6730 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/58/3cf9deb2f587481b3e88f700066764351c5a98 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/63/b661110a0c7e53c5db0389de17f6aee08b21c3 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/6d/e3956f865eb06b3cf5707325df92f3526d9927 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/92/867bc5db73e8182a7bf7387dabda57efa9f0c8 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/a3/5622ee2ca7c7cf68abdcad335588fbb8bca9ec delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/b5/fd0db2023fefaad6d654498b19da0452d6ed6f delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/b6/8f98fb09ce029c462ab6cb4b0a6bd388991008 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/b8/f63858750d58a047fb01de56600a848d148c5c delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/c4/dc1555e4d4fa0e0c9c3fc46734c7c35b3ce90b delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/d5/8bc7e528c2ed684024ed09c0a866515cbaa93d delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/dc/e40996517d8183ba11d2d0de35c5513db7cd6b delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/e3/02ade1ce3d2729bbe053dd8f923b294336437e delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/e4/065ef1811aa1279362c275aab504b846067a9f delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/e7/d45d5c5b1d3897cba0fb342df207b833b83d7c delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/eb/283b26b265cf3b3c509d32f47adddee83624a4 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/f0/a804583c8dd509d1a0e6fac899a85d31ac121e delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/f3/4546500875044d9a2ae8804171897c81364721 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/f6/0079018b664e4e79329a7ef9559c8d9e0378d1 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/fd/093bff70906175335656e6ce6ae05783708765 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.idx delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/packed-refs delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/refs/heads/master delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v0.9 delete mode 100644 ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v1.0 diff --git a/ObjectiveGitTests/fixtures/Fixtures.zip b/ObjectiveGitTests/fixtures/Fixtures.zip new file mode 100644 index 0000000000000000000000000000000000000000..17c089e4240098d049d84f8b4a1c4ab5fc86ec28 GIT binary patch literal 344531 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

s+B;a7S~{9# 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Τ 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�aTGT!!0QBn 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 OFQLHy0RGoN;Qs+KYz2b= literal 0 HcmV?d00001 diff --git a/ObjectiveGitTests/fixtures/Test_App/.gitignore b/ObjectiveGitTests/fixtures/Test_App/.gitignore deleted file mode 100644 index 6ff33a286..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -.DS_Store -*.swp -*~.nib - -build/* - -*.pbxuser -*.perspective -*.perspectivev3 - -*.mode1v3 -*.mode2v3 - -project.xcworkspace -*/xcuserdata/ diff --git a/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings b/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings deleted file mode 100644 index b92732c79..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/English.lproj/InfoPlist.strings +++ /dev/null @@ -1 +0,0 @@ -/* Localized versions of Info.plist keys */ diff --git a/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib b/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib deleted file mode 100644 index a672169f8..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/English.lproj/MainMenu.xib +++ /dev/null @@ -1,4229 +0,0 @@ - - - - 1060 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 804 - - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - Test - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - Test - - YES - - - About Test - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Test - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit Test - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling and Grammar - : - 1048576 - 2147483647 - - - - - - Check Document Now - ; - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - Correct Spelling Automatically - - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Show Substitutions - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Dashes - - 2147483647 - - - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - Text Replacement - - 2147483647 - - - - - - - - - Transformations - - 2147483647 - - - submenuAction: - - Transformations - - YES - - - Make Upper Case - - 2147483647 - - - - - - Make Lower Case - - 2147483647 - - - - - - Capitalize - - 2147483647 - - - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Writing Direction - - 2147483647 - - - submenuAction: - - Writing Direction - - YES - - - YES - Paragraph - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - YES - Selection - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - Test Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 15 - 2 - {{335, 123}, {882, 627}} - 1954021376 - Test - NSWindow - - {3.40282e+38, 3.40282e+38} - - - 256 - {882, 627} - - - - {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} - - - TestAppDelegate - - - NSFontManager - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - addFontTrait: - - - - 421 - - - - addFontTrait: - - - - 422 - - - - modifyFont: - - - - 423 - - - - orderFrontFontPanel: - - - - 424 - - - - modifyFont: - - - - 425 - - - - raiseBaseline: - - - - 426 - - - - lowerBaseline: - - - - 427 - - - - copyFont: - - - - 428 - - - - subscript: - - - - 429 - - - - superscript: - - - - 430 - - - - tightenKerning: - - - - 431 - - - - underline: - - - - 432 - - - - orderFrontColorPanel: - - - - 433 - - - - useAllLigatures: - - - - 434 - - - - loosenKerning: - - - - 435 - - - - pasteFont: - - - - 436 - - - - unscript: - - - - 437 - - - - useStandardKerning: - - - - 438 - - - - useStandardLigatures: - - - - 439 - - - - turnOffLigatures: - - - - 440 - - - - turnOffKerning: - - - - 441 - - - - terminate: - - - - 449 - - - - toggleAutomaticSpellingCorrection: - - - - 456 - - - - orderFrontSubstitutionsPanel: - - - - 458 - - - - toggleAutomaticDashSubstitution: - - - - 461 - - - - toggleAutomaticTextReplacement: - - - - 463 - - - - uppercaseWord: - - - - 464 - - - - capitalizeWord: - - - - 467 - - - - lowercaseWord: - - - - 468 - - - - pasteAsPlainText: - - - - 486 - - - - performFindPanelAction: - - - - 487 - - - - performFindPanelAction: - - - - 488 - - - - performFindPanelAction: - - - - 489 - - - - showHelp: - - - - 493 - - - - delegate - - - - 495 - - - - alignCenter: - - - - 518 - - - - pasteRuler: - - - - 519 - - - - toggleRuler: - - - - 520 - - - - alignRight: - - - - 521 - - - - copyRuler: - - - - 522 - - - - alignJustified: - - - - 523 - - - - alignLeft: - - - - 524 - - - - makeBaseWritingDirectionNatural: - - - - 525 - - - - makeBaseWritingDirectionLeftToRight: - - - - 526 - - - - makeBaseWritingDirectionRightToLeft: - - - - 527 - - - - makeTextWritingDirectionNatural: - - - - 528 - - - - makeTextWritingDirectionLeftToRight: - - - - 529 - - - - makeTextWritingDirectionRightToLeft: - - - - 530 - - - - window - - - - 532 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - - - 80 - - - - - 78 - - - - - 72 - - - - - 82 - - - - - 124 - - - YES - - - - - - 77 - - - - - 73 - - - - - 79 - - - - - 112 - - - - - 74 - - - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - YES - - - - - - 372 - - - YES - - - - - 375 - - - YES - - - - - - 376 - - - YES - - - - - - - 377 - - - YES - - - - - - 388 - - - YES - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - YES - - - - - - 398 - - - YES - - - - - - 399 - - - YES - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - YES - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - YES - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - YES - - - - - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - 420 - - - - - 450 - - - YES - - - - - - 451 - - - YES - - - - - - - - 452 - - - - - 453 - - - - - 454 - - - - - 457 - - - - - 459 - - - - - 460 - - - - - 462 - - - - - 465 - - - - - 466 - - - - - 485 - - - - - 490 - - - YES - - - - - - 491 - - - YES - - - - - - 492 - - - - - 494 - - - - - 496 - - - YES - - - - - - 497 - - - YES - - - - - - - - - - - - - - - 498 - - - - - 499 - - - - - 500 - - - - - 501 - - - - - 502 - - - - - 503 - - - YES - - - - - - 504 - - - - - 505 - - - - - 506 - - - - - 507 - - - - - 508 - - - YES - - - - - - - - - - - - - - 509 - - - - - 510 - - - - - 511 - - - - - 512 - - - - - 513 - - - - - 514 - - - - - 515 - - - - - 516 - - - - - 517 - - - - - - - YES - - YES - -3.IBPluginDependency - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 371.IBEditorWindowLastContentRect - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 371.editorWindowContentRectSynchronizationRect - 371.windowTemplate.maxSize - 372.IBPluginDependency - 375.IBPluginDependency - 376.IBEditorWindowLastContentRect - 376.IBPluginDependency - 377.IBPluginDependency - 388.IBEditorWindowLastContentRect - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 418.IBPluginDependency - 419.IBPluginDependency - 450.IBPluginDependency - 451.IBEditorWindowLastContentRect - 451.IBPluginDependency - 452.IBPluginDependency - 453.IBPluginDependency - 454.IBPluginDependency - 457.IBPluginDependency - 459.IBPluginDependency - 460.IBPluginDependency - 462.IBPluginDependency - 465.IBPluginDependency - 466.IBPluginDependency - 485.IBPluginDependency - 490.IBPluginDependency - 491.IBEditorWindowLastContentRect - 491.IBPluginDependency - 492.IBPluginDependency - 496.IBPluginDependency - 497.IBEditorWindowLastContentRect - 497.IBPluginDependency - 498.IBPluginDependency - 499.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 500.IBPluginDependency - 501.IBPluginDependency - 502.IBPluginDependency - 503.IBPluginDependency - 504.IBPluginDependency - 505.IBPluginDependency - 506.IBPluginDependency - 507.IBPluginDependency - 508.IBEditorWindowLastContentRect - 508.IBPluginDependency - 509.IBPluginDependency - 510.IBPluginDependency - 511.IBPluginDependency - 512.IBPluginDependency - 513.IBPluginDependency - 514.IBPluginDependency - 515.IBPluginDependency - 516.IBPluginDependency - 517.IBPluginDependency - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{753, 187}, {275, 113}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{547, 180}, {254, 283}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{187, 434}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{753, 217}, {238, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{654, 239}, {194, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{525, 802}, {197, 73}} - {{380, 836}, {396, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 978}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{604, 269}, {231, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{475, 832}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{746, 287}, {220, 133}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{239, 135}, {882, 627}} - com.apple.InterfaceBuilder.CocoaPlugin - {{239, 135}, {882, 627}} - - {{33, 99}, {480, 360}} - {3.40282e+38, 3.40282e+38} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{591, 420}, {83, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{523, 2}, {178, 283}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{753, 197}, {170, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{725, 289}, {246, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{674, 260}, {204, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{878, 180}, {164, 173}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{286, 129}, {275, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{23, 794}, {245, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{452, 109}, {196, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{145, 474}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 562 - - - - YES - - TestAppDelegate - NSObject - - window - NSWindow - - - window - - window - NSWindow - - - - IBProjectSource - TestAppDelegate.h - - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - - - NSApplication - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h - - - - NSBrowser - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSBrowser.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSDocument - NSObject - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocument.h - - - - NSDocument - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentScripting.h - - - - NSDocumentController - NSObject - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - id - id - id - id - - - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - - clearRecentDocuments: - id - - - newDocument: - id - - - openDocument: - id - - - saveAllDocuments: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentController.h - - - - NSFontManager - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSMatrix - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSMatrix.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMovieView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSMovieView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSTableView - NSControl - - - - NSText - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSTextView - NSText - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSView - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSView+BWAdditions.h - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSWindow - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - NSWindow - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../Test.xcodeproj - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - diff --git a/ObjectiveGitTests/fixtures/Test_App/README b/ObjectiveGitTests/fixtures/Test_App/README deleted file mode 100644 index 69d7920c2..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/README +++ /dev/null @@ -1,14 +0,0 @@ -blah -blah -blah -blah -blah -blah -blah -blah -blah -blah -blah -blah -blah -2 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/README1.txt b/ObjectiveGitTests/fixtures/Test_App/README1.txt deleted file mode 100644 index 847cd4b33..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/README1.txt +++ /dev/null @@ -1,26 +0,0 @@ -The ftplugin directory is for Vim plugin scripts that are only used for a -specific filetype. - -All files ending in .vim in this directory and subdirectories will be sourced -by Vim when it detects the filetype that matches the name of the file or -subdirectory. -For example, these are all loaded for the "c" filetype: - - c.vim - c_extra.vim - c/settings.vim - -Note that the "_" in "c_extra.vim" is required to separate the filetype name -from the following arbitrary name. - -The filetype plugins are only loaded when the ":filetype plugin" command has -been used. - -The default filetype plugin files contain settings that 95% of the users will -want to use. They do not contain personal preferences, like the value of -'shiftwidth'. -ede - -If you want to do additional settings, or overrule the default filetype -plugin, you can create your own plugin file. See ":help ftplugin" in Vim. - diff --git a/ObjectiveGitTests/fixtures/Test_App/REAME_ b/ObjectiveGitTests/fixtures/Test_App/REAME_ deleted file mode 100644 index 8b4a21733..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/REAME_ +++ /dev/null @@ -1 +0,0 @@ -The wild west diff --git a/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist b/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist deleted file mode 100644 index f696cb233..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/Test-Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSMinimumSystemVersion - ${MACOSX_DEPLOYMENT_TARGET} - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj b/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj deleted file mode 100644 index 24b91641b..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/Test.xcodeproj/project.pbxproj +++ /dev/null @@ -1,557 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 45; - objects = { - -/* Begin PBXBuildFile section */ - 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; - 256AC3DA0F4B6AC300CF3369 /* TestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */; }; - 516678331293193900628CF6 /* GHGitHubOrganization.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678321293193900628CF6 /* GHGitHubOrganization.m */; }; - 516678441293196400628CF6 /* NSError+GHClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678431293196400628CF6 /* NSError+GHClient.m */; }; - 516678471293198D00628CF6 /* GHImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 516678461293198D00628CF6 /* GHImageLoader.m */; }; - 5166784F129319C900628CF6 /* NSString+Git.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166784E129319C900628CF6 /* NSString+Git.m */; }; - 5166785612931A3100628CF6 /* GHGitBranch.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166785312931A3100628CF6 /* GHGitBranch.m */; }; - 5166785712931A3100628CF6 /* GHGitFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5166785512931A3100628CF6 /* GHGitFile.m */; }; - 517FD97112530D97001DE593 /* GHGitRepository.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96912530D97001DE593 /* GHGitRepository.m */; }; - 517FD97212530D97001DE593 /* GHGitHubUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96B12530D97001DE593 /* GHGitHubUser.m */; }; - 517FD97312530D97001DE593 /* GHGitHubClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96D12530D97001DE593 /* GHGitHubClient.m */; }; - 517FD97412530D97001DE593 /* GHClientTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD96F12530D97001DE593 /* GHClientTransaction.m */; }; - 517FD9A112530E73001DE593 /* CDataScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98912530E73001DE593 /* CDataScanner.m */; }; - 517FD9A212530E73001DE593 /* CExtensibleJSONDataSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */; }; - 517FD9A312530E73001DE593 /* CDataScanner_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */; }; - 517FD9A412530E73001DE593 /* NSCharacterSet_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */; }; - 517FD9A512530E73001DE593 /* NSDictionary_JSONExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */; }; - 517FD9A612530E73001DE593 /* NSScanner_Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99512530E73001DE593 /* NSScanner_Extensions.m */; }; - 517FD9A712530E73001DE593 /* CJSONDataSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99812530E73001DE593 /* CJSONDataSerializer.m */; }; - 517FD9A812530E73001DE593 /* CJSONDeserializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99A12530E73001DE593 /* CJSONDeserializer.m */; }; - 517FD9A912530E73001DE593 /* CJSONScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99C12530E73001DE593 /* CJSONScanner.m */; }; - 517FD9AA12530E73001DE593 /* CJSONSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD99E12530E73001DE593 /* CJSONSerializer.m */; }; - 517FD9AB12530E73001DE593 /* CSerializedJSONData.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD9A012530E73001DE593 /* CSerializedJSONData.m */; }; - 517FD9B712530F03001DE593 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FD9B512530F03001DE593 /* NSData+Base64.m */; }; - 517FD9C112531F18001DE593 /* BWToolkitFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */; }; - 517FDB4912531F79001DE593 /* BWToolkitFramework.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */; }; - 517FDB6B12532C75001DE593 /* TestAppWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDB6A12532C75001DE593 /* TestAppWindowController.m */; }; - 517FDB6D12532CAD001DE593 /* TestAppWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */; }; - 517FDC0F1253D5B7001DE593 /* TestSearchField.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDC0E1253D5B7001DE593 /* TestSearchField.m */; }; - 517FDC121253D5C0001DE593 /* TestSearchFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */; }; - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 517FDB4712531F45001DE593 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 517FDB4912531F79001DE593 /* BWToolkitFramework.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; - 256AC3D80F4B6AC300CF3369 /* TestAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestAppDelegate.h; sourceTree = ""; }; - 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestAppDelegate.m; sourceTree = ""; }; - 256AC3F00F4B6AF500CF3369 /* Test_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Test_Prefix.pch; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; - 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 516678311293193900628CF6 /* GHGitHubOrganization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubOrganization.h; path = ../Objc_Client/GHGitHubOrganization.h; sourceTree = SOURCE_ROOT; }; - 516678321293193900628CF6 /* GHGitHubOrganization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubOrganization.m; path = ../Objc_Client/GHGitHubOrganization.m; sourceTree = SOURCE_ROOT; }; - 516678421293196400628CF6 /* NSError+GHClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSError+GHClient.h"; path = "../Objc_Client/NSError+GHClient.h"; sourceTree = SOURCE_ROOT; }; - 516678431293196400628CF6 /* NSError+GHClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSError+GHClient.m"; path = "../Objc_Client/NSError+GHClient.m"; sourceTree = SOURCE_ROOT; }; - 516678451293198D00628CF6 /* GHImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHImageLoader.h; path = ../Objc_Client/GHImageLoader.h; sourceTree = SOURCE_ROOT; }; - 516678461293198D00628CF6 /* GHImageLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHImageLoader.m; path = ../Objc_Client/GHImageLoader.m; sourceTree = SOURCE_ROOT; }; - 5166784D129319C900628CF6 /* NSString+Git.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+Git.h"; path = "../Objc_Client/NSString+Git.h"; sourceTree = SOURCE_ROOT; }; - 5166784E129319C900628CF6 /* NSString+Git.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+Git.m"; path = "../Objc_Client/NSString+Git.m"; sourceTree = SOURCE_ROOT; }; - 5166785212931A3100628CF6 /* GHGitBranch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitBranch.h; path = ../Objc_Client/GHGitBranch.h; sourceTree = SOURCE_ROOT; }; - 5166785312931A3100628CF6 /* GHGitBranch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitBranch.m; path = ../Objc_Client/GHGitBranch.m; sourceTree = SOURCE_ROOT; }; - 5166785412931A3100628CF6 /* GHGitFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitFile.h; path = ../Objc_Client/GHGitFile.h; sourceTree = SOURCE_ROOT; }; - 5166785512931A3100628CF6 /* GHGitFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitFile.m; path = ../Objc_Client/GHGitFile.m; sourceTree = SOURCE_ROOT; }; - 517FD96912530D97001DE593 /* GHGitRepository.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitRepository.m; path = ../Objc_Client/GHGitRepository.m; sourceTree = SOURCE_ROOT; }; - 517FD96A12530D97001DE593 /* GHGitRepository.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitRepository.h; path = ../Objc_Client/GHGitRepository.h; sourceTree = SOURCE_ROOT; }; - 517FD96B12530D97001DE593 /* GHGitHubUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubUser.m; path = ../Objc_Client/GHGitHubUser.m; sourceTree = SOURCE_ROOT; }; - 517FD96C12530D97001DE593 /* GHGitHubUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubUser.h; path = ../Objc_Client/GHGitHubUser.h; sourceTree = SOURCE_ROOT; }; - 517FD96D12530D97001DE593 /* GHGitHubClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHGitHubClient.m; path = ../Objc_Client/GHGitHubClient.m; sourceTree = SOURCE_ROOT; }; - 517FD96E12530D97001DE593 /* GHGitHubClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHGitHubClient.h; path = ../Objc_Client/GHGitHubClient.h; sourceTree = SOURCE_ROOT; }; - 517FD96F12530D97001DE593 /* GHClientTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHClientTransaction.m; path = ../Objc_Client/GHClientTransaction.m; sourceTree = SOURCE_ROOT; }; - 517FD97012530D97001DE593 /* GHClientTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHClientTransaction.h; path = ../Objc_Client/GHClientTransaction.h; sourceTree = SOURCE_ROOT; }; - 517FD98812530E73001DE593 /* CDataScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDataScanner.h; path = ../TouchJSON/Source/CDataScanner.h; sourceTree = SOURCE_ROOT; }; - 517FD98912530E73001DE593 /* CDataScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDataScanner.m; path = ../TouchJSON/Source/CDataScanner.m; sourceTree = SOURCE_ROOT; }; - 517FD98B12530E73001DE593 /* CExtensibleJSONDataSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CExtensibleJSONDataSerializer.h; sourceTree = ""; }; - 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CExtensibleJSONDataSerializer.m; sourceTree = ""; }; - 517FD98E12530E73001DE593 /* CDataScanner_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDataScanner_Extensions.h; sourceTree = ""; }; - 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDataScanner_Extensions.m; sourceTree = ""; }; - 517FD99012530E73001DE593 /* NSCharacterSet_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCharacterSet_Extensions.h; sourceTree = ""; }; - 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCharacterSet_Extensions.m; sourceTree = ""; }; - 517FD99212530E73001DE593 /* NSDictionary_JSONExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDictionary_JSONExtensions.h; sourceTree = ""; }; - 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDictionary_JSONExtensions.m; sourceTree = ""; }; - 517FD99412530E73001DE593 /* NSScanner_Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSScanner_Extensions.h; sourceTree = ""; }; - 517FD99512530E73001DE593 /* NSScanner_Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSScanner_Extensions.m; sourceTree = ""; }; - 517FD99712530E73001DE593 /* CJSONDataSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONDataSerializer.h; sourceTree = ""; }; - 517FD99812530E73001DE593 /* CJSONDataSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONDataSerializer.m; sourceTree = ""; }; - 517FD99912530E73001DE593 /* CJSONDeserializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONDeserializer.h; sourceTree = ""; }; - 517FD99A12530E73001DE593 /* CJSONDeserializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONDeserializer.m; sourceTree = ""; }; - 517FD99B12530E73001DE593 /* CJSONScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONScanner.h; sourceTree = ""; }; - 517FD99C12530E73001DE593 /* CJSONScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONScanner.m; sourceTree = ""; }; - 517FD99D12530E73001DE593 /* CJSONSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CJSONSerializer.h; sourceTree = ""; }; - 517FD99E12530E73001DE593 /* CJSONSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CJSONSerializer.m; sourceTree = ""; }; - 517FD99F12530E73001DE593 /* CSerializedJSONData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSerializedJSONData.h; sourceTree = ""; }; - 517FD9A012530E73001DE593 /* CSerializedJSONData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSerializedJSONData.m; sourceTree = ""; }; - 517FD9B512530F03001DE593 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "../Objc_Client/NSData+Base64.m"; sourceTree = SOURCE_ROOT; }; - 517FD9B612530F03001DE593 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "../Objc_Client/NSData+Base64.h"; sourceTree = SOURCE_ROOT; }; - 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BWToolkitFramework.framework; path = /Users/ricioppo/Source/GitHub/BWToolkitFramework.framework; sourceTree = ""; }; - 517FDB6912532C75001DE593 /* TestAppWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestAppWindowController.h; sourceTree = ""; }; - 517FDB6A12532C75001DE593 /* TestAppWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestAppWindowController.m; sourceTree = ""; }; - 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestAppWindow.xib; sourceTree = ""; }; - 517FDC0D1253D5B7001DE593 /* TestSearchField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSearchField.h; sourceTree = ""; }; - 517FDC0E1253D5B7001DE593 /* TestSearchField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSearchField.m; sourceTree = ""; }; - 517FDC101253D5C0001DE593 /* TestSearchFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSearchFieldCell.h; sourceTree = ""; }; - 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSearchFieldCell.m; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Test-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Test-Info.plist"; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Test.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D11072E0486CEB800E47090 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, - 517FD9C112531F18001DE593 /* BWToolkitFramework.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 256AC3D80F4B6AC300CF3369 /* TestAppDelegate.h */, - 256AC3D90F4B6AC300CF3369 /* TestAppDelegate.m */, - 517FDB6812532C4C001DE593 /* Window Controller */, - 517FD96312530D84001DE593 /* GitHub Client */, - 517FDC0C1253D583001DE593 /* Controls */, - ); - name = Classes; - sourceTree = ""; - }; - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, - 517FD9C012531F18001DE593 /* BWToolkitFramework.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 29B97324FDCFA39411CA2CEA /* AppKit.framework */, - 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, - 29B97325FDCFA39411CA2CEA /* Foundation.framework */, - ); - name = "Other Frameworks"; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 8D1107320486CEB800E47090 /* Test.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* Test */ = { - isa = PBXGroup; - children = ( - 080E96DDFE201D6D7F000001 /* Classes */, - 517FD98212530E56001DE593 /* Libraries */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - name = Test; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 256AC3F00F4B6AF500CF3369 /* Test_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 8D1107310486CEB800E47090 /* Test-Info.plist */, - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, - 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, - 517FDB6C12532CAD001DE593 /* TestAppWindow.xib */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, - 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, - ); - name = Frameworks; - sourceTree = ""; - }; - 516678341293193F00628CF6 /* Utilities */ = { - isa = PBXGroup; - children = ( - 516678451293198D00628CF6 /* GHImageLoader.h */, - 516678461293198D00628CF6 /* GHImageLoader.m */, - 517FD9B512530F03001DE593 /* NSData+Base64.m */, - 517FD9B612530F03001DE593 /* NSData+Base64.h */, - 516678421293196400628CF6 /* NSError+GHClient.h */, - 516678431293196400628CF6 /* NSError+GHClient.m */, - 5166784D129319C900628CF6 /* NSString+Git.h */, - 5166784E129319C900628CF6 /* NSString+Git.m */, - ); - name = Utilities; - sourceTree = ""; - }; - 517FD96312530D84001DE593 /* GitHub Client */ = { - isa = PBXGroup; - children = ( - 517FD96E12530D97001DE593 /* GHGitHubClient.h */, - 517FD96D12530D97001DE593 /* GHGitHubClient.m */, - 517FD97012530D97001DE593 /* GHClientTransaction.h */, - 517FD96F12530D97001DE593 /* GHClientTransaction.m */, - 517FD97512530DA3001DE593 /* Model */, - ); - name = "GitHub Client"; - sourceTree = ""; - }; - 517FD97512530DA3001DE593 /* Model */ = { - isa = PBXGroup; - children = ( - 517FD96A12530D97001DE593 /* GHGitRepository.h */, - 517FD96912530D97001DE593 /* GHGitRepository.m */, - 5166785212931A3100628CF6 /* GHGitBranch.h */, - 5166785312931A3100628CF6 /* GHGitBranch.m */, - 5166785412931A3100628CF6 /* GHGitFile.h */, - 5166785512931A3100628CF6 /* GHGitFile.m */, - 517FD96C12530D97001DE593 /* GHGitHubUser.h */, - 517FD96B12530D97001DE593 /* GHGitHubUser.m */, - 516678311293193900628CF6 /* GHGitHubOrganization.h */, - 516678321293193900628CF6 /* GHGitHubOrganization.m */, - 516678341293193F00628CF6 /* Utilities */, - ); - name = Model; - sourceTree = ""; - }; - 517FD98212530E56001DE593 /* Libraries */ = { - isa = PBXGroup; - children = ( - 517FD98312530E5D001DE593 /* TouchJSON */, - ); - name = Libraries; - sourceTree = ""; - }; - 517FD98312530E5D001DE593 /* TouchJSON */ = { - isa = PBXGroup; - children = ( - 517FD98812530E73001DE593 /* CDataScanner.h */, - 517FD98912530E73001DE593 /* CDataScanner.m */, - 517FD98A12530E73001DE593 /* Experimental */, - 517FD98D12530E73001DE593 /* Extensions */, - 517FD99612530E73001DE593 /* JSON */, - ); - name = TouchJSON; - sourceTree = ""; - }; - 517FD98A12530E73001DE593 /* Experimental */ = { - isa = PBXGroup; - children = ( - 517FD98B12530E73001DE593 /* CExtensibleJSONDataSerializer.h */, - 517FD98C12530E73001DE593 /* CExtensibleJSONDataSerializer.m */, - ); - name = Experimental; - path = ../TouchJSON/Source/Experimental; - sourceTree = SOURCE_ROOT; - }; - 517FD98D12530E73001DE593 /* Extensions */ = { - isa = PBXGroup; - children = ( - 517FD98E12530E73001DE593 /* CDataScanner_Extensions.h */, - 517FD98F12530E73001DE593 /* CDataScanner_Extensions.m */, - 517FD99012530E73001DE593 /* NSCharacterSet_Extensions.h */, - 517FD99112530E73001DE593 /* NSCharacterSet_Extensions.m */, - 517FD99212530E73001DE593 /* NSDictionary_JSONExtensions.h */, - 517FD99312530E73001DE593 /* NSDictionary_JSONExtensions.m */, - 517FD99412530E73001DE593 /* NSScanner_Extensions.h */, - 517FD99512530E73001DE593 /* NSScanner_Extensions.m */, - ); - name = Extensions; - path = ../TouchJSON/Source/Extensions; - sourceTree = SOURCE_ROOT; - }; - 517FD99612530E73001DE593 /* JSON */ = { - isa = PBXGroup; - children = ( - 517FD99712530E73001DE593 /* CJSONDataSerializer.h */, - 517FD99812530E73001DE593 /* CJSONDataSerializer.m */, - 517FD99912530E73001DE593 /* CJSONDeserializer.h */, - 517FD99A12530E73001DE593 /* CJSONDeserializer.m */, - 517FD99B12530E73001DE593 /* CJSONScanner.h */, - 517FD99C12530E73001DE593 /* CJSONScanner.m */, - 517FD99D12530E73001DE593 /* CJSONSerializer.h */, - 517FD99E12530E73001DE593 /* CJSONSerializer.m */, - 517FD99F12530E73001DE593 /* CSerializedJSONData.h */, - 517FD9A012530E73001DE593 /* CSerializedJSONData.m */, - ); - name = JSON; - path = ../TouchJSON/Source/JSON; - sourceTree = SOURCE_ROOT; - }; - 517FDB6812532C4C001DE593 /* Window Controller */ = { - isa = PBXGroup; - children = ( - 517FDB6912532C75001DE593 /* TestAppWindowController.h */, - 517FDB6A12532C75001DE593 /* TestAppWindowController.m */, - ); - name = "Window Controller"; - sourceTree = ""; - }; - 517FDC0C1253D583001DE593 /* Controls */ = { - isa = PBXGroup; - children = ( - 517FDC0D1253D5B7001DE593 /* TestSearchField.h */, - 517FDC0E1253D5B7001DE593 /* TestSearchField.m */, - 517FDC101253D5C0001DE593 /* TestSearchFieldCell.h */, - 517FDC111253D5C0001DE593 /* TestSearchFieldCell.m */, - ); - name = Controls; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D1107260486CEB800E47090 /* Test */ = { - isa = PBXNativeTarget; - buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Test" */; - buildPhases = ( - 8D1107290486CEB800E47090 /* Resources */, - 8D11072C0486CEB800E47090 /* Sources */, - 8D11072E0486CEB800E47090 /* Frameworks */, - 517FDB4712531F45001DE593 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Test; - productInstallPath = "$(HOME)/Applications"; - productName = Test; - productReference = 8D1107320486CEB800E47090 /* Test.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - ORGANIZATIONNAME = GitHub; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Test" */; - compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* Test */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8D1107260486CEB800E47090 /* Test */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D1107290486CEB800E47090 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, - 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, - 517FDB6D12532CAD001DE593 /* TestAppWindow.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D11072C0486CEB800E47090 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, - 256AC3DA0F4B6AC300CF3369 /* TestAppDelegate.m in Sources */, - 517FD97112530D97001DE593 /* GHGitRepository.m in Sources */, - 517FD97212530D97001DE593 /* GHGitHubUser.m in Sources */, - 517FD97312530D97001DE593 /* GHGitHubClient.m in Sources */, - 517FD97412530D97001DE593 /* GHClientTransaction.m in Sources */, - 517FD9A112530E73001DE593 /* CDataScanner.m in Sources */, - 517FD9A212530E73001DE593 /* CExtensibleJSONDataSerializer.m in Sources */, - 517FD9A312530E73001DE593 /* CDataScanner_Extensions.m in Sources */, - 517FD9A412530E73001DE593 /* NSCharacterSet_Extensions.m in Sources */, - 517FD9A512530E73001DE593 /* NSDictionary_JSONExtensions.m in Sources */, - 517FD9A612530E73001DE593 /* NSScanner_Extensions.m in Sources */, - 517FD9A712530E73001DE593 /* CJSONDataSerializer.m in Sources */, - 517FD9A812530E73001DE593 /* CJSONDeserializer.m in Sources */, - 517FD9A912530E73001DE593 /* CJSONScanner.m in Sources */, - 517FD9AA12530E73001DE593 /* CJSONSerializer.m in Sources */, - 517FD9AB12530E73001DE593 /* CSerializedJSONData.m in Sources */, - 517FD9B712530F03001DE593 /* NSData+Base64.m in Sources */, - 517FDB6B12532C75001DE593 /* TestAppWindowController.m in Sources */, - 517FDC0F1253D5B7001DE593 /* TestSearchField.m in Sources */, - 517FDC121253D5C0001DE593 /* TestSearchFieldCell.m in Sources */, - 516678331293193900628CF6 /* GHGitHubOrganization.m in Sources */, - 516678441293196400628CF6 /* NSError+GHClient.m in Sources */, - 516678471293198D00628CF6 /* GHImageLoader.m in Sources */, - 5166784F129319C900628CF6 /* NSString+Git.m in Sources */, - 5166785612931A3100628CF6 /* GHGitBranch.m in Sources */, - 5166785712931A3100628CF6 /* GHGitFile.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 089C165DFE840E0CC02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 1DDD58150DA1D0A300B32029 /* English */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - C01FCF4B08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/..\"", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Test_Prefix.pch; - INFOPLIST_FILE = "Test-Info.plist"; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = Test; - }; - name = Debug; - }; - C01FCF4C08A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/..\"", - ); - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Test_Prefix.pch; - INFOPLIST_FILE = "Test-Info.plist"; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = Test; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - PREBINDING = NO; - SDKROOT = macosx10.6; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - SDKROOT = macosx10.6; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Test" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4B08A954540054247B /* Debug */, - C01FCF4C08A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Test" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h deleted file mode 100644 index 2859ba1e4..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// TestAppDelegate.h -// Test -// -// Created by Joe Ricioppo on 9/28/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import - -@class TestAppWindowController; - -@interface TestAppDelegate : NSObject {} - -@property (nonatomic, retain) TestAppWindowController *windowController; - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m b/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m deleted file mode 100644 index b5ccf61e8..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestAppDelegate.m +++ /dev/null @@ -1,22 +0,0 @@ -// -// TestAppDelegate.m -// Test -// -// Created by Joe Ricioppo on 9/28/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "TestAppDelegate.h" -#import "TestAppWindowController.h" - -@implementation TestAppDelegate - -@synthesize windowController; - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - - self.windowController = [[TestAppWindowController alloc] initWithWindowNibName:@"TestAppWindow"]; - [self.windowController showWindow:self]; -} - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib b/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib deleted file mode 100644 index aec9598c4..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestAppWindow.xib +++ /dev/null @@ -1,2572 +0,0 @@ - - - - 1060 - 10F569 - 804 - 1038.29 - 461.00 - - YES - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.brandonwalkin.BWToolkit - - - YES - 804 - 1.2.5 - - - - YES - - - - YES - com.brandonwalkin.BWToolkit - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - YES - - - - YES - - TestAppWindowController - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{196, 240}, {480, 270}} - 544735232 - Window - NSWindow - - {3.40282e+38, 3.40282e+38} - - - 256 - {480, 270} - - {{0, 0}, {1680, 1028}} - {3.40282e+38, 3.40282e+38} - - - 8223 - 2 - {{247, 193}, {836, 587}} - 611844096 - Window - NSPanel - - {400, 300} - - - 256 - - YES - - - 268 - {{19, 545}, {139, 22}} - - YES - - -2076049856 - 133120 - - LucidaGrande - 11 - 16 - - - 109199615 - 129 - - - 400 - 75 - - - Item 1 - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 1 - YES - YES - 2 - - - - - 4370 - - YES - - - 2304 - - YES - - - 4352 - {491, 521} - - YES - - - -2147483392 - {{-26, 0}, {16, 17}} - - - YES - - 488 - 40 - 1000 - - 75628032 - 0 - - - LucidaGrande - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337772096 - 2048 - Text Cell - - LucidaGrande-Bold - 11 - 16 - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2ODY1AA - - - - 1 - MSAxIDEAA - - - 3 - YES - - - - 3 - 2 - - 4 - MSAwLjE0MDAwMDAwMDYAA - - - 6 - System - gridColor - - 3 - MC41AA - - - 20 - -692060160 - - - 4 - 15 - 0 - YES - 0 - - - {491, 521} - - - - - 4 - - - - -2147483392 - {{-100, -100}, {15, 120}} - - 2 - - _doScroller: - 0.99253731966018677 - - - - -2147483392 - {{-100, -100}, {225, 15}} - - 1 - - _doScroller: - 0.57142859697341919 - - - {{21, 20}, {491, 521}} - - - 528 - - - - QSAAAEEgAABBsAAAQbAAAA - - - - 266 - {{162, 551}, {654, 14}} - - YES - - 338820672 - 272761856 - - - - YES - - 1 - MC40OTI1MzcxNDA4IDAuNTQ0OTk5MTgyMiAwLjU5MTgzNjc1MDUAA - - - YES - YES - NO - - 1 - MCAwIDAAA - - - YES - - YES - NSColor - NSFont - NSOriginalFont - NSParagraphStyle - NSShadow - - - YES - - 1 - MC40OTI1MzcxNDA4IDAuNTQ0OTk5MTgyMiAwLjU5MTgzNjc1MDUAA - - - - - 4 - 2 - - - - -1 - - - - - - 1 - MC4zMjk3MTQ5MjQxIDAuMzc5MjE3MjY3IDAuNDMzNjczNDcxMgA - - - 1 - MC41NjA2NDczNjg0IDAuNjA1Mzg4OTk5IDAuNjU4MTYzMjQ5NQA - - - - - - - 265 - {{565, 527}, {39, 14}} - - YES - - 68288064 - 272761856 - Name: - - - - 6 - System - controlColor - - - - 6 - System - controlTextColor - - - - - - - 265 - {{535, 442}, {69, 14}} - - YES - - 68288064 - 272761856 - Description: - - - - - - - - - 265 - - YES - - - 2304 - - YES - - - 2322 - {193, 216} - - - - - - Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum Et harumd und lookum like Greek to me, dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda - - - YES - - YES - - YES - NSColor - NSFont - NSParagraphStyle - - - YES - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - LucidaGrande - 10 - 2843 - - - 3 - - YES - - 0.0 - - - 56 - - - 112 - - - 168 - - - 224 - - - 280 - - - 336 - - - 392 - - - 448 - - - 504 - - - 560 - - - 616 - - - 672 - - - 728 - - - 784 - - - 840 - - - 896 - - - 952 - - - 1008 - - - 1064 - - - 1120 - - - 1176 - - - 1232 - - - 1288 - - - 1344 - - - 1400 - - - 1456 - - - 1512 - - - 1568 - - - 1624 - - - 1680 - - - 1736 - - - - - - - YES - - YES - NSColor - NSFont - NSParagraphStyle - - - YES - - - LucidaGrande-Bold - 10 - 16 - - - 3 - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GQAEAQgADAEiAAcBhAQAA - - - - - YES - - - 6 - - - - 193 - 1 - - - 2757 - 0 - - - - YES - - YES - NSBackgroundColor - NSColor - - - YES - - 6 - System - selectedTextBackgroundColor - - - - 6 - System - selectedTextColor - - - - - - 3 - MC44MTM4Njg2NDE5AA - - - YES - - YES - NSColor - NSUnderline - - - YES - - 1 - MCAwIDEAA - - - - - - - 6 - {480, 1e+07} - {180, 135} - - - - {193, 102} - - - - - 3 - MQA - - - {4, -5} - 1 - - 2 - - - - 256 - {{193, 0}, {12, 102}} - - YES - 2 - - _doScroller: - 0.47222220897674561 - - - - -2147483392 - {{-100, -100}, {87, 18}} - - 1 - - _doScroller: - 1 - 0.94565218687057495 - - - {{610, 354}, {205, 102}} - - - 592 - - - - - - - 265 - {{606, 527}, {213, 14}} - - YES - - 68288064 - 272761856 - - - repo - - - - - - - - 265 - {{539, 505}, {65, 14}} - - YES - - 68288064 - 272761856 - Homepage: - - - - - - - - - 265 - {{606, 505}, {213, 14}} - - YES - - 68288064 - 272761856 - - - url - - - - - - - - 265 - {{567, 483}, {37, 14}} - - YES - - 68288064 - 272761856 - Forks: - - - - - - - - - 265 - {{606, 483}, {213, 14}} - - YES - - 68288064 - 272761856 - - - billions - - - - - - - - 265 - {{563, 464}, {41, 14}} - - YES - - 68288064 - 272761856 - Issues: - - - - - - - - - 265 - {{606, 464}, {213, 14}} - - YES - - 68288064 - 272761856 - - - none - - - - - - - - 268 - {{537, 313}, {81, 28}} - - YES - - 67239424 - 134348800 - Follow - - - -2038284033 - 129 - - - 200 - 25 - - - - - 268 - {{629, 313}, {81, 28}} - - YES - - 67239424 - 134348800 - Fork - - - -2038284033 - 129 - - - 200 - 25 - - - - {836, 587} - - - {{0, 0}, {1440, 878}} - {400, 319} - {3.40282e+38, 3.40282e+38} - - - YES - - - - YES - name - searchResults - homepage - numberOfForks - numberOfIssues - repoDescription - @count - - YES - - YES - YES - YES - YES - YES - - - - - YES - - - window - - - - 19 - - - - searchPredicatePopupButton - - - - 21 - - - - searchRelultsTableView - - - - 22 - - - - searchField - - - - 33 - - - - value: searchString - - - - - - value: searchString - value - searchString - 2 - - - 37 - - - - content: searchPredicates - - - - - - content: searchPredicates - content - searchPredicates - 2 - - - 40 - - - - searchGitHub: - - - - 44 - - - - contentArray: searchResults - - - - - - contentArray: searchResults - contentArray - searchResults - 2 - - - 49 - - - - searchResultsArrayController - - - - 50 - - - - value: arrangedObjects.name - - - - - - value: arrangedObjects.name - value - arrangedObjects.name - - YES - - YES - NSConditionallySetsEditable - NSRaisesForNotApplicableKeys - - - YES - - - - - 2 - - - 55 - - - - value: selection.name - - - - - - value: selection.name - value - selection.name - - YES - - YES - NSNoSelectionPlaceholder - NSRaisesForNotApplicableKeys - - - YES - repo - - - - 2 - - - 122 - - - - value: selection.numberOfIssues - - - - - - value: selection.numberOfIssues - value - selection.numberOfIssues - - YES - - YES - NSNoSelectionPlaceholder - NSNullPlaceholder - NSRaisesForNotApplicableKeys - - - YES - none - none - - - - 2 - - - 128 - - - - value: selection.numberOfForks - - - - - - value: selection.numberOfForks - value - selection.numberOfForks - - YES - - YES - NSNoSelectionPlaceholder - NSNullPlaceholder - NSRaisesForNotApplicableKeys - - - YES - billions - none - - - - 2 - - - 129 - - - - value: selection.homepage - - - - - - value: selection.homepage - value - selection.homepage - - YES - - YES - NSNoSelectionPlaceholder - NSNullPlaceholder - NSRaisesForNotApplicableKeys - - - YES - url - slacker - - - - 2 - - - 132 - - - - attributedString: selection.repoDescription - - - - - - attributedString: selection.repoDescription - attributedString - selection.repoDescription - - YES - - YES - NSConditionallySetsEditable - NSNoSelectionPlaceholder - NSNullPlaceholder - NSRaisesForNotApplicableKeys - - - YES - - it's awesome - slacker - - - - 2 - - - 133 - - - - enabled: selectedObjects.@count - - - - - - enabled: selectedObjects.@count - enabled - selectedObjects.@count - - NSRaisesForNotApplicableKeys - - - 2 - - - 145 - - - - enabled: selectedObjects.@count - - - - - - enabled: selectedObjects.@count - enabled - selectedObjects.@count - 2 - - - 148 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - YES - - - - - - 2 - - - - - 3 - - - YES - - - - - - 4 - - - YES - - - - - - - - - - - - - - - - - - - - 6 - - - YES - - - - - - - - 7 - - - YES - - - - - - 8 - - - YES - - - - - - 9 - - - YES - - - - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - YES - - - - - - 14 - - - - - 15 - - - - - 16 - - - YES - - - - - - 17 - - - - - 23 - - - - - 31 - - - YES - - - - - - 32 - - - - - 45 - - - searchResultsArrayController - - - 58 - - - YES - - - - - - 59 - - - - - 60 - - - YES - - - - - - 61 - - - - - 62 - - - YES - - - - - - - - 63 - - - - - 64 - - - - - 65 - - - - - 66 - - - YES - - - - - - 67 - - - - - 68 - - - YES - - - - - - 69 - - - YES - - - - - - 70 - - - - - 71 - - - - - 72 - - - YES - - - - - - 73 - - - YES - - - - - - 74 - - - - - 75 - - - - - 76 - - - YES - - - - - - 77 - - - YES - - - - - - 78 - - - - - 79 - - - - - 134 - - - YES - - - - - - 135 - - - - - 136 - - - YES - - - - - - 137 - - - - - - - YES - - YES - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 1.IBWindowTemplateEditedContentRect - 1.NSWindowTemplate.visibleAtLaunch - 1.WindowOrigin - 1.editorWindowContentRectSynchronizationRect - 10.IBPluginDependency - 11.IBPluginDependency - 12.IBPluginDependency - 13.IBPluginDependency - 134.IBPluginDependency - 134.IBViewBoundsToFrameTransform - 135.IBPluginDependency - 136.IBPluginDependency - 136.IBViewBoundsToFrameTransform - 137.IBPluginDependency - 14.IBPluginDependency - 15.IBPluginDependency - 16.IBPluginDependency - 17.IBPluginDependency - 2.IBPluginDependency - 3.IBEditorWindowLastContentRect - 3.IBPluginDependency - 3.IBWindowTemplateEditedContentRect - 3.NSWindowTemplate.visibleAtLaunch - 3.windowTemplate.hasMinSize - 3.windowTemplate.minSize - 31.IBPluginDependency - 31.IBViewBoundsToFrameTransform - 32.IBPluginDependency - 4.IBPluginDependency - 45.IBPluginDependency - 58.IBPluginDependency - 58.IBViewBoundsToFrameTransform - 59.IBPluginDependency - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 60.IBPluginDependency - 60.IBViewBoundsToFrameTransform - 61.IBPluginDependency - 62.IBPluginDependency - 62.IBViewBoundsToFrameTransform - 63.IBPluginDependency - 64.IBPluginDependency - 65.IBPluginDependency - 66.IBPluginDependency - 66.IBViewBoundsToFrameTransform - 67.IBPluginDependency - 68.IBPluginDependency - 68.IBViewBoundsToFrameTransform - 69.IBPluginDependency - 69.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 70.IBPluginDependency - 71.IBPluginDependency - 72.IBPluginDependency - 72.IBViewBoundsToFrameTransform - 73.IBPluginDependency - 73.IBViewBoundsToFrameTransform - 74.IBPluginDependency - 75.IBPluginDependency - 76.IBPluginDependency - 76.IBViewBoundsToFrameTransform - 77.IBPluginDependency - 77.IBViewBoundsToFrameTransform - 78.IBPluginDependency - 79.IBPluginDependency - 8.IBPluginDependency - 9.IBEditorWindowLastContentRect - 9.IBPluginDependency - - - YES - {{322, 586}, {480, 270}} - com.apple.InterfaceBuilder.CocoaPlugin - {{322, 586}, {480, 270}} - - {196, 240} - {{202, 428}, {480, 270}} - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEBkAAw6mAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEBkAAw6mAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.apple.InterfaceBuilder.CocoaPlugin - {{256, 152}, {836, 587}} - com.apple.InterfaceBuilder.CocoaPlugin - {{256, 152}, {836, 587}} - - - {400, 300} - com.brandonwalkin.BWToolkit - - P4AAAL+AAABDIgAAxAzAAA - - com.brandonwalkin.BWToolkit - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEDUAAxAbAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABBqAAAxAbAAA - - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEBcAAxAFAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEGIAAxAFAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEF4AAxAbAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEBsAAxAFAAA - - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEF4AAxAFAAA - - com.brandonwalkin.BWToolkit - - P4AAAL+AAABBmAAAxA1AAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEDcAAw/eAAA - - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEF4AAw/eAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEDcAAw/eAAA - - com.brandonwalkin.BWToolkit - - P4AAAL+AAABEF4AAw/eAAA - - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - com.brandonwalkin.BWToolkit - {{282, 657}, {139, 54}} - com.brandonwalkin.BWToolkit - - - - YES - - - YES - - - - - YES - - - YES - - - - 148 - - - - YES - - TestAppWindowController - NSWindowController - - searchGitHub: - id - - - searchGitHub: - - searchGitHub: - id - - - - YES - - YES - searchField - searchPredicatePopupButton - searchRelultsTableView - searchResultsArrayController - - - YES - BWStyledTextField - BWTransparentPopUpButton - BWTransparentTableView - NSArrayController - - - - YES - - YES - searchField - searchPredicatePopupButton - searchRelultsTableView - searchResultsArrayController - - - YES - - searchField - BWStyledTextField - - - searchPredicatePopupButton - BWTransparentPopUpButton - - - searchRelultsTableView - BWTransparentTableView - - - searchResultsArrayController - NSArrayController - - - - - IBProjectSource - TestAppWindowController.h - - - - - YES - - BWStyledTextField - NSTextField - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWStyledTextField.h - - - - BWStyledTextFieldCell - NSTextFieldCell - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWStyledTextFieldCell.h - - - - BWTransparentButton - NSButton - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentButton.h - - - - BWTransparentButtonCell - NSButtonCell - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentButtonCell.h - - - - BWTransparentPopUpButton - NSPopUpButton - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentPopUpButton.h - - - - BWTransparentPopUpButtonCell - NSPopUpButtonCell - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentPopUpButtonCell.h - - - - BWTransparentScrollView - NSScrollView - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentScrollView.h - - - - BWTransparentScroller - NSScroller - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentScroller.h - - - - BWTransparentTableView - NSTableView - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentTableView.h - - - - BWTransparentTableViewCell - NSTextFieldCell - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentTableViewCell.h - - - - BWTransparentTextFieldCell - NSTextFieldCell - - IBFrameworkSource - BWToolkitFramework.framework/Headers/BWTransparentTextFieldCell.h - - - - NSActionCell - NSCell - - IBFrameworkSource - AppKit.framework/Headers/NSActionCell.h - - - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - - - NSApplication - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h - - - - NSArrayController - NSObjectController - - IBFrameworkSource - AppKit.framework/Headers/NSArrayController.h - - - - NSButton - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSButton.h - - - - NSButtonCell - NSActionCell - - IBFrameworkSource - AppKit.framework/Headers/NSButtonCell.h - - - - NSCell - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSCell.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSController - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSController.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSManagedObjectContext - NSObject - - IBFrameworkSource - CoreData.framework/Headers/NSManagedObjectContext.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMenuItemCell - NSButtonCell - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItemCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObjectController - NSController - - IBFrameworkSource - AppKit.framework/Headers/NSObjectController.h - - - - NSPanel - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSPanel.h - - - - NSPopUpButton - NSButton - - IBFrameworkSource - AppKit.framework/Headers/NSPopUpButton.h - - - - NSPopUpButtonCell - NSMenuItemCell - - IBFrameworkSource - AppKit.framework/Headers/NSPopUpButtonCell.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSScrollView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSScrollView.h - - - - NSScroller - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSScroller.h - - - - NSTableColumn - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableColumn.h - - - - NSTableView - NSControl - - - - NSText - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSTextField - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSTextField.h - - - - NSTextFieldCell - NSActionCell - - IBFrameworkSource - AppKit.framework/Headers/NSTextFieldCell.h - - - - NSTextView - NSText - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSUserDefaultsController - NSController - - IBFrameworkSource - AppKit.framework/Headers/NSUserDefaultsController.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSView - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSView+BWAdditions.h - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSWindow - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - NSWindow - - IBFrameworkSource - BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h - - - - NSWindowController - NSResponder - - showWindow: - id - - - showWindow: - - showWindow: - id - - - - IBFrameworkSource - AppKit.framework/Headers/NSWindowController.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - Test.xcodeproj - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h deleted file mode 100644 index 157951e32..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// TestAppWindowController.h -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// duuuuuuuude - -#import -#import - -@interface TestAppWindowController : NSWindowController {} - -@property (nonatomic, copy) NSString *searchString; -@property (nonatomic, retain) IBOutlet BWStyledTextField *searchField; - -@property (nonatomic, retain) NSArray *searchPredicates; -@property (nonatomic, retain) IBOutlet BWTransparentPopUpButton *searchPredicatePopupButton; - -@property (nonatomic, copy) NSArray *searchResults; -@property (nonatomic, retain) IBOutlet NSArrayController *searchResultsArrayController; -@property (nonatomic, retain) IBOutlet BWTransparentTableView *searchRelultsTableView; - - -- (IBAction)searchGitHub:(id)sender; - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m b/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m deleted file mode 100644 index 687dc23bd..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestAppWindowController.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// TestAppWindowController.m -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "TestAppWindowController.h" -#import "GHGitHubClient.h" -#import "GHGitHubUser.h" -#import "GHGitRepository.h" - -static NSString * const kEverything = @"Everything"; -static NSString * const kRepositories = @"Repositories"; -static NSString * const kUsers = @"Users"; -static NSString * const kCode = @"Code"; - -enum { GHSearchPredicateEverything = 0, GHSearchPredicateRepositories, GHSearchPredicateUsers, GHSearchPredicateCode}; - -@interface TestAppWindowController () -- (NSArray *)unknownUserResults; -@end - - -@implementation TestAppWindowController - -@synthesize searchString; -@synthesize searchField; - -@synthesize searchPredicates; -@synthesize searchPredicatePopupButton; - -@synthesize searchResults; -@synthesize searchResultsArrayController; -@synthesize searchRelultsTableView; - -- (void)dealloc { - - self.searchString = nil; - self.searchResults = nil; - self.searchPredicates = nil; - [super dealloc]; -} - -#pragma mark - - -- (void)windowDidLoad { - - [self.window setHidesOnDeactivate:YES]; - - self.searchPredicates = [NSArray arrayWithObjects: kEverything, kRepositories, kUsers, kCode, nil]; - - [[GHGitHubClient sharedClient] requestRepositoryWithName:@"controls" forUserWithName:@"joericioppo" completionBlock:^(GHGitRepository *repository, NSError *error) { - NSLog(@"[%@ %s], repository: %@", self, _cmd, repository); - }]; -} - -- (IBAction)searchGitHub:(id)sender { - - NSInteger selectedPredicate = [self.searchPredicatePopupButton indexOfSelectedItem]; - - switch (selectedPredicate) { - case GHSearchPredicateEverything: - break; - case GHSearchPredicateRepositories: - break; - case GHSearchPredicateUsers: - [[GHGitHubClient sharedClient] requestRepositoriesForUserWithName:self.searchString completionBlock:^(NSArray *repositories, NSError *error) { - self.searchResults = repositories ?: [self unknownUserResults]; - }]; - break; - case GHSearchPredicateCode: - break; - default: - break; - } -} - -- (NSArray *)unknownUserResults { - - - // blah blah blah - return [NSArray arrayWithObject:[NSDictionary dictionaryWithObject:@"We don't know anyone with that name.." forKey:@"name"]]; -} - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h deleted file mode 100644 index b9f5d89e1..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// TestSearchField.h -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 GitHub. All rights reserved. -// - -#import - - -@interface TestSearchField : NSSearchField { - -} - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m b/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m deleted file mode 100644 index c65b1936a..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestSearchField.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// TestSearchField.m -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 GitHub. All rights reserved. -// - -#import "TestSearchField.h" -#import "TestSearchFieldCell.h" - -@implementation TestSearchField - -+ (Class)cellClass { - - return [TestSearchFieldCell class]; -} - -- (id) initWithFrame:(NSRect)frame { - - if (self = [super initWithFrame:frame]) { - - self.drawsBackground = NO; - } - - return self; -} - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h deleted file mode 100644 index bbdf80ca9..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// TestSearchFieldCell.h -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 GitHub. All rights reserved. -// - -#import - - -@interface TestSearchFieldCell : NSSearchFieldCell { - -} - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m b/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m deleted file mode 100644 index fbdfc342f..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/TestSearchFieldCell.m +++ /dev/null @@ -1,15 +0,0 @@ -// -// TestSearchFieldCell.m -// Test -// -// Created by Joe Ricioppo on 9/29/10. -// Copyright 2010 GitHub. All rights reserved. -// - -#import "TestSearchFieldCell.h" - - -@implementation TestSearchFieldCell - - -@end diff --git a/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch b/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch deleted file mode 100644 index 6eee0b8fb..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/Test_Prefix.pch +++ /dev/null @@ -1,9 +0,0 @@ -// -// Prefix header for all source files of the 'Test' target in the 'Test' project -// - -#ifdef __OBJC__ - #import -#endif - -3454 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m b/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m deleted file mode 100644 index ca8b685a3..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/dolla$billy'all.m +++ /dev/null @@ -1,20 +0,0 @@ -//a -// main.m -// Test -// -// Created by Joe Ricioppo on 9/28/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// -d - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **) argv); -} -123456789 -123456789 -123456789 -123456789 -12 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/main copy.m b/ObjectiveGitTests/fixtures/Test_App/main copy.m deleted file mode 100644 index 67a236e0e..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/main copy.m +++ /dev/null @@ -1,23 +0,0 @@ -// -// main.m -// Test -// -// Created by Joe Ricioppo on 9/28/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -1 - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **) argv); -} -123456789 -123456789 -123456789 -123456789 -12 -123456789 -12 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/Test_App/main.m b/ObjectiveGitTests/fixtures/Test_App/main.m deleted file mode 100644 index e4482d521..000000000 --- a/ObjectiveGitTests/fixtures/Test_App/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// Test -// -// Created by Joe Ricioppo on 9/28/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **) argv); -} -123456789 -123456789 -123456789 -123456789!blah! diff --git a/ObjectiveGitTests/fixtures/testrepo.git/HEAD b/ObjectiveGitTests/fixtures/testrepo.git/HEAD deleted file mode 100644 index cb089cd89..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/HEAD +++ /dev/null @@ -1 +0,0 @@ -ref: refs/heads/master diff --git a/ObjectiveGitTests/fixtures/testrepo.git/config b/ObjectiveGitTests/fixtures/testrepo.git/config deleted file mode 100644 index af107929f..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/config +++ /dev/null @@ -1,6 +0,0 @@ -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true - ignorecase = true diff --git a/ObjectiveGitTests/fixtures/testrepo.git/description b/ObjectiveGitTests/fixtures/testrepo.git/description deleted file mode 100644 index 498b267a8..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/ObjectiveGitTests/fixtures/testrepo.git/index b/ObjectiveGitTests/fixtures/testrepo.git/index deleted file mode 100644 index a529451b1958ca2b60444aade5759f85823c60ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmZ?q402{*U|<4a@2Bto0BHso%?A=sy|#jZp>YWV1LIea91ySww|+`lzdb5!>AvGm z&iiJYRWCWk!N3;e>geL@3R2+x@_;uo4K^oj$viZ3IDdI=D4(u8acu;1LBOZw@g 1273360386 -0700 commit (initial): testing -8496071c1b46c854b31185ea97743be6a8774479 5b5b025afb0b4c913b4c338a42934a3863bf3644 Scott Chacon 1273610322 -0700 commit: another commit -5b5b025afb0b4c913b4c338a42934a3863bf3644 36060c58702ed4c2a40832c51758d5344201d89a Scott Chacon 1288115062 -0200 push diff --git a/ObjectiveGitTests/fixtures/testrepo.git/logs/refs/heads/master b/ObjectiveGitTests/fixtures/testrepo.git/logs/refs/heads/master deleted file mode 100644 index cd6d2267a..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/logs/refs/heads/master +++ /dev/null @@ -1,3 +0,0 @@ -0000000000000000000000000000000000000000 8496071c1b46c854b31185ea97743be6a8774479 Scott Chacon 1273360386 -0700 commit (initial): testing -8496071c1b46c854b31185ea97743be6a8774479 5b5b025afb0b4c913b4c338a42934a3863bf3644 Scott Chacon 1273610322 -0700 commit: another commit -5b5b025afb0b4c913b4c338a42934a3863bf3644 36060c58702ed4c2a40832c51758d5344201d89a Scott Chacon 1288115062 -0200 push diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/04/7142d55581bfb3a703eec247e4fadd5666e789 b/ObjectiveGitTests/fixtures/testrepo.git/objects/04/7142d55581bfb3a703eec247e4fadd5666e789 deleted file mode 100644 index 36946a78aded69966eadac024d1b685b28a6c232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmV->0EGW|0ga7I3d1lA1-tesv@aC9{=|k*a)@5QR+Pk0)sQIU`t=d|b~7+MY|K@_ zcz=_f2++;g!IPWak~L{eXcu&0unq^bzF4HBi^`{LZHISd7zIDX(^_Ra%L5y~z&um* dA;w_fuKQHC{YU8kLVf81rsK#f{Q!pdGD4n7J~aRU diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/08/ca5b320ed2111f62ec74158b52242757664516 b/ObjectiveGitTests/fixtures/testrepo.git/objects/08/ca5b320ed2111f62ec74158b52242757664516 deleted file mode 100644 index 3336369c1..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/08/ca5b320ed2111f62ec74158b52242757664516 +++ /dev/null @@ -1,2 +0,0 @@ -xA -Ã0 {ö+t/%–›Bé#ú[QCUC¢Ðï×OèÞf`X®ªÅ  áb»0ÍÜ Í´$äÈ~aºžx`²g‰˜]:m«;¼ŠÂdü}®Å¶3߸êº>ŽGì ®Øæšm?&ÿî#_P9Ž´ÊY2$ \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d b/ObjectiveGitTests/fixtures/testrepo.git/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d deleted file mode 100644 index bfe146a5a809d2163d2a521b57be55a6459054f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmV;10D1p-0UeA%3c@fD06pgw`vFUm-If$Y1fSpwc0(E~#uT#%{@&EfFqawS436kf z<&mPoD5F?E@*-9!&JH^f1CyVT7{i3J;6!BfyCsOVlvR!P$HxtJmz>^ki&Yh_caHT1 orxyQm$%WVF(33MbAA)m)0pV!9wZ>>_3j3#|);K5g1ApKxugrQtFaQ7m diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 b/ObjectiveGitTests/fixtures/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 deleted file mode 100644 index cedb2a22e6914c3bbbed90bbedf8fd2095bf5a7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19 acmb-^#7G-5C`FfcPQQ3!H%bn$g%SfOmF@NI2De~WFK%%kl}eMcVO zI|fyeRFs&PoDrXvnUktlQc=R-y0dwo*>)TDjyrSqY|q)<@TYo1I8Fm*0&IVk`D diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/23/c5964c265e17b12ce89320ec21b5015f033a66 b/ObjectiveGitTests/fixtures/testrepo.git/objects/23/c5964c265e17b12ce89320ec21b5015f033a66 deleted file mode 100644 index 0297a001b..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/23/c5964c265e17b12ce89320ec21b5015f033a66 +++ /dev/null @@ -1,2 +0,0 @@ -xA -ƒ0E»Î)f_(‰IÔ@)=D/|G t*èH¯ß¡÷<>6‘ªäb¼èÎLDS˜³e‹?#ôƒàcñàd‹É§®ÛN¯*tW¼YžKÕõ,7lò ×¥1ö£w]m›i¶ý(ÿ_˜Iø8òÂ?ƒ¯20 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/2c/8611f5dacf3c106cd90f4b71e40f87c64cfdab b/ObjectiveGitTests/fixtures/testrepo.git/objects/2c/8611f5dacf3c106cd90f4b71e40f87c64cfdab deleted file mode 100644 index 355b052180d53df499b2e2393d13afd689c7ec27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmV-=0EPc}0ga783c@fDMP26aGsZv>58(xp>9h?v2HGiJ-yFfedk-F;n`$)} zh)%YN0OQ0RNN~bAd-0q&%#61fkRt~wfhGCk@?mS+;8hhyF!c8AAT+^L= cL<(^BeXiU7WAcCDKJo>Xeb0;h0D~(sE`T98WdHyG diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 b/ObjectiveGitTests/fixtures/testrepo.git/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 deleted file mode 100644 index 3cd240db52b878954cf28186a859d716910768e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmV-@0D}K`0hNtg3c@fD0R7G>_5_l2HxEHX=n*`@Ca!J4G|;Sg{T6TF-^|A_rPaD9 zxPT|!M8G9yFai7`;bLwJGYciILV1ML*AZ;s&Ky$6qvCQ_A# z5Kg)=6a0h@f&Jv?Y}q2g&G5JAJR)2u4xDT;`Ovj(^r}Lm;?440s;)=5pvi-VYq|#; cQ%rQWeWu&~qx^qiKKv!&ea{R30Eg8wNTd2Z@&Et; diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/32/4d981d11440240df53e825b6eba0afddcb39fa b/ObjectiveGitTests/fixtures/testrepo.git/objects/32/4d981d11440240df53e825b6eba0afddcb39fa deleted file mode 100644 index a3b4c322d..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/32/4d981d11440240df53e825b6eba0afddcb39fa +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³Jb&¦á’é´ 8Ú)^ß¡÷<>5‘ªàB¸èÆ „uŒÎÙ²¥D~&¼Gɇ≓-&º¶ ÞUà¡ôay-U×£ Ôä î–Æà숮¶ÏtÛ”ÏæË?Þ÷¼ðƒq20 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/36/060c58702ed4c2a40832c51758d5344201d89a b/ObjectiveGitTests/fixtures/testrepo.git/objects/36/060c58702ed4c2a40832c51758d5344201d89a deleted file mode 100644 index 0c6246061..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/36/060c58702ed4c2a40832c51758d5344201d89a +++ /dev/null @@ -1,2 +0,0 @@ -xŽQ -Â0ýÎ)re“Ý´ ˆÁ$Û­-˜FÒíý-ÁŸÇ00𸖲¨õ¾?i±L#»‚ÐHSŽŒS×#qÏ2²DÈæ“š¬jC|HS†L‹8$ò)áÐaž°#2i×¹6ûäªjsâºÚëÆ?¸¿JZÞ®åfçtΞÁ˜ÃUþiͶçqiÂZÛ"›ù_/H6 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/36/a1a2e1ebed3bb4de53d2d0d3982dd724caa7de b/ObjectiveGitTests/fixtures/testrepo.git/objects/36/a1a2e1ebed3bb4de53d2d0d3982dd724caa7de deleted file mode 100644 index 6725b6f35..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/36/a1a2e1ebed3bb4de53d2d0d3982dd724caa7de +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$if¬á’é´ 8Ú)^ßÁ¿{Ÿ›j5D'ÛD€qâ$8᜽xNgÆë‘GŽT"KòÅåÃÖ¶Á«*ÜߢϥÚz” 7}@Ò‚§!ÂÙ÷¹nûÉÿ…ûÈTö=/ò€72 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 b/ObjectiveGitTests/fixtures/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 deleted file mode 100644 index 7ca4ceed50400af7e36b25ff200a7be95f0bc61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 acmbWGsZv>58(xp>9h?v7TPIZ-yFfedk-F;SJh?^ zh)%YN0OQCVNN~idc=4P$PK>t{krPL%ktO@;%3;g8!K*0@#&6N*+-y1Og;#w*xaK?g cL>S=g`&_sE$K?OQedG%&`(9@G0fKolD)}ornE(I) diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/49/4a45810d66a43ff2ed747db6f13d7779436de5 b/ObjectiveGitTests/fixtures/testrepo.git/objects/49/4a45810d66a43ff2ed747db6f13d7779436de5 deleted file mode 100644 index 420c28eaa..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/49/4a45810d66a43ff2ed747db6f13d7779436de5 +++ /dev/null @@ -1,2 +0,0 @@ -xA -ƒ0E»Î)f/”h2Ñ@)=D/Œ£: èH¯ßÁ¿{ŸªHQèoº3ù™ ûÙ/ɲ¥Hn!Fçi$‡ÙG›M:u«;¼‹ÀCéÃòZ‹ng¾S•'ôCœ0Lèl›i¶ý(_/Ì— |iå?†)2> \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 b/ObjectiveGitTests/fixtures/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 deleted file mode 100644 index 8953b6cef..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +++ /dev/null @@ -1,2 +0,0 @@ -xŽQ -Â0DýÎ)öÊ6›Í¦ "xO°‰‰-ØFb¼¿EoàÏ0 ¼Ç¤º,ske×[ÎPn8R,EpD?±gŸ}Ê^3² âÙ<µåµGŽhYKÄèÒ8ЖDAÉ)¿ÉÈ;gôݧÚàšjïp™4Õޝô-çû¢óãêr‚ÁŠ;°s°GA4Ûº=ìùÖ(ôin7øIÌKÍFE \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/4b/d7c21254336b430f3dcaca0bf27124edbfd979 b/ObjectiveGitTests/fixtures/testrepo.git/objects/4b/d7c21254336b430f3dcaca0bf27124edbfd979 deleted file mode 100644 index 32ca2d676..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/4b/d7c21254336b430f3dcaca0bf27124edbfd979 +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$1c Há’é´ 8Ú)^¿9‚÷<>5‘ªàB¸èÆ „uŒÎÙ²¥D~&|Dɇ≓-&º¶ ÞU`Pú°ŒKÕõ(7jòwOÏà,ÆWÛgºí?ÊÿæË?Þ÷¼ð ƒÁ22 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/58/2ab21929a82c7c1c10521f371fa011e41a6730 b/ObjectiveGitTests/fixtures/testrepo.git/objects/58/2ab21929a82c7c1c10521f371fa011e41a6730 deleted file mode 100644 index fb67e6122..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/58/2ab21929a82c7c1c10521f371fa011e41a6730 +++ /dev/null @@ -1,3 +0,0 @@ -xA -Â0E]ç³$1‰m@ÄCxäwÚí¯oŽàß½&R•\Œ'ݘ aB‡Èa -s¶l‘àg„ÛàøX<8Ùbò¡kÛèU…îŠ7Ës©ºå‚&r×4FgélûL·ýGùÿÂ|øKÂûžþ€Ý2" \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/58/3cf9deb2f587481b3e88f700066764351c5a98 b/ObjectiveGitTests/fixtures/testrepo.git/objects/58/3cf9deb2f587481b3e88f700066764351c5a98 deleted file mode 100644 index dcd7c5019..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/58/3cf9deb2f587481b3e88f700066764351c5a98 +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$i&¦" $Óip ´S¼¾9‚÷<>5‘ªàB¸èÎ „3uŒ3.Ù²¥D~!¼Gɇ≓-&Ÿºµ^U`Rz³<תÛYnÔänHc°£"\mŸé¶ÿ(ÿ_˜Aø8òÊ?‚Å2, \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 b/ObjectiveGitTests/fixtures/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 deleted file mode 100644 index c1f22c54f..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +++ /dev/null @@ -1,2 +0,0 @@ -xŽÛ 1EýNi@™Ék2 "X‚$ÙYW0YcÿíÀ¿Ã…s¸¥ÕzïÚÚõMDÏ€0æœ8!¶†ÉÌÞs‰ XŠªgÚdí::@X0»P¢wÙ"F/‰‰œÍRàˆUz÷¥múZZïú²¤ÒV}|•/œo5݇ÒêI£!¬1z Æ:vùÇUim}ê/¢> -öF- \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 b/ObjectiveGitTests/fixtures/testrepo.git/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 deleted file mode 100644 index 1fd79b47794e916f9873ed60f1cb92815d3295b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmV-)0E_>40V^p=O;s>7FlI0`FfcPQQ3!H%bn$g%5N`dHvVMD1*wTH+ot*d0HmhE8 ziUX=5FST5+q@sl3m*BB-TI?58(xp>9h?v2HGiJ-yFfedk-F;n`$+n z7*Do|0EdY?LŽ´ò†A2> \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a b/ObjectiveGitTests/fixtures/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a deleted file mode 100644 index 2ef4faa0f82efa00eeac6cae9e8b2abccc8566ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmV--0Eqv10V^p=O;s>7G-5C`FfcPQQ3!H%bn$g%5N`dHvVMD1*wTH+ot*d0HmhE8 ziUX=5sVFfoIU_zTGbdHAq@skub!YQFv+XwQ9e3vJ*`Bkz;ZOC3aH!I})N-(rU!EJv Zrz=lf8^K%<@M(E`$>VgnNdSzWFYprfIFkSX diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d b/ObjectiveGitTests/fixtures/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d deleted file mode 100644 index 2f9b6b6e3d9250ba09360734aa47973a993b59d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV-Y0ImOc0V^p=O;s?nWH2-^Ff%bx2y%6F@pWZbp=_w|ZEZn+i*1|CqwPw4M;_lh o233)lTCP`8QNplXwC&*i7t3XG_U8!Ackl^w`fs=w02$OB|A$m1)Bpeg diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 b/ObjectiveGitTests/fixtures/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 deleted file mode 100644 index 5df58dda56789631c78aeed62708e1b694440195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmV-^0D=E_0iBK82?8+?0R2uC+kmpkZXSY&U

RiSaIAE^xQ@?_ml44FkiJ(R)*{ z(H(TH6>PFd5&0~h#n$X!k{LPpBqYvbW+w8_Xyl{wSm9BID%@u&V}Z+7esG(*wD+lu geg*3yQ9w!oju;WmZug_se_Eq;)3!|J3!n-%%(!(uEdT%j diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/92/867bc5db73e8182a7bf7387dabda57efa9f0c8 b/ObjectiveGitTests/fixtures/testrepo.git/objects/92/867bc5db73e8182a7bf7387dabda57efa9f0c8 deleted file mode 100644 index a4502a0f0..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/92/867bc5db73e8182a7bf7387dabda57efa9f0c8 +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$1Ic@ÄCxäwÚ í¯oŽàß½U¤)¹Oº1ˆ‘æbÙ"ÃOCò >Vζšrè²nôjBwÅ›å97]ŽzÁ*r×|‹6 ÞÑÙö™nûòÿ…ùð—„÷½Ìü‚{2* \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a b/ObjectiveGitTests/fixtures/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a deleted file mode 100644 index a79612435..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +++ /dev/null @@ -1,3 +0,0 @@ -xŽ[ -Â0EýÎ*fÊäÕ¤ "¸W0“‡-ØFâtÿÝ—çpS[–YÀ˜x^ -Díb CLhutɉ}¥8X*4Zí¬sY½¨—UÀ‘AÃÖ ÌX3‡R«Mµ¶) s6è¼¢M¦ÖážšÜ&Jm…ó;}Çõ±Ðü<¥¶\@›à‚ÑÞpÄ€¨vº?”ò«jÛºLð«¨Ø?Hå \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/a3/5622ee2ca7c7cf68abdcad335588fbb8bca9ec b/ObjectiveGitTests/fixtures/testrepo.git/objects/a3/5622ee2ca7c7cf68abdcad335588fbb8bca9ec deleted file mode 100644 index 4b3010a61..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/a3/5622ee2ca7c7cf68abdcad335588fbb8bca9ec +++ /dev/null @@ -1,2 +0,0 @@ -xA -Ã0 {ö+t/§–šBÉ#ú[QCUC¢ÐïÇOèÞf`X®ªÅ #ºØ&Œ7 Á çäÅsä03>ú€Üs X¢Ï.¶Ö ÞEa0þˆŽK±õÈ7®ú‚îŸä#R€«osͶ“ÿ ÷•¨ì{Zäƒë22 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f b/ObjectiveGitTests/fixtures/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f deleted file mode 100644 index f8588696b..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +++ /dev/null @@ -1,2 +0,0 @@ -x;j1DëmdÓú·À˜ÇŽ|M«µ3`ŒV{ >€³âQ¯ ¸·vL0I?Í!š4–Z=Ê! ×¦8²F¢Ã’!rÖsQßyÈ9]$DŽ&„l6AÇ>jFWüÒµ IKNiûë§Z¢%¡SˆŒ‘ -‹Ò ­ÅʉøU~̽øä>'¼ï™û ¯wþ ×[ËÇ× ÷öÚDGÚ¡±ðŒQ-ºMù«>dܶ‘OÞáÒò}í\à8g_ШÂoYr \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd b/ObjectiveGitTests/fixtures/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd deleted file mode 100644 index d0d7e736e536a41bcb885005f8bf258c61cad682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28 kcmbBQQQ6W+Sv9;eTEK4oHX{LN+y0Ic;3tpET3 diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 b/ObjectiveGitTests/fixtures/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 deleted file mode 100644 index 18a7f61c29ea8c5c9a48e3b30bead7f058d06293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26 icmb \Ó=†à‘àìû\·ýÇäÿÂ}ä *ûžùw2 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/b6/8f98fb09ce029c462ab6cb4b0a6bd388991008 b/ObjectiveGitTests/fixtures/testrepo.git/objects/b6/8f98fb09ce029c462ab6cb4b0a6bd388991008 deleted file mode 100644 index 7b44de1c6..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/b6/8f98fb09ce029c462ab6cb4b0a6bd388991008 +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³Jb&©á’é´ 8Ú)^ß¡÷<>5‘ªàB¸èÆ „uŒÎÙ²¥D~&Œ£Gɇ≓-&º¶ ÞUà¡ôay-U×£ Ôä î–îÁÙ®¶ÏtÛ”ÏæË?Þ÷¼ð‚_2* \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/b8/f63858750d58a047fb01de56600a848d148c5c b/ObjectiveGitTests/fixtures/testrepo.git/objects/b8/f63858750d58a047fb01de56600a848d148c5c deleted file mode 100644 index 1f9a17806..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/b8/f63858750d58a047fb01de56600a848d148c5c +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³dâ$¶á’é´ 8Ú)^ßÁ¿{Ÿ›j5ð1žlwˆ¦0gäÄ4s¸ x`Š…X—[Û¯ªp7~‹>—jëQ.ÜôþšÆèq$„3ö¹nûÉÿ…ûÈTö=/ò€Ÿ2 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 b/ObjectiveGitTests/fixtures/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 deleted file mode 100644 index 0817229bc..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 +++ /dev/null @@ -1,3 +0,0 @@ -xKj1D³Ö)zçUBëÛ-0ÁuV9¦Õò<#£È÷ÏȲ+ŠW40V^p=O;s>7Fk&z?FfcPQQ3!H%bn$g%5N`dHvVMD1*wTH+ot*d0HmhE8 ziUX=5FST5+q@sl3m*B`¸¦[F‚3ö¹nûÉÿ…ûÈTö=/ò…Ñ2< \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/dc/e40996517d8183ba11d2d0de35c5513db7cd6b b/ObjectiveGitTests/fixtures/testrepo.git/objects/dc/e40996517d8183ba11d2d0de35c5513db7cd6b deleted file mode 100644 index 69ada751c..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/dc/e40996517d8183ba11d2d0de35c5513db7cd6b +++ /dev/null @@ -1,2 +0,0 @@ -x[ -Â0EýÎ*æ_Ô$ME\„Hn§p ´SܾY‚÷ï8\T‘M© á¢;3ÁOhØO~Ζ-Ü ßGçáBqàd‹É§®u§×&4*Þ,ÏeÓõ,7TyPwOC°iˆ=]m›i¶ý(ÿ_˜Iø8òÂ?‡)2D \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/e3/02ade1ce3d2729bbe053dd8f923b294336437e b/ObjectiveGitTests/fixtures/testrepo.git/objects/e3/02ade1ce3d2729bbe053dd8f923b294336437e deleted file mode 100644 index c18cfcd1b..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/e3/02ade1ce3d2729bbe053dd8f923b294336437e +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$if¬á’é´ 8Ú)^ßÁ¿{Ÿ›j5D'ÛD€qâ$8᜽xNgÆë‘GŽT"KòÅåÃÖ¶Á«*ÜߢϥÚz” 7}@Ò‚'àìû\·ýÇäÿÂ}ä *ûžù€ñ2" \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/e4/065ef1811aa1279362c275aab504b846067a9f b/ObjectiveGitTests/fixtures/testrepo.git/objects/e4/065ef1811aa1279362c275aab504b846067a9f deleted file mode 100644 index 957818e24..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/objects/e4/065ef1811aa1279362c275aab504b846067a9f +++ /dev/null @@ -1,2 +0,0 @@ -xA -Â0E]ç³$1Ic@ÄCxäwÚ í¯oŽàß½U¤)¹Oº1ˆ‘æbÙ"ÃOCò >Vζšrè²nôjBwÅ›å97]ŽzÁ*r×|‹Îæ!ÑÙö™nûòÿ…ùð—„÷½Ìü„‡26 \ No newline at end of file diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/ObjectiveGitTests/fixtures/testrepo.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 deleted file mode 100644 index 711223894375fe1186ac5bfffdc48fb1fa1e65cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15 WcmbO_!ryu*!pmYrch; cZA^5weWu&~qx^qiKKv!&eJ?Zr0EUAyKml4mvH$=8 diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/f6/0079018b664e4e79329a7ef9559c8d9e0378d1 b/ObjectiveGitTests/fixtures/testrepo.git/objects/f6/0079018b664e4e79329a7ef9559c8d9e0378d1 deleted file mode 100644 index 03770969aa16f40d4192c733408f152fc17b1f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmV-Y0ImOc0V^p=O;s?nWH2-^Ff%bx2y%6F@pWYoZvB+9etT5d(tXFBocGN(t6p-7 o1F9k~wOp^HqJ-g>=Z5m>$`jW{Fc$=TS{`5WI9+ZM01*fsda7_Ea{vGU diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 b/ObjectiveGitTests/fixtures/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 deleted file mode 100644 index 112998d425717bb922ce74e8f6f0f831d8dc4510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24 gcmbYw4{Y+*Z5}2Csyees*{;KHB55dV&?dF#`kRGN5~TfOsX4T@J*P yfLQIszKM4h+|MXn`snRCm0er%Quq9yFn5~doV&qSCs?ySKaj$-^Vag-Df$4qg=3fi diff --git a/ObjectiveGitTests/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack b/ObjectiveGitTests/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack deleted file mode 100644 index 74c7fe4f3a657d606a4a004c87336749079c0edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmWG=boORoU|<4bwrPA7bLRHNavd@dXt`h9wYOo@&ulXVr3x1R33=PLWk|2oj=R6e z{6ngQ-HiT=p)71gtxNdtSc@#my7+iQ>e4qWip{2_EIvQCa!ROJYez<`n&YvUtTcI* z9TTeiTBZe0nUf^pW%6`sa`eMPzM|)nA8tGF@Z|lXUFTAFz2AA(eS_Z5b4eUxWitfM zx;^&{{dY4@|EHR09p8m=V|lCdF3HolfsX5m=3+ABVfbI&731*Idp5t|LFI}jHQzg~ zyQiAoi@zxS!<^^L4J{_ighMw%nza;7mv(7p=6M|PE%R{fdiLnm>17)awYE#nS$-B0AgjUCm@D?V9#TFX)~ z$JoTcz}PU*66+=E@hWo`*7*&jWecg0;xw=p8Q#< znGm{LIG-cz>zd?K^@r5dt1_-_DeboX%y8$7^v#Wo6?0bm=)z13@;H6Q^C=U9)d4m= z>xwzr=RI@+K|))fGcic~WZt)&iFo@NUWM`6pV&9?&Vu_Hg-aj3U8k~ZOJ3@p{}TZ5 CmFm|3 diff --git a/ObjectiveGitTests/fixtures/testrepo.git/packed-refs b/ObjectiveGitTests/fixtures/testrepo.git/packed-refs deleted file mode 100644 index 115617cf8..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# pack-refs with: peeled -41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9 refs/heads/packed diff --git a/ObjectiveGitTests/fixtures/testrepo.git/refs/heads/master b/ObjectiveGitTests/fixtures/testrepo.git/refs/heads/master deleted file mode 100644 index a7eafce3c..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -36060c58702ed4c2a40832c51758d5344201d89a diff --git a/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v0.9 b/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v0.9 deleted file mode 100644 index 648e24509..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v0.9 +++ /dev/null @@ -1 +0,0 @@ -5b5b025afb0b4c913b4c338a42934a3863bf3644 diff --git a/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v1.0 b/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v1.0 deleted file mode 100644 index b6e19c5be..000000000 --- a/ObjectiveGitTests/fixtures/testrepo.git/refs/tags/v1.0 +++ /dev/null @@ -1 +0,0 @@ -0c37a5391bbff43c37f0d0371823a5509eed5b1d From 934a82663974dca589cc247456900e8230062279 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:22:21 +0000 Subject: [PATCH 112/157] Deal with unzipping test fixtures at test-time. --- ObjectiveGitTests/Contants.h | 48 +++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/ObjectiveGitTests/Contants.h b/ObjectiveGitTests/Contants.h index 90b66bff2..4f5cb3315 100644 --- a/ObjectiveGitTests/Contants.h +++ b/ObjectiveGitTests/Contants.h @@ -45,29 +45,49 @@ #import "GTReference.h" #import "GTBranch.h" -static inline NSString *TEST_REPO_PATH(Class cls) { +static inline BOOL unzipFileFromArchiveAtPathIntoDirectory(NSString *fileName, NSString *zipPath, NSString *destinationPath) { + NSTask *task = [[NSTask alloc] init]; + task.launchPath = @"/usr/bin/unzip"; + task.arguments = @[ @"-qq", @"-d", destinationPath, zipPath, [fileName stringByAppendingString:@"*"] ]; + + [task launch]; + [task waitUntilExit]; + + BOOL success = (task.terminationStatus == 0); + return success; +} + +static inline NSString *repositoryFixturePathForName(NSString *repositoryName, Class cls) { #if TARGET_OS_IPHONE - return [NSTemporaryDirectory() stringByAppendingFormat:@"fixtures/testrepo.git"]; + return [NSTemporaryDirectory() stringByAppendingFormat:@"fixtures/%@", repositoryName]; #else - return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/testrepo.git"]; + return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"fixtures/%@", repositoryName]]; #endif } +static inline BOOL setupRepositoryFixtureIfNeeded(NSString *repositoryName, Class cls) { + NSString *path = repositoryFixturePathForName(repositoryName, cls); + BOOL isDirectory = NO; + if ([NSFileManager.defaultManager fileExistsAtPath:path isDirectory:&isDirectory] && isDirectory) return YES; + + if (![NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]) return NO; + + NSString *zippedFixturesPath = [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/fixtures.zip" ]; + return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, [zippedFixturesPath stringByDeletingLastPathComponent]); +} + +static inline NSString *TEST_REPO_PATH(Class cls) { + setupRepositoryFixtureIfNeeded(@"testrepo.git", cls); + return repositoryFixturePathForName(@"testrepo.git", cls); +} + static inline NSString *TEST_INDEX_PATH(Class cls) { -#if TARGET_OS_IPHONE - return [NSTemporaryDirectory() stringByAppendingFormat:@"fixtures/testrepo.git/index"]; -#else - return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/testrepo.git/index"]; -#endif + return [TEST_REPO_PATH(cls) stringByAppendingPathComponent:@"index"]; } static inline NSString *TEST_APP_REPO_PATH(Class cls) { - NSString *subpath = @"fixtures/Test_App/.git"; -#if TARGET_OS_IPHONE - return [NSTemporaryDirectory() stringByAppendingFormat:subpath]; -#else - return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:subpath]; -#endif + setupRepositoryFixtureIfNeeded(@"Test_App", cls); + return repositoryFixturePathForName(@"Test_App", cls); } static inline void CREATE_WRITABLE_FIXTURES(void) { From 7f68b0f68ecd63db9c0308df64fc4a47f2258e07 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:39:19 +0000 Subject: [PATCH 113/157] Add a much more thorough test of a basic modified file diff. --- ObjectiveGitTests/GTDiffSpec.m | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index da6bbb6d6..7ff816e8c 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -43,4 +43,64 @@ }); }); +describe(@"GTDiff diffing", ^{ + beforeEach(^{ + repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_APP_REPO_PATH(self.class)] error:NULL]; + expect(repository).toNot.beNil(); + }); + + it(@"should be able to diff simple file changes", ^{ + GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"be0f001ff517a00b5b8e3c29ee6561e70f994e17" objectType:GTObjectTypeCommit error:NULL]; + expect(firstCommit).toNot.beNil(); + GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe" objectType:GTObjectTypeCommit error:NULL]; + expect(secondCommit).toNot.beNil(); + + GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + expect(diff.deltaCount).to.equal(1); + expect([diff numberOfDeltasWithType:GTDiffFileDeltaModified]).to.equal(1); + + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect(delta.oldFile.path).to.equal(@"TestAppWindowController.h"); + expect(delta.oldFile.path).to.equal(delta.newFile.path); + expect(delta.hunkCount).to.equal(1); + expect(delta.isBinary).to.beFalsy(); + expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaModified); + + for (GTDiffHunk *hunk in delta.hunks) { + expect(hunk.header).to.equal(@"@@ -4,7 +4,7 @@"); + expect(hunk.lineCount).to.equal(8); + + NSArray *expectedLines = @[ @"//", + @"// Created by Joe Ricioppo on 9/29/10.", + @"// Copyright 2010 __MyCompanyName__. All rights reserved.", + @"//", + @"// duuuuuuuude", + @"", + @"#import ", + @"#import " ]; + + NSUInteger subtractionLine = 3; + NSUInteger additionLine = 4; + __block NSUInteger lineIndex = 0; + [hunk enumerateLinesInHunkUsingBlock:^(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop) { + expect(lineContent).to.equal(expectedLines[lineIndex]); + if (lineIndex == subtractionLine) { + expect((NSUInteger)lineOrigin).to.equal(GTDiffHunkLineOriginDeletion); + } else if (lineIndex == additionLine) { + expect((NSUInteger)lineOrigin).to.equal(GTDiffHunkLineOriginAddition); + } else { + expect((NSUInteger)lineOrigin).to.equal(GTDiffHunkLineOriginContext); + } + + lineIndex ++; + }]; + } + + // just in case we have failed an above test, don't add a whole bunch + // more false failures by iterating again. + *stop = YES; + }]; + }); +}); + SpecEnd From f4a3e56b5a50e04aea5d193fac0e964bdc1efdb1 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:54:15 +0000 Subject: [PATCH 114/157] Test for nil diffs. --- ObjectiveGitTests/GTDiffSpec.m | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 7ff816e8c..7a41782db 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -56,6 +56,7 @@ expect(secondCommit).toNot.beNil(); GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + expect(diff).toNot.beNil(); expect(diff.deltaCount).to.equal(1); expect([diff numberOfDeltasWithType:GTDiffFileDeltaModified]).to.equal(1); From 0b49035d725fbaa59cc187e084de9e60231954e5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:54:30 +0000 Subject: [PATCH 115/157] Test for added file diffs. --- ObjectiveGitTests/GTDiffSpec.m | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 7a41782db..e63fc0e91 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -102,6 +102,24 @@ *stop = YES; }]; }); + + it(@"should recognised added files", ^{ + GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"4d5a6cc7a4d810be71bd47331c947b22580a5997" objectType:GTObjectTypeCommit error:NULL]; + expect(firstCommit).toNot.beNil(); + + GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"38f1e536cfc2ee41e07d55b38baec00149b2b0d1" objectType:GTObjectTypeCommit error:NULL]; + expect(secondCommit).toNot.beNil(); + + GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + expect(diff).toNot.beNil(); + expect(diff.deltaCount).to.equal(1); + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect(delta.newFile.path).to.equal(@"REAME"); //loltypo + expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaAdded); + *stop = YES; + }]; + }); + }); SpecEnd From 7500fefc230dcc6bb3486d211853bc658c8779b2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 14:54:43 +0000 Subject: [PATCH 116/157] Test for binary files. --- ObjectiveGitTests/GTDiffSpec.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index e63fc0e91..45c1e2011 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -120,6 +120,22 @@ }]; }); + it(@"should recognise binary files", ^{ + GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"2ba9cdca982ac35a8db29f51c635251374008229" objectType:GTObjectTypeCommit error:NULL]; + expect(firstCommit).toNot.beNil(); + + GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"524500582248889ef2243931aa7fc48aa21dd12f" objectType:GTObjectTypeCommit error:NULL]; + expect(secondCommit).toNot.beNil(); + + GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + expect(diff).toNot.beNil(); + expect(diff.deltaCount).to.equal(1); + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect(delta.binary).to.beTruthy(); + *stop = YES; + }]; + + }); }); SpecEnd From 6ce91091fcc028d8c615377c1f5ddccfa0b336c8 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 15:19:49 +0000 Subject: [PATCH 117/157] Abstract out all that duplicated setup code. --- ObjectiveGitTests/GTDiffSpec.m | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 45c1e2011..5e099ff1a 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -13,6 +13,7 @@ __block GTRepository *repository = nil; __block GTCommit *firstCommit = nil; __block GTCommit *secondCommit = nil; +__block GTDiff *diff = nil; describe(@"GTDiff initialisation", ^{ beforeEach(^{ @@ -49,14 +50,18 @@ expect(repository).toNot.beNil(); }); - it(@"should be able to diff simple file changes", ^{ - GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"be0f001ff517a00b5b8e3c29ee6561e70f994e17" objectType:GTObjectTypeCommit error:NULL]; + void (^setupDiffFromCommitSHAs)(NSString *, NSString *) = ^(NSString *firstCommitSHA, NSString *secondCommitSHA) { + firstCommit = (GTCommit *)[repository lookupObjectBySha:firstCommitSHA objectType:GTObjectTypeCommit error:NULL]; expect(firstCommit).toNot.beNil(); - GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe" objectType:GTObjectTypeCommit error:NULL]; + secondCommit = (GTCommit *)[repository lookupObjectBySha:secondCommitSHA objectType:GTObjectTypeCommit error:NULL]; expect(secondCommit).toNot.beNil(); - GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; expect(diff).toNot.beNil(); + }; + + it(@"should be able to diff simple file changes", ^{ + setupDiffFromCommitSHAs(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe"); expect(diff.deltaCount).to.equal(1); expect([diff numberOfDeltasWithType:GTDiffFileDeltaModified]).to.equal(1); @@ -104,14 +109,7 @@ }); it(@"should recognised added files", ^{ - GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"4d5a6cc7a4d810be71bd47331c947b22580a5997" objectType:GTObjectTypeCommit error:NULL]; - expect(firstCommit).toNot.beNil(); - - GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"38f1e536cfc2ee41e07d55b38baec00149b2b0d1" objectType:GTObjectTypeCommit error:NULL]; - expect(secondCommit).toNot.beNil(); - - GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; - expect(diff).toNot.beNil(); + setupDiffFromCommitSHAs(@"4d5a6cc7a4d810be71bd47331c947b22580a5997", @"38f1e536cfc2ee41e07d55b38baec00149b2b0d1"); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect(delta.newFile.path).to.equal(@"REAME"); //loltypo @@ -120,15 +118,11 @@ }]; }); - it(@"should recognise binary files", ^{ - GTCommit *firstCommit = (GTCommit *)[repository lookupObjectBySha:@"2ba9cdca982ac35a8db29f51c635251374008229" objectType:GTObjectTypeCommit error:NULL]; - expect(firstCommit).toNot.beNil(); - - GTCommit *secondCommit = (GTCommit *)[repository lookupObjectBySha:@"524500582248889ef2243931aa7fc48aa21dd12f" objectType:GTObjectTypeCommit error:NULL]; - expect(secondCommit).toNot.beNil(); - GTDiff *diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; - expect(diff).toNot.beNil(); + }); + + it(@"should recognise binary files", ^{ + setupDiffFromCommitSHAs(@"2ba9cdca982ac35a8db29f51c635251374008229", @"524500582248889ef2243931aa7fc48aa21dd12f"); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect(delta.binary).to.beTruthy(); From 53336ece1d631e860eed1d2760f763cbac96d753 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 15:28:56 +0000 Subject: [PATCH 118/157] Unit test file deletions. --- ObjectiveGitTests/GTDiffSpec.m | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 5e099ff1a..e63dd5d81 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -118,7 +118,13 @@ }]; }); - + it(@"should recognise deleted files", ^{ + setupDiffFromCommitSHAs(@"6317779b4731d9c837dcc6972b964bdf4211eeef", @"9f90c6e24629fae3ef51101bb6448342b44098ef"); + expect(diff.deltaCount).to.equal(1); + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaDeleted); + *stop = YES; + }]; }); it(@"should recognise binary files", ^{ From 90728c0aae438105bb00c4a3f28c1f6190933abe Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 16:07:32 +0000 Subject: [PATCH 119/157] Block style fixes. --- Classes/GTDiff.h | 2 +- Classes/GTDiff.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 53d65d04a..d3bf64d72 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -140,6 +140,6 @@ typedef enum : git_diff_option_t { // // block - A block to be executed for each delta. Setting `stop` to `YES` // immediately stops the enumeration. -- (void)enumerateDeltasUsingBlock:(void(^)(GTDiffDelta *delta, BOOL *stop))block; +- (void)enumerateDeltasUsingBlock:(void (^)(GTDiffDelta *delta, BOOL *stop))block; @end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 764111038..69aaf09d9 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -117,7 +117,7 @@ - (void)dealloc { #pragma mark - Properties -- (void)enumerateDeltasUsingBlock:(void(^)(GTDiffDelta *delta, BOOL *stop))block { +- (void)enumerateDeltasUsingBlock:(void (^)(GTDiffDelta *delta, BOOL *stop))block { for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { git_diff_patch *patch; int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); From 57bd3bbfd3a7b7f792d7f85ce71a789bcf93bd37 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 16:40:37 +0000 Subject: [PATCH 120/157] Document that GTDiffFileDeltaTypeChange goes both ways trolololo. --- Classes/GTDiffDelta.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 0847e1320..986774892 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -22,7 +22,7 @@ // GTDiffFileDeltaUntracked - The file has been added to the working directory // and is therefore currently untracked. // GTDiffFileDeltaTypeChange - The file has changed from a blob to either a -// submodule, symlink or directory. +// submodule, symlink or directory. Or vice versa. typedef enum : git_delta_t { GTDiffFileDeltaUnmodified = GIT_DELTA_UNMODIFIED, GTDiffFileDeltaAdded = GIT_DELTA_ADDED, From e46310c67dcee2c459cc52fd8405813d636f80d1 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:30:00 +0000 Subject: [PATCH 121/157] Adjust naming to make more sense. The tree would be on the left hand side. --- Classes/GTDiff.h | 6 +++--- Classes/GTDiff.m | 2 +- ObjectiveGitTests/GTDiffSpec.m | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index d3bf64d72..75f814a21 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -114,14 +114,14 @@ typedef enum : git_diff_option_t { // Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options; -// Create a diff between a tree and it's repository's working directory. +// Create a diff between a tree and its repository's working directory. // -// tree - The tree to be diffed. +// tree - The tree to be diffed. The tree will be the right side of the diff. // options - A dictionary containing any of the above options key constants, or // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options; ++ (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *)options; // Designated initialiser. - (instancetype)initWithGitDiffList:(git_diff_list *)diffList; diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 69aaf09d9..2672a2716 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -87,7 +87,7 @@ + (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository o return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToTree:(GTTree *)tree options:(NSDictionary *)options { ++ (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *)options { NSParameterAssert(tree != nil); git_diff_options optionsStruct; diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index e63dd5d81..becaca2cb 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -36,7 +36,7 @@ }); it(@"should be able to initialise a diff against a working directory and a tree", ^{ - expect([GTDiff diffWorkingDirectoryToTree:firstCommit.tree options:nil]).toNot.beNil(); + expect([GTDiff diffWorkingDirectoryFromTree:firstCommit.tree options:nil]).toNot.beNil(); }); it(@"should be able to initialse a diff against an index from a repo's working directory", ^{ From 9aa5127b67838f1d81eb30f5292012a75a6a33ac Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:30:14 +0000 Subject: [PATCH 122/157] Clearer diff creation docs. --- Classes/GTDiff.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 75f814a21..147f3d128 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -96,9 +96,13 @@ typedef enum : git_diff_option_t { // Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options; -// Create a diff between a tree and it's repository's current index. +// Create a diff between a repository's current index and a tree. // -// tree - The tree to be diffed. +// This is equivalent to `git diff --cached ` or if you pass the HEAD +// tree, then `git diff --cached`. +// +// tree - The tree to be diffed. The index will be taken from this tree's +// repository. // options - A dictionary containing any of the above options key constants, or // nil to use the defaults. // @@ -107,6 +111,8 @@ typedef enum : git_diff_option_t { // Create a diff between the working directory and index in a given repository. // +// This matches the `git diff` command. +// // repository - The repository to be used for the diff. // options - A dictionary containing any of the above options key constants, or // nil to use the defaults. @@ -116,7 +122,7 @@ typedef enum : git_diff_option_t { // Create a diff between a tree and its repository's working directory. // -// tree - The tree to be diffed. The tree will be the right side of the diff. +// tree - The tree to be diffed. The tree will be the left side of the diff. // options - A dictionary containing any of the above options key constants, or // nil to use the defaults. // From f2ed1d9957cc29a52013c95adf71fe9bc447ea9e Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:42:13 +0000 Subject: [PATCH 123/157] Param assert that block shit. --- Classes/GTDiff.m | 2 ++ Classes/GTDiffHunk.m | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 2672a2716..888def720 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -118,6 +118,8 @@ - (void)dealloc { #pragma mark - Properties - (void)enumerateDeltasUsingBlock:(void (^)(GTDiffDelta *delta, BOOL *stop))block { + NSParameterAssert(block != nil); + for (NSUInteger idx = 0; idx < self.deltaCount; idx ++) { git_diff_patch *patch; int result = git_diff_get_patch(&patch, NULL, self.git_diff_list, idx); diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index 928d1163a..5a2421ef8 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -39,6 +39,8 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd } - (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block { + NSParameterAssert(block != nil); + for (NSUInteger idx = 0; idx < self.lineCount; idx ++) { char lineOrigin; const char *content; From 1fd5d68d48b10c9b426340866d3c3bece4f0bfc2 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:42:33 +0000 Subject: [PATCH 124/157] We now have an enumeration-based API for hunks. --- Classes/GTDiffDelta.h | 9 +++------ Classes/GTDiffDelta.m | 24 +++++++++--------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 986774892..624c702e4 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -9,6 +9,7 @@ #import "git2.h" @class GTDiffFile; +@class GTDiffHunk; // The type of change that this delta represents. // @@ -66,13 +67,9 @@ typedef enum : git_delta_t { // The number of hunks represented by this delta. @property (nonatomic, readonly) NSUInteger hunkCount; -// The hunks represented. -// -// Note that you should consider the hunks' lifetime tied to this delta object. -// Once the parent delta object is cleaned up, their behaviour is undefined. -@property (nonatomic, readonly, copy) NSArray *hunks; - // Designated initialiser. - (instancetype)initWithGitPatch:(git_diff_patch *)patch; +- (void)enumerateHunksWithBlock:(void (^)(GTDiffHunk *hunk, BOOL *stop))block; + @end diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index a2fba25bc..682c10de8 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -13,8 +13,6 @@ @implementation GTDiffDelta -@synthesize hunks = _hunks; - - (instancetype)initWithGitPatch:(git_diff_patch *)patch { NSParameterAssert(patch != NULL); @@ -56,20 +54,16 @@ - (NSUInteger)hunkCount { return git_diff_patch_num_hunks(self.git_diff_patch); } -- (NSArray *)hunks { - NSUInteger hunkCount = self.hunkCount; - if (_hunks == nil) { - NSMutableArray *newHunksArray = [NSMutableArray arrayWithCapacity:hunkCount]; - for (NSUInteger idx = 0; idx < self.hunkCount; idx ++) { - GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithDelta:self hunkIndex:idx]; - if (hunk == nil) return nil; - [newHunksArray addObject:hunk]; - } - - _hunks = [newHunksArray copy]; - } +- (void)enumerateHunksWithBlock:(void (^)(GTDiffHunk *hunk, BOOL *stop))block { + NSParameterAssert(block != nil); - return _hunks; + for (NSUInteger idx = 0; idx < self.hunkCount; idx ++) { + GTDiffHunk *hunk = [[GTDiffHunk alloc] initWithDelta:self hunkIndex:idx]; + if (hunk == nil) return; + BOOL shouldStop = NO; + block(hunk, &shouldStop); + if (shouldStop) return; + } } @end From 38d07a1aecd1bbddd190a45d0f4dcf7a8ce4351c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:48:54 +0000 Subject: [PATCH 125/157] Document the new hunk enumeration. --- Classes/GTDiffDelta.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 624c702e4..abbbc3d05 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -70,6 +70,12 @@ typedef enum : git_delta_t { // Designated initialiser. - (instancetype)initWithGitPatch:(git_diff_patch *)patch; +// Enumerate the hunks contained in the delta. +// +// Blocks during enumeration.hm +// +// block - A block to be executed for each hunk. Setting `stop` to `YES` +// immediately stops the enumeration. - (void)enumerateHunksWithBlock:(void (^)(GTDiffHunk *hunk, BOOL *stop))block; @end From 50a92128c4ff6b4ed9d947611314f6a9c77f9478 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:51:29 +0000 Subject: [PATCH 126/157] Use the new hunk enumeration in our tests. --- ObjectiveGitTests/GTDiffSpec.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index becaca2cb..47fbf0af0 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -72,7 +72,7 @@ expect(delta.isBinary).to.beFalsy(); expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaModified); - for (GTDiffHunk *hunk in delta.hunks) { + [delta enumerateHunksWithBlock:^(GTDiffHunk *hunk, BOOL *stop) { expect(hunk.header).to.equal(@"@@ -4,7 +4,7 @@"); expect(hunk.lineCount).to.equal(8); @@ -100,7 +100,7 @@ lineIndex ++; }]; - } + }]; // just in case we have failed an above test, don't add a whole bunch // more false failures by iterating again. From 35d9f64fc0cb9836a03e891e49343c13ac804ed4 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:55:35 +0000 Subject: [PATCH 127/157] Hunks retain their delta now. --- Classes/GTDiffHunk.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index 5a2421ef8..7e95d6cdc 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -12,7 +12,7 @@ @interface GTDiffHunk () -@property (nonatomic, unsafe_unretained, readonly) GTDiffDelta *delta; //No weak support in this deployment target? Boo! +@property (nonatomic, strong, readonly) GTDiffDelta *delta; @property (nonatomic, readonly) NSUInteger hunkIndex; @end From 9991f922611e18be73ebd606c9be77bb9c713171 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 17:57:59 +0000 Subject: [PATCH 128/157] Block style fix. --- Classes/GTDiffHunk.h | 2 +- Classes/GTDiffHunk.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiffHunk.h b/Classes/GTDiffHunk.h index c8ba36398..fd97d64ea 100644 --- a/Classes/GTDiffHunk.h +++ b/Classes/GTDiffHunk.h @@ -42,6 +42,6 @@ typedef enum : git_diff_line_t { // // block - A block to execute on each line. Setting `stop` to `NO` will // immediately stop the enumeration and return from the method. -- (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block; +- (void)enumerateLinesInHunkUsingBlock:(void (^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block; @end diff --git a/Classes/GTDiffHunk.m b/Classes/GTDiffHunk.m index 7e95d6cdc..182741143 100644 --- a/Classes/GTDiffHunk.m +++ b/Classes/GTDiffHunk.m @@ -38,7 +38,7 @@ - (instancetype)initWithDelta:(GTDiffDelta *)delta hunkIndex:(NSUInteger)hunkInd return self; } -- (void)enumerateLinesInHunkUsingBlock:(void(^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block { +- (void)enumerateLinesInHunkUsingBlock:(void (^)(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop))block { NSParameterAssert(block != nil); for (NSUInteger idx = 0; idx < self.lineCount; idx ++) { From e9ac8ed5b231aff0929f7ddcf85e7ae92ee3931c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 18:10:03 +0000 Subject: [PATCH 129/157] Status -> type. --- Classes/GTDiffDelta.h | 2 +- Classes/GTDiffDelta.m | 2 +- ObjectiveGitTests/GTDiffSpec.m | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index abbbc3d05..1197ef857 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -62,7 +62,7 @@ typedef enum : git_delta_t { // The type of change that this delta represents. // // Think "status" as in `git status`. -@property (nonatomic, readonly) GTDiffDeltaType status; +@property (nonatomic, readonly) GTDiffDeltaType type; // The number of hunks represented by this delta. @property (nonatomic, readonly) NSUInteger hunkCount; diff --git a/Classes/GTDiffDelta.m b/Classes/GTDiffDelta.m index 682c10de8..6862b7963 100644 --- a/Classes/GTDiffDelta.m +++ b/Classes/GTDiffDelta.m @@ -46,7 +46,7 @@ - (GTDiffFile *)newFile { return [[GTDiffFile alloc] initWithGitDiffFile:self.git_diff_delta->new_file]; } -- (GTDiffDeltaType)status { +- (GTDiffDeltaType)type { return (GTDiffDeltaType)self.git_diff_delta->status; } diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 47fbf0af0..2dcce82b4 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -70,7 +70,7 @@ expect(delta.oldFile.path).to.equal(delta.newFile.path); expect(delta.hunkCount).to.equal(1); expect(delta.isBinary).to.beFalsy(); - expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaModified); + expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaModified); [delta enumerateHunksWithBlock:^(GTDiffHunk *hunk, BOOL *stop) { expect(hunk.header).to.equal(@"@@ -4,7 +4,7 @@"); @@ -113,7 +113,7 @@ expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect(delta.newFile.path).to.equal(@"REAME"); //loltypo - expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaAdded); + expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaAdded); *stop = YES; }]; }); @@ -122,7 +122,7 @@ setupDiffFromCommitSHAs(@"6317779b4731d9c837dcc6972b964bdf4211eeef", @"9f90c6e24629fae3ef51101bb6448342b44098ef"); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { - expect((NSUInteger)delta.status).to.equal(GTDiffFileDeltaDeleted); + expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaDeleted); *stop = YES; }]; }); From f778aa993df5a7bfd628ffd2514829ec4dea2f13 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Mon, 17 Dec 2012 19:03:51 +0000 Subject: [PATCH 130/157] NSUInteger -> GTDiffFileFlag --- Classes/GTDiffFile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffFile.h b/Classes/GTDiffFile.h index d9e966eb2..0f49c42a4 100644 --- a/Classes/GTDiffFile.h +++ b/Classes/GTDiffFile.h @@ -31,7 +31,7 @@ typedef enum : git_diff_file_flag_t { @property (nonatomic, readonly) NSUInteger size; // Any flags set on the file (see `GTDiffFileFlag` for more info). -@property (nonatomic, readonly) NSUInteger flags; +@property (nonatomic, readonly) GTDiffFileFlag flags; // The mode of the file. @property (nonatomic, readonly) mode_t mode; From 34aa843e0b5c02e18322fe78371e93f5918a94fd Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:41:22 +0000 Subject: [PATCH 131/157] Confirmed. It's megabytes not megabits. Thanks @arrbee. --- Classes/GTDiff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 147f3d128..d4ccf5286 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -43,7 +43,7 @@ extern NSString *const GTDiffOptionsNewPrefixKey; // An `NSNumber` wrapped `NSUInteger` determining the maximum size (in bytes) // of a file to diff. Above this size the file will be treated as binary. // -// Defaults to 512Mb. +// Defaults to 512MB. extern NSString *const GTDiffOptionsMaxSizeKey; // Enum for use as documented in the options dictionary with the From e26d732caeef1db744380938499966bf3398e4b1 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:42:59 +0000 Subject: [PATCH 132/157] Lolwut -- --- Classes/GTDiffDelta.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffDelta.h b/Classes/GTDiffDelta.h index 1197ef857..f30d252b0 100644 --- a/Classes/GTDiffDelta.h +++ b/Classes/GTDiffDelta.h @@ -72,7 +72,7 @@ typedef enum : git_delta_t { // Enumerate the hunks contained in the delta. // -// Blocks during enumeration.hm +// Blocks during enumeration. // // block - A block to be executed for each hunk. Setting `stop` to `YES` // immediately stops the enumeration. From 7ff229484a2912ac1bd582933c7ac52fb63483af Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:44:59 +0000 Subject: [PATCH 133/157] Pursuade Xcode to remove an invisible space. --- ObjectiveGitTests/Contants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveGitTests/Contants.h b/ObjectiveGitTests/Contants.h index 4f5cb3315..5b7f3b322 100644 --- a/ObjectiveGitTests/Contants.h +++ b/ObjectiveGitTests/Contants.h @@ -72,7 +72,7 @@ static inline BOOL setupRepositoryFixtureIfNeeded(NSString *repositoryName, Clas if (![NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]) return NO; - NSString *zippedFixturesPath = [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/fixtures.zip" ]; + NSString *zippedFixturesPath = [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/fixtures.zip"]; return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, [zippedFixturesPath stringByDeletingLastPathComponent]); } From ee39f622b89cbadf814743aaae2a7e362ae12843 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:46:47 +0000 Subject: [PATCH 134/157] Dot syntax ++ --- ObjectiveGitTests/Contants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveGitTests/Contants.h b/ObjectiveGitTests/Contants.h index 5b7f3b322..1131c8731 100644 --- a/ObjectiveGitTests/Contants.h +++ b/ObjectiveGitTests/Contants.h @@ -73,7 +73,7 @@ static inline BOOL setupRepositoryFixtureIfNeeded(NSString *repositoryName, Clas if (![NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]) return NO; NSString *zippedFixturesPath = [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/fixtures.zip"]; - return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, [zippedFixturesPath stringByDeletingLastPathComponent]); + return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, zippedFixturesPath.stringByDeletingLastPathComponent); } static inline NSString *TEST_REPO_PATH(Class cls) { From 9f691b2c9dd2a1a66796c7b5b35086138cfeac85 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:51:36 +0000 Subject: [PATCH 135/157] Copy our setupDiffFromCommitSHAs block. Due to Specta potentially calling it after the surrounding method has returned. --- ObjectiveGitTests/GTDiffSpec.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 2dcce82b4..0d546debb 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -50,7 +50,7 @@ expect(repository).toNot.beNil(); }); - void (^setupDiffFromCommitSHAs)(NSString *, NSString *) = ^(NSString *firstCommitSHA, NSString *secondCommitSHA) { + void (^setupDiffFromCommitSHAs)(NSString *, NSString *) = [^(NSString *firstCommitSHA, NSString *secondCommitSHA) { firstCommit = (GTCommit *)[repository lookupObjectBySha:firstCommitSHA objectType:GTObjectTypeCommit error:NULL]; expect(firstCommit).toNot.beNil(); secondCommit = (GTCommit *)[repository lookupObjectBySha:secondCommitSHA objectType:GTObjectTypeCommit error:NULL]; @@ -58,7 +58,7 @@ diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; expect(diff).toNot.beNil(); - }; + } copy]; it(@"should be able to diff simple file changes", ^{ setupDiffFromCommitSHAs(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe"); From 346592a7c77d1338a29943d6503a1e8e208635e0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:55:17 +0000 Subject: [PATCH 136/157] lolindentation. --- ObjectiveGitTests/GTDiffSpec.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 0d546debb..1eade6da7 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -102,9 +102,9 @@ }]; }]; - // just in case we have failed an above test, don't add a whole bunch - // more false failures by iterating again. - *stop = YES; + // just in case we have failed an above test, don't add a whole bunch + // more false failures by iterating again. + *stop = YES; }]; }); From c94eab93ddda8b9c3931b32c23a460e9cb17cb13 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 11:59:14 +0000 Subject: [PATCH 137/157] isBinary -> binary You idiot Danny. --- ObjectiveGitTests/GTDiffSpec.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 1eade6da7..b04b4f8e5 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -69,7 +69,7 @@ expect(delta.oldFile.path).to.equal(@"TestAppWindowController.h"); expect(delta.oldFile.path).to.equal(delta.newFile.path); expect(delta.hunkCount).to.equal(1); - expect(delta.isBinary).to.beFalsy(); + expect(delta.binary).to.beFalsy(); expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaModified); [delta enumerateHunksWithBlock:^(GTDiffHunk *hunk, BOOL *stop) { From 52b3c98d4edb04fddf183e5aeb46d6a7e444e5eb Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 12:05:38 +0000 Subject: [PATCH 138/157] Redeclare first/second commit vars in each describe. Makes it clear that they are used differently in each case. --- ObjectiveGitTests/GTDiffSpec.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index b04b4f8e5..05743abe3 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -11,11 +11,11 @@ SpecBegin(GTDiff) __block GTRepository *repository = nil; -__block GTCommit *firstCommit = nil; -__block GTCommit *secondCommit = nil; -__block GTDiff *diff = nil; describe(@"GTDiff initialisation", ^{ + __block GTCommit *firstCommit = nil; + __block GTCommit *secondCommit = nil; + beforeEach(^{ repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_REPO_PATH(self.class)] error:NULL]; expect(repository).toNot.beNil(); @@ -45,6 +45,10 @@ }); describe(@"GTDiff diffing", ^{ + __block GTCommit *firstCommit = nil; + __block GTCommit *secondCommit = nil; + __block GTDiff *diff = nil; + beforeEach(^{ repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_APP_REPO_PATH(self.class)] error:NULL]; expect(repository).toNot.beNil(); From 13bcd6f1acdc793ca9dc749749bcd37cd5c3c0bc Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 12:26:46 +0000 Subject: [PATCH 139/157] Cast file.flags. Compiling ++ --- Classes/GTDiffFile.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiffFile.m b/Classes/GTDiffFile.m index 5ef4b764a..eb4378264 100644 --- a/Classes/GTDiffFile.m +++ b/Classes/GTDiffFile.m @@ -15,7 +15,7 @@ - (instancetype)initWithGitDiffFile:(git_diff_file)file { if (self == nil) return nil; _size = (NSUInteger)file.size; - _flags = file.flags; + _flags = (GTDiffFileFlag)file.flags; _mode = file.mode; _path = [NSString stringWithUTF8String:file.path]; From d3609808d9a8f8907cb01d573072727c50b7a784 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 12:27:24 +0000 Subject: [PATCH 140/157] Always use a temp directory for fixtures. This has no cleanup as yet. Seems like it would be sensible to add that when we move over entirely to Specta. --- ObjectiveGitTests/Contants.h | 45 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/ObjectiveGitTests/Contants.h b/ObjectiveGitTests/Contants.h index 1131c8731..d18864cb5 100644 --- a/ObjectiveGitTests/Contants.h +++ b/ObjectiveGitTests/Contants.h @@ -58,11 +58,18 @@ static inline BOOL unzipFileFromArchiveAtPathIntoDirectory(NSString *fileName, N } static inline NSString *repositoryFixturePathForName(NSString *repositoryName, Class cls) { -#if TARGET_OS_IPHONE - return [NSTemporaryDirectory() stringByAppendingFormat:@"fixtures/%@", repositoryName]; -#else - return [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"fixtures/%@", repositoryName]]; -#endif + static NSString *unzippedFixturesPath = nil; + if (unzippedFixturesPath == nil) { + NSString *containerPath = nil; + while (containerPath == nil) { + containerPath = [[NSTemporaryDirectory() stringByAppendingPathComponent:@"com.libgit2.objectivegit"] stringByAppendingPathComponent:NSProcessInfo.processInfo.globallyUniqueString]; + if ([NSFileManager.defaultManager fileExistsAtPath:containerPath]) containerPath = nil; + } + + unzippedFixturesPath = containerPath; + } + + return [unzippedFixturesPath stringByAppendingPathComponent:repositoryName]; } static inline BOOL setupRepositoryFixtureIfNeeded(NSString *repositoryName, Class cls) { @@ -73,11 +80,14 @@ static inline BOOL setupRepositoryFixtureIfNeeded(NSString *repositoryName, Clas if (![NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]) return NO; NSString *zippedFixturesPath = [[[NSBundle bundleForClass:cls] resourcePath] stringByAppendingPathComponent:@"fixtures/fixtures.zip"]; - return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, zippedFixturesPath.stringByDeletingLastPathComponent); + return unzipFileFromArchiveAtPathIntoDirectory(repositoryName, zippedFixturesPath, path.stringByDeletingLastPathComponent); } static inline NSString *TEST_REPO_PATH(Class cls) { - setupRepositoryFixtureIfNeeded(@"testrepo.git", cls); + if (!setupRepositoryFixtureIfNeeded(@"testrepo.git", cls)) { + NSLog(@"Failed to unzip fixtures."); + } + return repositoryFixturePathForName(@"testrepo.git", cls); } @@ -86,25 +96,10 @@ static inline NSString *TEST_INDEX_PATH(Class cls) { } static inline NSString *TEST_APP_REPO_PATH(Class cls) { - setupRepositoryFixtureIfNeeded(@"Test_App", cls); - return repositoryFixturePathForName(@"Test_App", cls); -} - -static inline void CREATE_WRITABLE_FIXTURES(void) { -#if TARGET_OS_IPHONE - NSFileManager *fm = [NSFileManager defaultManager]; - NSString *fixturesPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"fixtures"]; - - if([fm fileExistsAtPath:fixturesPath]) - [fm removeItemAtPath:fixturesPath error:nil]; - - NSError *err = nil; - if (![fm copyItemAtPath:[NSBundle.mainBundle.resourcePath stringByAppendingPathComponent:@"fixtures"] toPath:fixturesPath error:&err]) { - NSLog(@"Failed to copy fixtures: %@", err.localizedDescription); - [NSException raise:@"Fixture Setup Error:" format:err.localizedDescription, nil]; + if (!setupRepositoryFixtureIfNeeded(@"Test_App", cls)) { + NSLog(@"Failed to unzip fixtures."); } - -#endif + return repositoryFixturePathForName(@"Test_App", cls); } static inline void rm_loose(Class cls, NSString *sha) { From d853045c0830d16dcfb845d8198344fed4784bdf Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 12:51:59 +0000 Subject: [PATCH 141/157] Add findSimilarWithOptions Lacking documentation is due to vague-ass stuff in diff.h. Waiting on some libgit2 folks to clarify a few things. --- Classes/GTDiff.h | 41 +++++++++++++++++++++++++++++++++++++++++ Classes/GTDiff.m | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index d4ccf5286..af86df335 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -72,6 +72,41 @@ typedef enum : git_diff_option_t { GTDiffOptionsFlagsIgnoreFileMode = GIT_DIFF_IGNORE_FILEMODE, } GTDiffOptionsFlags; +// An `NSNumber` wrapped `GTDiffOptionsFlags` bitmask containing any of the +// flags documented below. +// +// Defualts to `GTDiffFindOptionsFlagsFindRenames`. +extern NSString *const GTDiffFindOptionsFlagsKey; + +// An `NSNumber` wrapped `NSUInteger` dictating the similarity between file +// names to be considered a rename. +// +// Defaults to 50. +extern NSString *const GTDiffFindOptionsRenameThresholdKey; + +// An `NSNumber` wrapped `NSUInteger` +extern NSString *const GTDiffFindOptionsRenameFromRewriteThresholdKey; + +// An `NSNumber` wrapped `NSUInteger` +extern NSString *const GTDiffFindOptionsCopyThresholdKey; + +// An `NSNumber` wrapped `NSUInteger` +extern NSString *const GTDiffFindOptionsBreakRewriteThresholdKey; + +// An `NSNumber` wrapped `NSUInteger` +extern NSString *const GTDiffFindOptionsTargetLimitKey; + +// Enum for options passed into `-findSimilar`. +// +// For individual case documentation see `diff.h`. +typedef enum : git_diff_find_t { + GTDiffFindOptionsFlagsFindRenames = GIT_DIFF_FIND_RENAMES, + GTDiffFindOptionsFlagsFindRenamesFromRewrites = GIT_DIFF_FIND_RENAMES_FROM_REWRITES, + GTDiffFindOptionsFlagsFindCopies = GIT_DIFF_FIND_COPIES, + GTDiffFindOptionsFlagsFindCopiesFromUnmodified = GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED, + GTDiffFindOptionsFlagsFindAndBreakRewrites = GIT_DIFF_FIND_AND_BREAK_REWRITES, +} GTDiffFindOptionsFlags; + // A class representing a single "diff". // // Analagous to `git_diff_list` in libgit2, this object represents a list of @@ -148,4 +183,10 @@ typedef enum : git_diff_option_t { // immediately stops the enumeration. - (void)enumerateDeltasUsingBlock:(void (^)(GTDiffDelta *delta, BOOL *stop))block; +// Modify the diff list to combine similar changes using the given options. +// +// options - A dictionary containing any of the above find options key constants +// or nil to use the defaults. +- (void)findSimilarWithOptions:(NSDictionary *)options; + @end diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 888def720..2b5a16605 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -19,6 +19,13 @@ NSString *const GTDiffOptionsNewPrefixKey = @"GTDiffOptionsNewPrefixKey"; NSString *const GTDiffOptionsMaxSizeKey = @"GTDiffOptionsMaxSizeKey"; +NSString *const GTDiffFindOptionsFlagsKey = @"GTDiffFindOptionsFlagsKey"; +NSString *const GTDiffFindOptionsRenameThresholdKey = @"GTDiffFindOptionsRenameThresholdKey"; +NSString *const GTDiffFindOptionsRenameFromRewriteThresholdKey = @"GTDiffFindOptionsRenameFromRewriteThresholdKey"; +NSString *const GTDiffFindOptionsCopyThresholdKey = @"GTDiffFindOptionsCopyThresholdKey"; +NSString *const GTDiffFindOptionsBreakRewriteThresholdKey = @"GTDiffFindOptionsBreakRewriteThresholdKey"; +NSString *const GTDiffFindOptionsTargetLimitKey = @"GTDiffFindOptionsTargetLimitKey"; + @implementation GTDiff + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(git_diff_options *)newOptions { @@ -115,8 +122,6 @@ - (void)dealloc { git_diff_list_free(self.git_diff_list); } -#pragma mark - Properties - - (void)enumerateDeltasUsingBlock:(void (^)(GTDiffDelta *delta, BOOL *stop))block { NSParameterAssert(block != nil); @@ -139,4 +144,34 @@ - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType { return git_diff_num_deltas_of_type(self.git_diff_list, (git_delta_t)deltaType); } +- (BOOL)findOptionsStructWithDictionary:(NSDictionary *)dictionary optionsStruct:(git_diff_find_options *)newOptions { + if (dictionary == nil || dictionary.count < 1) return NO; + + NSNumber *flagsNumber = dictionary[GTDiffFindOptionsFlagsKey]; + if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; + + NSNumber *renameThresholdNumber = dictionary[GTDiffFindOptionsRenameThresholdKey]; + if (renameThresholdNumber != nil) newOptions->rename_threshold = renameThresholdNumber.unsignedIntValue; + + NSNumber *renameFromRewriteThresholdNumber = dictionary[GTDiffFindOptionsRenameFromRewriteThresholdKey]; + if (renameFromRewriteThresholdNumber != nil) newOptions->rename_from_rewrite_threshold = renameFromRewriteThresholdNumber.unsignedIntValue; + + NSNumber *copyThresholdNumber = dictionary[GTDiffFindOptionsCopyThresholdKey]; + if (copyThresholdNumber != nil) newOptions->copy_threshold = copyThresholdNumber.unsignedIntValue; + + NSNumber *breakRewriteThresholdNumber = dictionary[GTDiffFindOptionsBreakRewriteThresholdKey]; + if (renameThresholdNumber != nil) newOptions->break_rewrite_threshold = breakRewriteThresholdNumber.unsignedIntValue; + + NSNumber *targetLimitNumber = dictionary[GTDiffFindOptionsTargetLimitKey]; + if (targetLimitNumber != nil) newOptions->target_limit = targetLimitNumber.unsignedIntValue; + + return YES; +} + +- (void)findSimilarWithOptions:(NSDictionary *)options { + git_diff_find_options findOptions; + BOOL findOptionsCreated = [self findOptionsStructWithDictionary:options optionsStruct:&findOptions]; + git_diff_find_similar(self.git_diff_list, (findOptionsCreated ? &findOptions : NULL)); +} + @end From 65729cc745d589199304105d32ae6b66769adef7 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 13:08:25 +0000 Subject: [PATCH 142/157] Document the find options constants. --- Classes/GTDiff.h | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index af86df335..86a55450c 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -78,22 +78,48 @@ typedef enum : git_diff_option_t { // Defualts to `GTDiffFindOptionsFlagsFindRenames`. extern NSString *const GTDiffFindOptionsFlagsKey; -// An `NSNumber` wrapped `NSUInteger` dictating the similarity between file -// names to be considered a rename. +// An `NSNumber` wrapped `NSUInteger` dictating the similarity between files +// to be considered a rename. +// +// This is a value as per the git similarity index and should be between 1 and +// 100 (0 and above 100 use the default). // // Defaults to 50. extern NSString *const GTDiffFindOptionsRenameThresholdKey; -// An `NSNumber` wrapped `NSUInteger` +// An `NSNumber` wrapped `NSUInteger` dictating how similar a modified file can +// be to be eligable as a rename. +// +// This is a value as per the git similarity index and should be between 1 and +// 100 (0 and above 100 use the default). +// +// Defaults to 50. extern NSString *const GTDiffFindOptionsRenameFromRewriteThresholdKey; -// An `NSNumber` wrapped `NSUInteger` +// An `NSNumber` wrapped `NSUInteger` dictating how similar a modified file can +// be to be considered a copy. +// +// This is a value as per the git similarity index and should be between 1 and +// 100 (0 and above 100 use the default). +// +// Defaults to 50. extern NSString *const GTDiffFindOptionsCopyThresholdKey; -// An `NSNumber` wrapped `NSUInteger` +// An `NSNumber` wrapped `NSUInteger` dictating how similar a modified file can +// be to be to be broken into a separate deletion and addition pair. +// +// This is a value as per the git similarity index and should be between 1 and +// 100 (0 and above 100 use the default). +// +// Defaults to 60. extern NSString *const GTDiffFindOptionsBreakRewriteThresholdKey; -// An `NSNumber` wrapped `NSUInteger` +// An `NSNumber` wrapped `NSUInteger` dictating the maximum amount of similarity +// sources to examine. +// +// This is the equivalent of the `diff.renameLimit` config value. +// +// Defaults to 200. extern NSString *const GTDiffFindOptionsTargetLimitKey; // Enum for options passed into `-findSimilar`. From 1dc6e878f521e4f0e18821af437d8e1460f4be7c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 13:12:23 +0000 Subject: [PATCH 143/157] Bump libgit2 to track development. --- libgit2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libgit2 b/libgit2 index 693021262..e62171e2f 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit 693021262ba0eeac2923bbce1b2262717019c807 +Subproject commit e62171e2fc1b101512a7e86f6d990a38b78ed12b From f3e3ee763955f0c7e264e893fa04af6f50dfd744 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 13:12:46 +0000 Subject: [PATCH 144/157] Set the version of the findOptions struct. --- Classes/GTDiff.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 2b5a16605..5e6f6d067 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -146,7 +146,7 @@ - (NSUInteger)numberOfDeltasWithType:(GTDiffDeltaType)deltaType { - (BOOL)findOptionsStructWithDictionary:(NSDictionary *)dictionary optionsStruct:(git_diff_find_options *)newOptions { if (dictionary == nil || dictionary.count < 1) return NO; - + NSNumber *flagsNumber = dictionary[GTDiffFindOptionsFlagsKey]; if (flagsNumber != nil) newOptions->flags = (uint32_t)flagsNumber.unsignedIntegerValue; @@ -169,7 +169,7 @@ - (BOOL)findOptionsStructWithDictionary:(NSDictionary *)dictionary optionsStruct } - (void)findSimilarWithOptions:(NSDictionary *)options { - git_diff_find_options findOptions; + git_diff_find_options findOptions = GIT_DIFF_FIND_OPTIONS_INIT; BOOL findOptionsCreated = [self findOptionsStructWithDictionary:options optionsStruct:&findOptions]; git_diff_find_similar(self.git_diff_list, (findOptionsCreated ? &findOptions : NULL)); } From 599b88d177f3632dbcfad8afdfc8101bb086fed0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 13:57:06 +0000 Subject: [PATCH 145/157] Update to new diff function signatures. Also update our documentation to reflect the clarifications in libgit2. --- Classes/GTDiff.h | 19 +++++++++++-------- Classes/GTDiff.m | 10 +++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index 86a55450c..b570cc672 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -157,31 +157,34 @@ typedef enum : git_diff_find_t { // Returns a newly created `GTDiff` object or nil on error. + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options; -// Create a diff between a repository's current index and a tree. +// Create a diff between a repository's current index. // // This is equivalent to `git diff --cached ` or if you pass the HEAD // tree, then `git diff --cached`. // +// The tree you pass will be used for the "left" side of the diff, and the +// index will be used for the "right" side of the diff. +// // tree - The tree to be diffed. The index will be taken from this tree's -// repository. +// repository. The left side of the diff. // options - A dictionary containing any of the above options key constants, or // nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options; ++ (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options; -// Create a diff between the working directory and index in a given repository. +// Create a diff between the index and working directory in a given repository. // // This matches the `git diff` command. // // repository - The repository to be used for the diff. -// options - A dictionary containing any of the above options key constants, or -// nil to use the defaults. +// options - A dictionary containing any of the above options key constants, +// or nil to use the defaults. // // Returns a newly created `GTDiff` object or nil on error. -+ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options; ++ (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository options:(NSDictionary *)options; -// Create a diff between a tree and its repository's working directory. +// Create a diff between a repository's working directory and a tree. // // tree - The tree to be diffed. The tree will be the left side of the diff. // options - A dictionary containing any of the above options key constants, or diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index 5e6f6d067..d6c19d3ed 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -68,26 +68,26 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: return newDiff; } -+ (GTDiff *)diffIndexToTree:(GTTree *)tree options:(NSDictionary *)options { ++ (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options { NSParameterAssert(tree != nil); git_diff_options optionsStruct; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_index_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); + int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; return newDiff; } -+ (GTDiff *)diffWorkingDirectoryToIndexInRepository:(GTRepository *)repository options:(NSDictionary *)options { ++ (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository options:(NSDictionary *)options { NSParameterAssert(repository != nil); git_diff_options optionsStruct; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_index(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); + int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; @@ -100,7 +100,7 @@ + (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *) git_diff_options optionsStruct; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; - int returnValue = git_diff_workdir_to_tree(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); + int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); if (returnValue != GIT_OK) return nil; GTDiff *newDiff = [[GTDiff alloc] initWithGitDiffList:diffList]; From 2a8ebde08d8177d860c4b7737b606b9a48f3ebd9 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 13:58:42 +0000 Subject: [PATCH 146/157] Update diff spec with the new method sigs. --- ObjectiveGitTests/GTDiffSpec.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 05743abe3..7c13738c8 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -32,7 +32,7 @@ }); it(@"should be able to initialise a diff against the index with a tree", ^{ - expect([GTDiff diffIndexToTree:secondCommit.tree options:nil]).toNot.beNil(); + expect([GTDiff diffIndexFromTree:secondCommit.tree options:nil]).toNot.beNil(); }); it(@"should be able to initialise a diff against a working directory and a tree", ^{ @@ -40,7 +40,7 @@ }); it(@"should be able to initialse a diff against an index from a repo's working directory", ^{ - expect([GTDiff diffWorkingDirectoryToIndexInRepository:repository options:nil]).toNot.beNil(); + expect([GTDiff diffIndexToWorkingDirectoryInRepository:repository options:nil]).toNot.beNil(); }); }); From 8b440f58c5ca07e0a1a4f12b52e9158a75ac495d Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 15:42:20 +0000 Subject: [PATCH 147/157] Update clone bindings to match the new API. --- Classes/GTRepository.m | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index 054553656..b3c585041 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -161,27 +161,39 @@ static void transferProgressCallback(const git_transfer_progress *progress, void } + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL barely:(BOOL)barely withCheckout:(BOOL)withCheckout error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock { - const char *cOriginURL = originURL.absoluteString.UTF8String; - const char *cWorkdirURL = workdirURL.path.UTF8String; - git_repository *r; - int gitError; + git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT; if (barely) { - gitError = git_clone_bare(&r, cOriginURL, cWorkdirURL, transferProgressCallback, (__bridge void *)transferProgressBlock); + cloneOptions.bare = 1; } else { - git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT; - opts.checkout_strategy = GIT_CHECKOUT_SAFE; - opts.progress_cb = checkoutProgressCallback; - opts.progress_payload = (__bridge void *)checkoutProgressBlock; - gitError = git_clone(&r, cOriginURL, cWorkdirURL, (withCheckout ? &opts : NULL), transferProgressCallback, (__bridge void *)transferProgressBlock); + git_checkout_opts checkoutOptions = GIT_CHECKOUT_OPTS_INIT; + checkoutOptions.checkout_strategy = GIT_CHECKOUT_SAFE; + checkoutOptions.progress_cb = checkoutProgressCallback; + checkoutOptions.progress_payload = (__bridge void *)checkoutProgressBlock; + cloneOptions.checkout_opts = &checkoutOptions; + } + + cloneOptions.fetch_progress_cb = transferProgressCallback; + cloneOptions.fetch_progress_payload = (__bridge void *)transferProgressBlock; + + git_remote *remote; + const char *remoteURL = originURL.absoluteString.UTF8String; + int gitError = git_remote_new(&remote, NULL, "origin", remoteURL, NULL); + if (gitError != GIT_OK) { + if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to create remote to clone repository."]; + return nil; } + git_repository *repository; + + const char *cWorkdirURL = workdirURL.path.UTF8String; + gitError = git_clone(&repository, remote, cWorkdirURL, &cloneOptions); if (gitError < GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to clone repository."]; return nil; } - return [[self alloc] initWithGitRepository:r]; + return [[self alloc] initWithGitRepository:repository]; } From ff80bfa2bc351a2150745cc796b4f33f6e508206 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 16:03:40 +0000 Subject: [PATCH 148/157] Imma assume this was meant to check withCheckout. This clone stuff is a bit lulzy. --- Classes/GTRepository.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index b3c585041..467be6cd7 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -165,7 +165,9 @@ + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL bar git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT; if (barely) { cloneOptions.bare = 1; - } else { + } + + if (withCheckout) { git_checkout_opts checkoutOptions = GIT_CHECKOUT_OPTS_INIT; checkoutOptions.checkout_strategy = GIT_CHECKOUT_SAFE; checkoutOptions.progress_cb = checkoutProgressCallback; From cea49949f8f53236730dc387ad37207234cbc2b0 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 16:47:32 +0000 Subject: [PATCH 149/157] Wibble. --- Classes/GTRepository.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index 467be6cd7..c501202b1 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -161,7 +161,7 @@ static void transferProgressCallback(const git_transfer_progress *progress, void } + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL barely:(BOOL)barely withCheckout:(BOOL)withCheckout error:(NSError **)error transferProgressBlock:(void (^)(const git_transfer_progress *))transferProgressBlock checkoutProgressBlock:(void (^)(NSString *path, NSUInteger completedSteps, NSUInteger totalSteps))checkoutProgressBlock { - + git_clone_options cloneOptions = GIT_CLONE_OPTIONS_INIT; if (barely) { cloneOptions.bare = 1; @@ -186,10 +186,10 @@ + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL bar return nil; } + const char *workingDirectoryPath = workdirURL.path.UTF8String; git_repository *repository; - - const char *cWorkdirURL = workdirURL.path.UTF8String; - gitError = git_clone(&repository, remote, cWorkdirURL, &cloneOptions); + gitError = git_clone(&repository, remote, workingDirectoryPath, &cloneOptions); + git_remote_free(remote); if (gitError < GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to clone repository."]; return nil; From aeb2776bfb1e1c0991ade574653d1c5e2ac93a97 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 17:04:18 +0000 Subject: [PATCH 150/157] Fix git clone unit tests. --- Classes/GTRepository.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTRepository.m b/Classes/GTRepository.m index c501202b1..7a23400b8 100644 --- a/Classes/GTRepository.m +++ b/Classes/GTRepository.m @@ -180,7 +180,7 @@ + (id)cloneFromURL:(NSURL *)originURL toWorkingDirectory:(NSURL *)workdirURL bar git_remote *remote; const char *remoteURL = originURL.absoluteString.UTF8String; - int gitError = git_remote_new(&remote, NULL, "origin", remoteURL, NULL); + int gitError = git_remote_new(&remote, NULL, "origin", remoteURL, GIT_REMOTE_DEFAULT_FETCH); if (gitError != GIT_OK) { if (error != NULL) *error = [NSError git_errorFor:gitError withAdditionalDescription:@"Failed to create remote to clone repository."]; return nil; From 4ce57b0031119fa5b6c3235dc56ff80b7cb4d716 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 17:05:51 +0000 Subject: [PATCH 151/157] Update fixtures zip to include a rename. --- ObjectiveGitTests/fixtures/Fixtures.zip | Bin 344531 -> 346460 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ObjectiveGitTests/fixtures/Fixtures.zip b/ObjectiveGitTests/fixtures/Fixtures.zip index 17c089e4240098d049d84f8b4a1c4ab5fc86ec28..53a4f9047ca17e1cf5afadc319157327fe943cbe 100644 GIT binary patch delta 13052 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 AKL7v# delta 11879 zcmZv?30zL=_deY7?7bT_(>#x=r+J< z@mo{kC5ilQEPfbx&R%5iL7o;>F8N!4R|s3L+FbHga#)P^c|V;{#Jsl0lEY5g$&~Mw zq9R&2W<+R1SYTivJE(PATT#t6Gbf(C-%Z3C>+amSry@JO=1xmFUNZM4{+e!eu;$QqS3~;}4O4r=YVG5!DS>_8_hvM>n0SaZ+MPP}!R2AU zan|zy`O&_(H-m3=eWjY)Rvt}GXmo9Uq}S9^ucQ6A`N?>LYrQDXXV)(&t|=y?PY$Fu zjK3AR>}(RCRJ-MDi7t}d-#9eTu;|-HBbA$ey`7WGM0|hB6nHj{yEQb7x;5&y71b@6 zl`zxDE?zz3%C^3wa}6KKM2SI(D*tDro-fAxE*T85K5dV@%$lq= zub9x1Tc<~q=8y-M%ikBeh#B;{hxY6_5nSl&wQ$FP!MjASSuxT9WhkiFdi4CZQ~TFt z1mzhTY&HE-gjdx+H&^OVxIXOd67#$W4YOI2$ui%Zybid=I=1Hd@}x+2_MOkqe4dqe z&ATDmd$L#^{39hRwIW zHdt01c0!s7jg@8|8~ydV#zxw9`79XS5dFPdsMhX*_qvbnE@S1U-OF#z?)g5n-q2t1 zTf}ruO`~9QgX<$hJ}oDOzKs0ZBZy=bNF?7?*&mc0leA*q!X$V1HR5U2t@m2lZT^Qb z+0wliulRL+(izW+Dfzkbbxg^P_K)R_wFAkn*JC$E_dk~(#Z8?1^`4g;>V9{lb3>O| z=$w6%JH4kJNHgs;@s9C|s(Ly_KPg@DK)TtoH-x*W!EcV)wm{x3SZ;dPq6`M|at8 zy@_)be;5Bt4SsI%hER9{u=>YS+`mSqjbIFPw>lr(l8F|>Wz6=AXbv+R7T?uae zF3o$J!iLj^=^wHaUZz{^6nSUfQ~WM+VDe*7v66;X`Z4p~`%5nAOi|yab7IR?_qH^D z{l~j=7AP-U|Fb@@lpPPDMp%OdeZvxLsq12=nqzU|vE zSy}z!=JLzU6P2(0zeq=yp(`)e|1huqm|41NkA@w;&T8znd4z3<*F4#GM-_q&2Ch{* zliw^J+&eYKOV+QylP&O9Uc~i~-ty|s4bLymJZH|=Qsb1gb6nv-+QUFBCfRJ!rG$kA z3Kym>4-GVUJZIzOps!dWtG(aMy6HptU0#LM%$|!DMW-vnQg@_SsTL{37=^?=Si5glZe7z0 zuN2G2CF^q>pSYYC5Wf9BQ&ZuAmsj!vgEc~xyq9Iu#?GF7vtdjxN!)c&>Gs-zz-`m@ z!X>50XI6$)EDf>4_AI!ux+txlz2LFd6?TOE!LkI7dHJ`x&~xfi31{LP)!JuA5T3P# z8$$2-myFiRPJ4GvppKNBDR3YZXGUb1EnyKSRHb1){m_PmK(@UVqev+=@tO8IA` z?A-2V2y|`k`l>wR%b5tN$3}@u<}NJU9yhC=e_`L6(xVy~GA&Eigb!;5?=;>t-we;c z>^D0@JM~&mRPadavMGN(dbp$i{?yOby{l&>A29Uulj+iSDP^%#`Fz7wDg{Ixr*IIWOEH?Cfk8r>M(ob}TrfdUARGf;kss8>gf_4bgVP z&xmzKAYOdM7ZZ_*g&bGl!&6^>$AQh`R4mf$@4obr%GJZ^vtS_i@UKl$YS2TpyT(tY=+iinU-@OySrYT zx#HL6Pcdj!i@BU;MA-OE_hUJy&!OXY}MbG%9KSaj7B9hU)gB3YnqCX$J zj31No&Mf0~@S6TUJiNS0VRCIngiq!)0U^iL3oZn^ZRI?!${G!STzv0#fUvdXnQ(ni z_cgA;$s#wd@71XmTefsE=4$Bb(%y2lShdGFBF)*+k3PuWFzd3}|HasONF$+gwUMs3 z=e#$u=Ea@zir!9#1y)})6Hg|^erqMwzua14oRs)=&Bebni&MOpC|q6Sd6-i$)&wpDqiV#fA&o?D2s0H z9}0+Tl!$q=X4+A?YeP z-gT=iE0k<_jO+HL}a((jS=mQ<@6A4)F#?ZkxS(#rfg$hjw1} z!%M~rdA#S&@VV+Dw{B4zc}ODScvHLYwJkSWWWz%e&wl*UA6+q+xj3iX^UT@(3Pl|E zk{cFv?;C<$;50)`Nmh&Glx;iLv(C3in>^idtSW4G2PbjS zidh$IJI~B4Yd)bL_{vksU{~bCL9N|I8REZQpV&0*@}8Zt4MmEl4?k6ScN0@sEnTnm zEZQ{Y$?JBn7T$a12CEJ<4!GDWWY4fnR1g2&mOOCN+pA|~6Kn86wuedomR9~_sbS;8 z8kJ{lL(MAB+WGJ6a><|eqi^5&ms>~o=g+Ww|C;w*(ld{Bt?I6S1srtNS0E&9%K3Ja zsY(f6cWn>!W-so_N@-Wj_tASGx=^#`!jicK$Jbf4@AR_3_T&;4Z&Qz~H0+D? z=<6-t^z&LodVNMrYn)Z!D$ht$0U4b`s6qm5xNc*iuq0W&qBBwCr?>x+?i29RD@6v9v#KvT^s#jf)>zcBktZN z5H56^3iV@9_*7b zs=+%@-7bmcBLh|`+hmOI;F?m8CN9a%@L>tJ_ugyb!R0mf@m-mfcHsd38kxiU%@=KD z2meZBzg2BmQ_+|GJal;Urk`ub3w_Ivm;IzVLVa?V>Rsf?+rJ{>piSEeq4`FAyD}R` zyeFS;iTvO`aoKO>4LzOYU(@RrS(a(<6@1r!Y)*;3bU=Qd{k|XNc9k7s;VvgK+TJ*} z^PSv(Z}W|1dgEG7af3!5^n0WO7w>Q>>iRkB!6U00$EJwN{ufU_s5KUfK8kVEHoiOO z+zXL8eLF=ubnY!JNV07TKSijFKRWo*yuM*o+4ecMG36%V=|w9pcwKlP+o1q zOH$ppz*#>5%*S0jX zbx%^hVN<$Xo=hJ-WMgV%`o1ZmEM-T-0|Wn3i6^5+W10eU?!M>jeznH=Y1ZAkj7vr$ zVxB{PZ$7{~x*)?_Fz&PVzHMPyF=w*Y9xnY*oLt$N{p@FD^^cg%o2>>$>JKDY-|9;B zsz2|L>^c#n&C}fXaUe0dB49>!N4oh5&)J!wstT8U(^_pU=e1kC+?OTxN;;5#E{~ku zoz7qJ-RaJSTB;7$!t%Cj?zM89tH0DdNPFJ1H{~unwMES~wY=T9%;)Z1{X&m!v%sj& zi{{t()XMoCdcXVGo;o#mj;K}lm)rUgW+_2uc>2O4liwK}-6Y?2U2Z`nXKIV-n6u2L zT_eT%uFuRir3ZSOj9<2xc`0Y#{d|jp(;fGw6wT-ztGlMJd(3Rn41@BXyOSrtG0JZ|gP|14|!`DR{L@~Ho>zG?lj-#6JQk4=P5 zetZ3DV(8=MOj*OB{0Dz;RVrAt>bw39!Z^yusIgEuWVgA&y)Rd_ZXNo>N9~=@@*mrd zvv_zgf`@E5CQrKisFiG5X3a+)$`K=Lg4D2amU+qhpb3KheCS)fN&stu?|aV;r^PW| zrx;Qt&z>~grB97Z0(KQ*r2P>`a_&Ao+K{l%l#h15bYwR{_XW(4FBYb$LwUyt!5aBy zPv3S|5BTyRS^efHs{_|1gm@^e)WQrl9jagS1S7!Wd7gYs%8^P})X2+MvuQDp;@^y_ zXIUtRawf}P50c$i9Z+E(u3IAh)(fX4!uoeJgTap)LM4e4g}k(&FL@;IK-pC`>lZJ( zMxKn0pHcQnfYr#4L0P235qtDwDodaCbOz6ZW#!XYlNhxOWtGybE}R;nlM1W^+9avS zn#D(r_Ab?6l`Yj^H;K@8T~oG;4sDP1XP3qLW5X7-eHDqRv1GyDv&xeH|1@_zugxWo z<|v~mgb4~#Js`?W+bIS;KZeccr9inA+MbR%q2Wx77eyV%%qUHC?l|VkN73pE3(@6F zY!vYBIhA@gqhL4a$H{l2_Am<7kWVG*&hxbV5F3R%_UzR6GJNy zrZ^=sG=WX|_l}U>Nz9E3BJBgz z(dmsjz61 zO+Mz0b*VR_qxslDYEY(JfVCRYUZc-2c@{kqZ^sB08gIjdg}s~|XS+Fb8*Rv`12Z7E zt`sBv_=Tr3l(9i{*^<={_@4^S@fvh z55J00Bb2lp|3sT2SKxj$i5>^wUue_aK%BDxgT5mgya>HMZs!rHUc#NFp+V^RZB~q@ zrz?vsi7_2YXbMuEvMBu$K1~`XMK>G&ug9HBxcQ&HA^Ld<_x%6Wg2p2XzKomG`*rd% zK3|5?JH?~v_J8yo(*+3`BzXl_{YTXP3ci?Lj^kJGg)Ct>hK~O<9MR}iNYCv`BEw=_ zmt}^Q731=BqK(D4A+}L~hs+gFBlxLj1wElmv!?KnYo;h7)oZvJrYB7CDk$+9Y{gdq ziXygXeF-jw_)BmlOiPra<;ZYRJ<4i^5n?=~zL)~4DF>Gq;KDkI#!K*pn2R_M87Z!c z)?UZWSeH=lbzGTx7onQ#xS`_N={!7(LSteB9HXKP4OWH68qS5|wRj0rm1rq$$QIQ? zBc-6}Q;J)#7czi6tR;=ANPIqll&n;X*?7vQ*9P8(x+zQ;4C4_Q7 z5fv#Ag7l_{SK@{&apYKud$JAZBjYMu5*1eBGAdrz<~sg+U*O@9{-2ytjH~FMW#hJ{ z5MG7rvfnJCbUfMGi_yqUTm|J>4hv_TfXzZ{kua)Jgi!A2}Y4 z|4C@Ggwb+SBBuOv!tURMY{p9|#*c-g;hVTB>EOb@PEl*W24{M! z&)2}QKDdSv8m$4e`q0|SEqWV5C(vdVE{nm4kT`dUBT+grvYJuIu1zolH z3f2h}T?^~w`vA9Mbu;4&4{$x|4?6020HJK4u#s)@rTMP%~JOtf!F^ujI z#a?FsITp)7YwLj3ibHoFK}}V4z(z8Fyc*9zR*!%^w}WEk`KYyniw8RT2qrj48=a}U z3lew?2B+O7f)9C%ex zTDkS0wPZiz{jnajPIJMG23Uo9)CzH^tO1Cr2Pm%u)-E*M0Jfcturl@Zm=r$DNpFI* zUk@=t9!=nHcbG|*bc9Mqty^moBwKuh@sV!^pDZqjY=&edh}8@;`otml(5GhHg!O|q zkhW>MD5M3>z8F$zfy^Z>klB|WlNlrj8MOj8#Bj;2u;*Jzq}l>X-&!HXeJ*f)0=q}O zDmOiW-RnZePjER>B^^g~PoQ$m<4lP3Q;0|D3^@7};=33?s+`~;;b-95o58UD&%pIq zCUx*+(6eW_HTxw4NQEq2rwv$kHUmc6@BnuFX$Guq2j&(RRJQ}umcuYs z&w)|Mr2)A-PnWx4RnK7!O$rzv`~~=IWB^%tMi=dP0a=UBFl@^Ukn1>$j62|u1Y9bS zcL&T|1sQeV3g~nP&S9>hX!sSb&yG7!`N<-wzhKTc89@HN@Mr5z`~_*-F3>)t^hFL5 zdI_0KFET;PUP90&F1Y*>_A(VYzJx3~oj8XN&Y9==HTFmhZpCb!%S_1HR}d1#08*ux z%0q3=;48?pyO^1PWfx4ZfdS;^>$<443wD}=qPyS};N5TvqM5O8H?GGI;q+w|&1i)8 z%==PCqq!S23~$hY>?+qqZaq+V9b-Tzdw>-!V_XM&V7+#gGho$gVCuP`@-;A{6%1qg z1{j-4MseV#E-HQliqQ{IbT2NO{uZWH&Wy>`k2z@TTOhAKrb#lek%Pu4!}&(qfSlif z`!EB@oE8qc_YT+tFBx~+E)KHo1w&dFWmw4WpnuDw?p~b!;6Orsuw29NeuC6w&Kn#> zy@I8Q?Sp6CvWH1=z7LM+!8Z(0>xX<#xgf3|n7waN?t6Ia4)?=bw}}DdwmxkX@g5TI zeMhm*^jq)M7s!>}OBrO5=>Q1za>1Sf*l{tG^B$h4I|DevKEO8lGMMiJ2WH6Yz0A1u zZ`hN8LBtvY!tfJ_8V%8a>>1&pi=QB+^Dx6sQ0zf2a36$Ow~tVaJbE;UTd)+->rYU5 z;};H^Jp^I%N0~5k2*Ogipl=AmjJ_b_&#=-xV>k*P2G<0xL2I0YI)~u~a(e_32l*Yq%=C8iND$f=dkwz$0fj4l>=mDD@l292f_g>3j_68V8vk8ptER zZ!lvmeu_z8+X*rr>fgbACl_RhgIdmam~u9X9tW|(?>HZw`P+ARJM}U~`1Jkr!i)X^ z$8JKDDpLlDNwEl2{R3*5CB|5UC*T;wi8CNYnx)In+!&+S=wc17$38Tbp(ZC_Wu9@t zfDEk6)}J6VIE|s}e*$eT!2qRSaIH;7xj&#h^b5CT)iL8&@^I1o_6x!`Nim*B6j*%l z=AthBUcaHvnt$yC%K6Rx7I{HYd`ka>(3Ao4&|vX$g99ePqeBlJoy5K9TTL%zQ1zh< zu7Xi3gCn@N_~UB{L-yl?$4?O+?74@I4-(3>yBG`1F^7>Oi;$IuYUmf?f4_R*n;u28 z2zmDP!{{~qhVOc2ov82n>nuW-JwX$6uK)?NL2maE+H=av5cnTKm^lVh_GZS8uCTe6 z?OT-9=P2!sBGWNJ?xbWfuy-?d!Id!~VSi+zC?Yr&p?iR3?L|E-0{&n^uY)V~iV6}uPOY{iIs%vCe^zth z8eZgCjVp?&{m*rH(Z9Z;^u3NcFo$_TrQkoze^>ewMUMZ66#Vl|LWR2V0lPK*p8}-0 zgBFp2ot2pl ze2Ssh9hf}KmYPcg*x0YzP_YOhN3RWKR1yKBRy$?XK%SlO5w=+bR==u~vV^g3jneLD zy*R;-Y(?Rzq}FYoC(2KfC@zk3-$>bY+5P1EnFZ<(C-Y!w%S<8U=)pRJ&50@4+NDL36_6@pY=n%y;E~FVX{?(M3TJQnNeA1gX zYjWrAEDM|9+Nc49ZMl zl-nuFnzRfx$q~+2#WEaKuY`+-o;+bD6y%Td#6kmTLuk}`bhQMRK-=UA6ZW`2x-L)5 zV+Slplk&uTw&e=sssN8|!U`O14S{R=bp_bO%>g*t9*Rq*D*~tja5ohG{&`ZUBao)1 zp-e@>7E@ZuMIRLjM=YF+NL{~aXt5G_9}9xmSg0va2~OSfAaq9s+HIee2rIT?FavDD zaSn=9hTV}3VJtV5fezpT5fx$udub@e$f12Ipprv_cdYX z)_@wm(jcBa9KpB`Yk<4OS_XJ;fElgTB+Q^U$Wj9_&lr%uO&K;Z2Epk>02UWXXO~5L zrc+M}gB;VfU?py>PuGT2o?4LVCo`6h$FE0!h7)dbff9U_2j63fJCa3C&`3*tF2!OhX|dW1D=B{SZd1S|a;NX&mDj#QK247uwQ z{+RD38cC!3`h*pB>JO^i2E{uVK=C&>BL_neJ8S?ovbQjx#{lw=)4-Euk4C7;pEraV zStT(JYDVCl#04jJfmpT?4)=j+#Sc7w~Ls4+D(MVOGCs;K`o7momzspXP)=>ku+F1@CAJ$n%sL4;_XD9kc+g z$o)*Xoh4{p=YqqQpyif=9IQZt-wLKg(jcCF_yA>;K`mC`{)`LMtiiqcAj4!@!#R;e zuc-n*TEo(a9cG9S8wl~?f*Upvl5qs}*g^&)TgcGO1;3BOLAYQGrNIY3(DB$>+pJF|=(ac;ho5_iZkCnF$NIZ3bkh zIL^>b6g|lWDl?(9AL$h1$#y{0Z#fij3aXNDfS5+wB7=e)AZFSLM!+Z=B)foSi6B*b zNT}-wr7mK|QKzBQLPv=8$V5i7K<%3&O!znr;@L+}QbrkcXBG&ybHQjX2--P8OluZH zr#Qj7N~2b4Ixn4w02X}4Qe*Gggf-hJn{je0fUuU?5cZI3QE~=V;nNHq=Oe>8umX7nX!{&^!M~w@OQ6?t2s^g+8OkVu zz9CG6dO=S|LV|<{`x4g-*FjtMXD;ZROUz`)o@D|KUBm^E-8^EdNGdCp^)Qo%XY4Ev HSEc_4*lJ{6 From 011ce40c8c47108e693624a7490f16450733d822 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 17:11:47 +0000 Subject: [PATCH 152/157] Rename test ++ --- ObjectiveGitTests/GTDiffSpec.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 7c13738c8..f2b045586 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -140,6 +140,18 @@ }]; }); + + it(@"should recognise renames", ^{ + setupDiffFromCommitSHAs(@"f7ecd8f4404d3a388efbff6711f1bdf28ffd16a0", @"6b0c1c8b8816416089c534e474f4c692a76ac14f"); + [diff findSimilarWithOptions:nil]; + expect(diff.deltaCount).to.equal(1); + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaRenamed); + expect(delta.oldFile.path).to.equal(@"README"); + expect(delta.newFile.path).to.equal(@"README_renamed"); + *stop = YES; + }]; + }); }); SpecEnd From c2ff71d78d6fb99fdfeec9ab7fbacd06b41b1d45 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 17:48:34 +0000 Subject: [PATCH 153/157] Neatly initialise our options structs. --- Classes/GTDiff.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/GTDiff.m b/Classes/GTDiff.m index d6c19d3ed..780d1ef60 100644 --- a/Classes/GTDiff.m +++ b/Classes/GTDiff.m @@ -58,7 +58,7 @@ + (BOOL)optionsStructFromDictionary:(NSDictionary *)dictionary optionsStruct:(gi + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options:(NSDictionary *)options { NSParameterAssert([oldTree.repository isEqualTo:newTree.repository]); - git_diff_options optionsStruct; + git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_tree(&diffList, oldTree.repository.git_repository, oldTree.git_tree, newTree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); @@ -71,7 +71,7 @@ + (GTDiff *)diffOldTree:(GTTree *)oldTree withNewTree:(GTTree *)newTree options: + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options { NSParameterAssert(tree != nil); - git_diff_options optionsStruct; + git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_index(&diffList, tree.repository.git_repository, tree.git_tree, NULL, (optionsStructCreated ? &optionsStruct : NULL)); @@ -84,7 +84,7 @@ + (GTDiff *)diffIndexFromTree:(GTTree *)tree options:(NSDictionary *)options { + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository options:(NSDictionary *)options { NSParameterAssert(repository != nil); - git_diff_options optionsStruct; + git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_index_to_workdir(&diffList, repository.git_repository, NULL, (optionsStructCreated ? &optionsStruct : NULL)); @@ -97,7 +97,7 @@ + (GTDiff *)diffIndexToWorkingDirectoryInRepository:(GTRepository *)repository o + (GTDiff *)diffWorkingDirectoryFromTree:(GTTree *)tree options:(NSDictionary *)options { NSParameterAssert(tree != nil); - git_diff_options optionsStruct; + git_diff_options optionsStruct = GIT_DIFF_OPTIONS_INIT; BOOL optionsStructCreated = [self optionsStructFromDictionary:options optionsStruct:&optionsStruct]; git_diff_list *diffList; int returnValue = git_diff_tree_to_workdir(&diffList, tree.repository.git_repository, tree.git_tree, (optionsStructCreated ? &optionsStruct : NULL)); From 478e177c47543a162544c7afabf8f4935e5a88e5 Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 17:48:44 +0000 Subject: [PATCH 154/157] Test that we are building the options struct properly. --- ObjectiveGitTests/GTDiffSpec.m | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index f2b045586..9d2d788c4 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -54,18 +54,18 @@ expect(repository).toNot.beNil(); }); - void (^setupDiffFromCommitSHAs)(NSString *, NSString *) = [^(NSString *firstCommitSHA, NSString *secondCommitSHA) { + void (^setupDiffFromCommitSHAsAndOptions)(NSString *, NSString *, NSDictionary *) = [^(NSString *firstCommitSHA, NSString *secondCommitSHA, NSDictionary *options) { firstCommit = (GTCommit *)[repository lookupObjectBySha:firstCommitSHA objectType:GTObjectTypeCommit error:NULL]; expect(firstCommit).toNot.beNil(); secondCommit = (GTCommit *)[repository lookupObjectBySha:secondCommitSHA objectType:GTObjectTypeCommit error:NULL]; expect(secondCommit).toNot.beNil(); - diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:nil]; + diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:options]; expect(diff).toNot.beNil(); } copy]; it(@"should be able to diff simple file changes", ^{ - setupDiffFromCommitSHAs(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe"); + setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", nil); expect(diff.deltaCount).to.equal(1); expect([diff numberOfDeltasWithType:GTDiffFileDeltaModified]).to.equal(1); @@ -113,7 +113,7 @@ }); it(@"should recognised added files", ^{ - setupDiffFromCommitSHAs(@"4d5a6cc7a4d810be71bd47331c947b22580a5997", @"38f1e536cfc2ee41e07d55b38baec00149b2b0d1"); + setupDiffFromCommitSHAsAndOptions(@"4d5a6cc7a4d810be71bd47331c947b22580a5997", @"38f1e536cfc2ee41e07d55b38baec00149b2b0d1", nil); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect(delta.newFile.path).to.equal(@"REAME"); //loltypo @@ -123,7 +123,7 @@ }); it(@"should recognise deleted files", ^{ - setupDiffFromCommitSHAs(@"6317779b4731d9c837dcc6972b964bdf4211eeef", @"9f90c6e24629fae3ef51101bb6448342b44098ef"); + setupDiffFromCommitSHAsAndOptions(@"6317779b4731d9c837dcc6972b964bdf4211eeef", @"9f90c6e24629fae3ef51101bb6448342b44098ef", nil); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect((NSUInteger)delta.type).to.equal(GTDiffFileDeltaDeleted); @@ -132,7 +132,7 @@ }); it(@"should recognise binary files", ^{ - setupDiffFromCommitSHAs(@"2ba9cdca982ac35a8db29f51c635251374008229", @"524500582248889ef2243931aa7fc48aa21dd12f"); + setupDiffFromCommitSHAsAndOptions(@"2ba9cdca982ac35a8db29f51c635251374008229", @"524500582248889ef2243931aa7fc48aa21dd12f", nil); expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { expect(delta.binary).to.beTruthy(); @@ -142,7 +142,7 @@ }); it(@"should recognise renames", ^{ - setupDiffFromCommitSHAs(@"f7ecd8f4404d3a388efbff6711f1bdf28ffd16a0", @"6b0c1c8b8816416089c534e474f4c692a76ac14f"); + setupDiffFromCommitSHAsAndOptions(@"f7ecd8f4404d3a388efbff6711f1bdf28ffd16a0", @"6b0c1c8b8816416089c534e474f4c692a76ac14f", nil); [diff findSimilarWithOptions:nil]; expect(diff.deltaCount).to.equal(1); [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { @@ -152,6 +152,24 @@ *stop = YES; }]; }); + + it(@"should correctly pass options to libgit2", ^{ + NSDictionary *options = @{ GTDiffOptionsContextLinesKey: @(5) }; + setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", options); + expect(diff.deltaCount).to.equal(1); + [diff enumerateDeltasUsingBlock:^(GTDiffDelta *delta, BOOL *stop) { + expect(delta.hunkCount).to.equal(1); + [delta enumerateHunksWithBlock:^(GTDiffHunk *hunk, BOOL *stop) { + __block NSUInteger contextCount = 0; + [hunk enumerateLinesInHunkUsingBlock:^(NSString *lineContent, NSUInteger oldLineNumber, NSUInteger newLineNumber, GTDiffHunkLineOrigin lineOrigin, BOOL *stop) { + if (lineOrigin == GTDiffHunkLineOriginContext) contextCount ++; + }]; + expect(contextCount).to.equal(10); + *stop = YES; + }]; + *stop = YES; + }]; + }); }); SpecEnd From ef154c303f10eecbb79b386ca89da555fe3c8c4a Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 20:44:51 +0000 Subject: [PATCH 155/157] Move setupDiff block init into the beforeEach. --- ObjectiveGitTests/GTDiffSpec.m | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ObjectiveGitTests/GTDiffSpec.m b/ObjectiveGitTests/GTDiffSpec.m index 9d2d788c4..f6c0e47b7 100644 --- a/ObjectiveGitTests/GTDiffSpec.m +++ b/ObjectiveGitTests/GTDiffSpec.m @@ -48,22 +48,23 @@ __block GTCommit *firstCommit = nil; __block GTCommit *secondCommit = nil; __block GTDiff *diff = nil; + __block void (^setupDiffFromCommitSHAsAndOptions)(NSString *, NSString *, NSDictionary *) = nil; beforeEach(^{ repository = [GTRepository repositoryWithURL:[NSURL fileURLWithPath:TEST_APP_REPO_PATH(self.class)] error:NULL]; expect(repository).toNot.beNil(); + + setupDiffFromCommitSHAsAndOptions = [^(NSString *firstCommitSHA, NSString *secondCommitSHA, NSDictionary *options) { + firstCommit = (GTCommit *)[repository lookupObjectBySha:firstCommitSHA objectType:GTObjectTypeCommit error:NULL]; + expect(firstCommit).toNot.beNil(); + secondCommit = (GTCommit *)[repository lookupObjectBySha:secondCommitSHA objectType:GTObjectTypeCommit error:NULL]; + expect(secondCommit).toNot.beNil(); + + diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:options]; + expect(diff).toNot.beNil(); + } copy]; }); - - void (^setupDiffFromCommitSHAsAndOptions)(NSString *, NSString *, NSDictionary *) = [^(NSString *firstCommitSHA, NSString *secondCommitSHA, NSDictionary *options) { - firstCommit = (GTCommit *)[repository lookupObjectBySha:firstCommitSHA objectType:GTObjectTypeCommit error:NULL]; - expect(firstCommit).toNot.beNil(); - secondCommit = (GTCommit *)[repository lookupObjectBySha:secondCommitSHA objectType:GTObjectTypeCommit error:NULL]; - expect(secondCommit).toNot.beNil(); - diff = [GTDiff diffOldTree:firstCommit.tree withNewTree:secondCommit.tree options:options]; - expect(diff).toNot.beNil(); - } copy]; - it(@"should be able to diff simple file changes", ^{ setupDiffFromCommitSHAsAndOptions(@"be0f001ff517a00b5b8e3c29ee6561e70f994e17", @"fe89ea0a8e70961b8a6344d9660c326d3f2eb0fe", nil); expect(diff.deltaCount).to.equal(1); From 2bd17ee672f3715b583bdf97c4ff4a31bc3df00c Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 20:54:54 +0000 Subject: [PATCH 156/157] Remove an old header. :trollface: --- ObjectiveGitTests/GTDiffTest.h | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 ObjectiveGitTests/GTDiffTest.h diff --git a/ObjectiveGitTests/GTDiffTest.h b/ObjectiveGitTests/GTDiffTest.h deleted file mode 100644 index 4f862ebab..000000000 --- a/ObjectiveGitTests/GTDiffTest.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// GTDiffTest.h -// ObjectiveGitFramework -// -// Created by Danny Greg on 04/12/2012. -// Copyright (c) 2012 GitHub, Inc. All rights reserved. -// - -#import - -@interface GTDiffTest : SenTestCase - -@end From 068560b465f96fa92347e51378631ddf8c3acf3f Mon Sep 17 00:00:00 2001 From: Danny Greg Date: Tue, 18 Dec 2012 20:58:10 +0000 Subject: [PATCH 157/157] Docs typo --; --- Classes/GTDiff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/GTDiff.h b/Classes/GTDiff.h index b570cc672..997cc9a1c 100644 --- a/Classes/GTDiff.h +++ b/Classes/GTDiff.h @@ -122,7 +122,7 @@ extern NSString *const GTDiffFindOptionsBreakRewriteThresholdKey; // Defaults to 200. extern NSString *const GTDiffFindOptionsTargetLimitKey; -// Enum for options passed into `-findSimilar`. +// Enum for options passed into `-findSimilarWithOptions:`. // // For individual case documentation see `diff.h`. typedef enum : git_diff_find_t {