Skip to content

Commit 83322a1

Browse files
author
Jan Gassen
committed
GTTreeEntry now creates a copy of the respective git_tree_entry during initialisation. The resulting git_tree_entry is thus solely owned (and freed) by GTTreeEntry
1 parent 23d9981 commit 83322a1

File tree

4 files changed

+30
-32
lines changed

4 files changed

+30
-32
lines changed

ObjectiveGit/GTTree.m

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,29 @@ - (NSUInteger)entryCount {
5656
return (NSUInteger)git_tree_entrycount(self.git_tree);
5757
}
5858

59-
- (GTTreeEntry *)createEntryWithCopyOfEntry:(const git_tree_entry *)entry {
60-
return (entry != NULL ? [GTTreeEntry entryWithCopyOfEntry:entry parentTree:self error:nil] : 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 createEntryWithCopyOfEntry: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 createEntryWithCopyOfEntry:git_tree_entry_byname(self.git_tree, name.UTF8String)];
68+
return [self createEntryWithEntry:git_tree_entry_byname(self.git_tree, name.UTF8String) error:nil];
6969
}
7070

7171
- (GTTreeEntry *)entryWithPath:(NSString *)path error:(NSError **)error {
72-
git_tree_entry *entry = NULL;
73-
int gitError = git_tree_entry_bypath(&entry, self.git_tree, path.UTF8String);
72+
git_tree_entry *internalEntry = NULL;
73+
int gitError = git_tree_entry_bypath(&internalEntry, self.git_tree, path.UTF8String);
7474
if (error != GIT_OK) {
75-
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to get tree ntry %@", path];
75+
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to get tree entry %@", path];
7676
return nil;
7777
}
7878

79-
return [GTTreeEntry entryWithEntry:entry parentTree:self];
79+
GTTreeEntry *entry = [self createEntryWithEntry:internalEntry error:error];
80+
git_tree_entry_free(internalEntry);
81+
return entry;
8082
}
8183

8284
- (git_tree *)git_tree {
@@ -90,7 +92,7 @@ static int treewalk_cb(const char *root, const git_tree_entry *git_entry, void *
9092
NSString *rootString = @(root);
9193
GTTreeEntry *parentEntry = enumerationStruct->directoryStructure[rootString];
9294
GTTree *parentTree = parentEntry != nil ? parentEntry.tree : enumerationStruct->myself;
93-
GTTreeEntry *entry = [GTTreeEntry entryWithCopyOfEntry:git_entry parentTree:parentTree error:nil];
95+
GTTreeEntry *entry = [GTTreeEntry entryWithEntry:git_entry parentTree:parentTree error:nil];
9496

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

ObjectiveGit/GTTreeBuilder.m

Lines changed: 2 additions & 2 deletions
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 entryWithCopyOfEntry:entry parentTree:nil error: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 entryWithCopyOfEntry:entry parentTree:nil error:nil];
142+
return [GTTreeEntry entryWithEntry:entry parentTree:nil error:error];
143143
}
144144

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

ObjectiveGit/GTTreeEntry.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@
3434
@interface GTTreeEntry : NSObject
3535

3636
/// Initializer and convience methods.
37-
- (instancetype)initWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent;
38-
+ (instancetype)entryWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent;
39-
+ (instancetype)entryWithCopyOfEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error;
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;
4039

4140
/// The underlying `git_tree_entry`.
4241
- (git_tree_entry *)git_tree_entry __attribute__((objc_returns_inner_pointer));

ObjectiveGit/GTTreeEntry.m

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,30 +70,27 @@ - (void)dealloc {
7070

7171
#pragma mark API
7272

73-
- (instancetype)initWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent {
74-
NSParameterAssert(theEntry != NULL);
75-
if((self = [super init])) {
76-
_git_tree_entry = theEntry;
77-
_tree = parent;
78-
}
79-
return self;
80-
}
81-
82-
+ (instancetype)entryWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent {
83-
return [[self alloc] initWithEntry:theEntry parentTree:parent];
84-
}
85-
86-
+ (instancetype)entryWithCopyOfEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error{
73+
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error {
8774
NSParameterAssert(theEntry != NULL);
75+
76+
self = [super init];
77+
if (self == nil) return nil;
78+
8879
git_tree_entry* copyOfEntry = nil;
8980
int gitError = git_tree_entry_dup(&copyOfEntry, theEntry);
9081
if (gitError != GIT_OK) {
91-
if (error != NULL) {
92-
*error = [NSError git_errorFor:gitError description:@"Failed to duplicate tree entry."];
93-
}
82+
if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to duplicate tree entry."];
9483
return nil;
9584
}
96-
return [GTTreeEntry entryWithEntry:copyOfEntry parentTree:parent];
85+
86+
_git_tree_entry = copyOfEntry;
87+
_tree = parent;
88+
89+
return self;
90+
}
91+
92+
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error {
93+
return [[self alloc] initWithEntry:theEntry parentTree:parent error:error];
9794
}
9895

9996
- (NSString *)name {

0 commit comments

Comments
 (0)