Skip to content

Commit 2316a61

Browse files
committed
Merge pull request #435 from 0x4a616e/master
Added two new objective c wrappers for libgit2
2 parents 93162fd + 9b6b255 commit 2316a61

File tree

8 files changed

+79
-32
lines changed

8 files changed

+79
-32
lines changed

ObjectiveGit/GTDiffPatch.h

+3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@
5050
/// Returns the raw size of the delta, in bytes.
5151
- (NSUInteger)sizeWithContext:(BOOL)includeContext hunkHeaders:(BOOL)includeHunkHeaders fileHeaders:(BOOL)includeFileHeaders;
5252

53+
/// Returns the raw patch data.
54+
- (NSData *)patchData;
55+
5356
/// Enumerate the hunks contained in the patch.
5457
///
5558
/// This enumeration is synchronous, and will block the calling thread while

ObjectiveGit/GTDiffPatch.m

+10
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ - (NSUInteger)sizeWithContext:(BOOL)includeContext hunkHeaders:(BOOL)includeHunk
5959
return git_patch_size(self.git_patch, includeContext, includeHunkHeaders, includeFileHeaders);
6060
}
6161

62+
- (NSData *)patchData {
63+
git_buf buf = GIT_BUF_INIT_CONST(0, NULL);
64+
git_patch_to_buf(&buf, self.git_patch);
65+
66+
NSData *buffer = [[NSData alloc] initWithBytes:buf.ptr length:buf.size];
67+
git_buf_free(&buf);
68+
69+
return buffer;
70+
}
71+
6272
#pragma mark Hunks
6373

