Skip to content

Commit 1f203eb

Browse files
committed
Add a convenience call to create tree entries and their data at the same time.
1 parent 92f4b28 commit 1f203eb

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

Classes/GTTreeBuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ typedef enum {
7979
// Returns the matching entry or nil if it doesn't exist.
8080
- (GTTreeEntry *)entryWithName:(NSString *)filename;
8181

82+
- (GTTreeEntry *)addEntryWithData:(NSData *)data filename:(NSString *)filename filemode:(GTFileMode)filemode error:(NSError **)error;
83+
8284
// Add or update an entry to the builder.
8385
//
8486
// sha - The OID of a git object aleady stored in the repository.

Classes/GTTreeBuilder.m

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@
3131
#import "GTTree.h"
3232
#import "GTTreeEntry.h"
3333
#import "GTRepository.h"
34+
#import "GTObjectDatabase.h"
35+
#import "GTOID.h"
3436
#import "NSError+Git.h"
3537

3638
@interface GTTreeBuilder ()
3739
@property (nonatomic, assign, readonly) git_treebuilder *git_treebuilder;
40+
@property (nonatomic, retain, readonly) NSMutableDictionary *objectData;
3841
@end
3942

4043
@implementation GTTreeBuilder
@@ -57,6 +60,8 @@ - (id)initWithTree:(GTTree *)treeOrNil error:(NSError **)error {
5760
return nil;
5861
}
5962

63+
_objectData = @{}.mutableCopy;
64+
6065
return self;
6166
}
6267

@@ -93,6 +98,17 @@ - (GTTreeEntry *)entryWithName:(NSString *)filename {
9398
return [GTTreeEntry entryWithEntry:entry parentTree:nil];
9499
}
95100

101+
- (GTTreeEntry *)addEntryWithData:(NSData *)data filename:(NSString *)filename filemode:(GTFileMode)filemode error:(NSError **)error {
102+
NSParameterAssert(data != nil);
103+
NSParameterAssert(filename != nil);
104+
105+
GTOID *oid = [GTOID oidByHashingData:data type:GTObjectTypeBlob];
106+
107+
self.objectData[filename] = @{@"data": data, @"oid":oid, @"filemode":@(filemode)};
108+
109+
return [self addEntryWithOID:oid filename:filename filemode:filemode error:error];
110+
}
111+
96112
- (GTTreeEntry *)addEntryWithOID:(GTOID *)oid filename:(NSString *)filename filemode:(GTFileMode)filemode error:(NSError **)error {
97113
NSParameterAssert(oid != nil);
98114
NSParameterAssert(filename != nil);
@@ -118,11 +134,27 @@ - (BOOL)removeEntryWithFilename:(NSString *)filename error:(NSError **)error {
118134
if (status != GIT_OK) {
119135
if (error != NULL) *error = [NSError git_errorFor:status withAdditionalDescription:@"Failed to remove entry from tree builder by filename."];
120136
}
137+
138+
[self.objectData removeObjectForKey:filename];
121139

122140
return (status == GIT_OK);
123141
}
124142

125143
- (GTTree *)writeTreeToRepository:(GTRepository *)repository error:(NSError **)error {
144+
if (self.objectData.count != 0) {
145+
GTObjectDatabase *odb = [repository objectDatabaseWithError:error];
146+
if (odb == nil) return nil;
147+
148+
for (GTOID *oid in self.objectData) {
149+
NSDictionary *info = self.objectData[oid];
150+
151+
GTOdbObject *odbObj = [odb objectByInsertingData:info[@"data"]
152+
objectType:GTObjectTypeBlob
153+
error:error];
154+
if (odbObj == nil) return nil;
155+
}
156+
}
157+
126158
git_oid treeOid;
127159
int status = git_treebuilder_write(&treeOid, repository.git_repository, self.git_treebuilder);
128160
if (status != GIT_OK) {

0 commit comments

Comments
 (0)