31
31
#import " GTTree.h"
32
32
#import " GTTreeEntry.h"
33
33
#import " GTRepository.h"
34
+ #import " GTObjectDatabase.h"
35
+ #import " GTOID.h"
34
36
#import " NSError+Git.h"
35
37
36
38
@interface GTTreeBuilder ()
37
39
@property (nonatomic , assign , readonly ) git_treebuilder *git_treebuilder;
40
+ @property (nonatomic , retain , readonly ) NSMutableDictionary *objectData;
38
41
@end
39
42
40
43
@implementation GTTreeBuilder
@@ -57,6 +60,8 @@ - (id)initWithTree:(GTTree *)treeOrNil error:(NSError **)error {
57
60
return nil ;
58
61
}
59
62
63
+ _objectData = @{}.mutableCopy ;
64
+
60
65
return self;
61
66
}
62
67
@@ -93,6 +98,17 @@ - (GTTreeEntry *)entryWithName:(NSString *)filename {
93
98
return [GTTreeEntry entryWithEntry: entry parentTree: nil ];
94
99
}
95
100
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
+
96
112
- (GTTreeEntry *)addEntryWithOID : (GTOID *)oid filename : (NSString *)filename filemode : (GTFileMode)filemode error : (NSError **)error {
97
113
NSParameterAssert (oid != nil );
98
114
NSParameterAssert (filename != nil );
@@ -118,11 +134,27 @@ - (BOOL)removeEntryWithFilename:(NSString *)filename error:(NSError **)error {
118
134
if (status != GIT_OK) {
119
135
if (error != NULL ) *error = [NSError git_errorFor: status withAdditionalDescription: @" Failed to remove entry from tree builder by filename." ];
120
136
}
137
+
138
+ [self .objectData removeObjectForKey: filename];
121
139
122
140
return (status == GIT_OK);
123
141
}
124
142
125
143
- (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
+
126
158
git_oid treeOid;
127
159
int status = git_treebuilder_write (&treeOid, repository.git_repository , self.git_treebuilder );
128
160
if (status != GIT_OK) {
0 commit comments