6474
- (BOOL)enumerateHunksUsingBlock:(void (^)(GTDiffHunk *hunk, BOOL *stop))block {

ObjectiveGit/GTTree.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,27 @@ typedef NS_ENUM(NSInteger, GTTreeEnumerationOptions) {
5050
/// The underlying `git_object` as a `git_tree` object.
5151
- (git_tree *)git_tree __attribute__((objc_returns_inner_pointer));
5252

53-
/// Get a entry at the specified index
53+
/// Get an entry at the specified index
5454
///
5555
/// index - index to retreive entry from
5656
///
5757
/// returns a GTTreeEntry or nil if there is nothing at the index
5858
- (GTTreeEntry *)entryAtIndex:(NSUInteger)index;
5959

60-
/// Get a entry by name
60+
/// Get an entry by name
6161
///
6262
/// name - the name of the entry
6363
///
6464
/// returns a GTTreeEntry or nil if there is nothing with the specified name
6565
- (GTTreeEntry *)entryWithName:(NSString *)name;
6666

67+
/// Get an entry by path
68+
///
69+
/// path - the path of the entry relative to the repository root
70+
///
71+
/// returns a GTTreeEntry or nil if there is nothing with the specified path
72+
- (GTTreeEntry *)entryWithPath:(NSString *)path error:(NSError **)error;
73+
6774
/// Enumerates the contents of the tree
6875
///
6976
/// options - One of `GTTreeEnumerationOptionPre` (for pre-order walks) or

ObjectiveGit/GTTree.m

+18-5
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,29 @@ - (NSUInteger)entryCount {
5656
return (NSUInteger)git_tree_entrycount(self.git_tree);
5757
}
5858

59-
- (GTTreeEntry *)createEntryWithEntry:(const git_tree_entry *)entry {
60-
return (entry != NULL ? [GTTreeEntry entryWithEntry:entry parentTree:self] : nil);
59+
- (GTTreeEntry *)createEntryWithEntry:(const git_tree_entry *)entry error:(NSError **)error {
60+
return (entry != NULL ? [GTTreeEntry entryWithEntry:entry parentTree:self error:nil] : nil);
6161
}
6262

6363
- (GTTreeEntry *)entryAtIndex:(NSUInteger)index {
64-
return [self createEntryWithEntry:git_tree_entry_byindex(self.git_tree, index)];
64+
return [self createEntryWithEntry:git_tree_entry_byindex(self.git_tree, index) error:nil];
6565
}
6666

6767
- (GTTreeEntry *)entryWithName:(NSString *)name {
68-
return [self createEntryWithEntry:git_tree_entry_byname(self.git_tree, name.UTF8String)];
68+
return [self createEntryWithEntry:git_tree_entry_byname(self.git_tree, name.UTF8String) error:nil];
69+
}
70+
71+
- (GTTreeEntry *)entryWithPath:(NSString *)path error:(NSError **)error {
72+
git_tree_entry *internalEntry = NULL;
73+
int gitError = git_tree_entry_bypath(&internalEntry, self.git_tree, path.UTF8String);
74+
if (error != GIT_OK) {
75+
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to get tree entry %@", path];
76+
return nil;
77+
}
78+
79+
GTTreeEntry *entry = [self createEntryWithEntry:internalEntry error:error];
80+
git_tree_entry_free(internalEntry);
81+
return entry;
6982
}
7083

7184
- (git_tree *)git_tree {
@@ -79,7 +92,7 @@ static int treewalk_cb(const char *root, const git_tree_entry *git_entry, void *
7992
NSString *rootString = @(root);
8093
GTTreeEntry *parentEntry = enumerationStruct->directoryStructure[rootString];
8194
GTTree *parentTree = parentEntry != nil ? parentEntry.tree : enumerationStruct->myself;
82-
GTTreeEntry *entry = [GTTreeEntry entryWithEntry:git_entry parentTree:parentTree];
95+
GTTreeEntry *entry = [GTTreeEntry entryWithEntry:git_entry parentTree:parentTree error:nil];
8396

8497
if (entry.type == GTObjectTypeTree) {
8598
NSString *path = [rootString stringByAppendingPathComponent:entry.name];

ObjectiveGit/GTTreeBuilder.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ - (GTTreeEntry *)entryWithFileName:(NSString *)fileName {
110110
const git_tree_entry *entry = git_treebuilder_get(self.git_treebuilder, fileName.UTF8String);
111111
if (entry == NULL) return nil;
112112

113-
return [GTTreeEntry entryWithEntry:entry parentTree:nil];
113+
return [GTTreeEntry entryWithEntry:entry parentTree:nil error:nil];
114114
}
115115

116116
- (GTTreeEntry *)addEntryWithData:(NSData *)data fileName:(NSString *)fileName fileMode:(GTFileMode)fileMode error:(NSError **)error {
@@ -139,7 +139,7 @@ - (GTTreeEntry *)addEntryWithOID:(GTOID *)oid fileName:(NSString *)fileName file
139139
return nil;
140140
}
141141

142-
return [GTTreeEntry entryWithEntry:entry parentTree:nil];
142+
return [GTTreeEntry entryWithEntry:entry parentTree:nil error:error];
143143
}
144144

145145
- (BOOL)removeEntryWithFileName:(NSString *)fileName error:(NSError **)error {

ObjectiveGit/GTTreeEntry.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434
@interface GTTreeEntry : NSObject
3535

3636
/// Initializer and convience methods.
37-
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent;
38-
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent;
37+
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error;
38+
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error;
3939

4040
/// The underlying `git_tree_entry`.
41-
- (const git_tree_entry *)git_tree_entry __attribute__((objc_returns_inner_pointer));
41+
- (git_tree_entry *)git_tree_entry __attribute__((objc_returns_inner_pointer));
4242

4343
/// The entry's parent tree. This may be nil if nil is passed in to -initWithEntry:
4444
@property (nonatomic, strong, readonly) GTTree *tree;

ObjectiveGit/GTTreeEntry.m

+21-7
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#import "git2/errors.h"
3939

4040
@interface GTTreeEntry ()
41-
@property (nonatomic, assign, readonly) const git_tree_entry *git_tree_entry;
41+
@property (nonatomic, assign, readonly) git_tree_entry *git_tree_entry;
4242
@end
4343

4444
@implementation GTTreeEntry
@@ -64,19 +64,33 @@ - (BOOL)isEqualToEntry:(GTTreeEntry *)treeEntry {
6464
return git_tree_entry_cmp(self.git_tree_entry, treeEntry.git_tree_entry) == 0 ? YES : NO;
6565
}
6666

67+
- (void)dealloc {
68+
git_tree_entry_free(_git_tree_entry);
69+
}
70+
6771
#pragma mark API
6872

69-
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent {
73+
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error {
7074
NSParameterAssert(theEntry != NULL);
71-
if((self = [super init])) {
72-
_git_tree_entry = theEntry;
73-
_tree = parent;
75+
76+
self = [super init];
77+
if (self == nil) return nil;
78+
79+
git_tree_entry *copyOfEntry = nil;
80+
int gitError = git_tree_entry_dup(&copyOfEntry, theEntry);
81+
if (gitError != GIT_OK) {
82+
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to duplicate tree entry."];
83+
return nil;
7484
}
85+
86+
_git_tree_entry = copyOfEntry;
87+
_tree = parent;
88+
7589
return self;
7690
}
7791

78-
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent {
79-
return [[self alloc] initWithEntry:theEntry parentTree:parent];
92+
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error {
93+
return [[self alloc] initWithEntry:theEntry parentTree:parent error:error];
8094
}
8195

8296
- (NSString *)name {

ObjectiveGitFramework.xcodeproj/project.pbxproj

+13-13
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,13 @@
311311
/* End PBXBuildFile section */
312312

313313
/* Begin PBXContainerItemProxy section */
314+
3D6123BD1A6432F6008F831A /* PBXContainerItemProxy */ = {
315+
isa = PBXContainerItemProxy;
316+
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
317+
proxyType = 1;
318+
remoteGlobalIDString = D0A330ED16027F1E00A616FA;
319+
remoteInfo = libgit2;
320+
};
314321
6A28265A17C69D6300C6A948 /* PBXContainerItemProxy */ = {
315322
isa = PBXContainerItemProxy;
316323
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
@@ -346,13 +353,6 @@
346353
remoteGlobalIDString = D0A330F216027F3600A616FA;
347354
remoteInfo = "libgit2-iOS";
348355
};
349-
D0A330F716027F4900A616FA /* PBXContainerItemProxy */ = {
350-
isa = PBXContainerItemProxy;
351-
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
352-
proxyType = 1;
353-
remoteGlobalIDString = D0A330ED16027F1E00A616FA;
354-
remoteInfo = libgit2;
355-
};
356356
/* End PBXContainerItemProxy section */
357357

358358
/* Begin PBXCopyFilesBuildPhase section */
@@ -1094,7 +1094,7 @@
10941094
buildRules = (
10951095
);
10961096
dependencies = (
1097-
D0A330F816027F4900A616FA /* PBXTargetDependency */,
1097+
3D6123BE1A6432F6008F831A /* PBXTargetDependency */,
10981098
);
10991099
name = "ObjectiveGit-Mac";
11001100
productInstallPath = "$(HOME)/Library/Frameworks";
@@ -1396,6 +1396,11 @@
13961396
/* End PBXSourcesBuildPhase section */
13971397

13981398
/* Begin PBXTargetDependency section */
1399+
3D6123BE1A6432F6008F831A /* PBXTargetDependency */ = {
1400+
isa = PBXTargetDependency;
1401+
target = D0A330ED16027F1E00A616FA /* libgit2 */;
1402+
targetProxy = 3D6123BD1A6432F6008F831A /* PBXContainerItemProxy */;
1403+
};
13991404
6A28265B17C69D6300C6A948 /* PBXTargetDependency */ = {
14001405
isa = PBXTargetDependency;
14011406
target = 6A28265217C69CB400C6A948 /* OpenSSL-iOS */;
@@ -1421,11 +1426,6 @@
14211426
target = D0A330F216027F3600A616FA /* libgit2-iOS */;
14221427
targetProxy = D019779619F8335100F523DA /* PBXContainerItemProxy */;
14231428
};
1424-
D0A330F816027F4900A616FA /* PBXTargetDependency */ = {
1425-
isa = PBXTargetDependency;
1426-
target = D0A330ED16027F1E00A616FA /* libgit2 */;
1427-
targetProxy = D0A330F716027F4900A616FA /* PBXContainerItemProxy */;
1428-
};
14291429
/* End PBXTargetDependency section */
14301430

14311431
/* Begin PBXVariantGroup section */

0 commit comments

Comments
 (0)