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