Skip to content

Commit 79b1745

Browse files
committedMar 24, 2016
Merge pull request #566 from ethomson/immediately_add_blob
GTTreeBuilder: don't add blob data lazily
2 parents 8e2768c + 0a9019b commit 79b1745

File tree

2 files changed

+6
-46
lines changed

2 files changed

+6
-46
lines changed
 

‎ObjectiveGit/GTTreeBuilder.m

+4-42
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,6 @@ @interface GTTreeBuilder ()
4343
@property (nonatomic, assign, readonly) git_treebuilder *git_treebuilder;
4444
@property (nonatomic, strong, readonly) GTRepository *repository;
4545

46-
// Data to be written with the tree, keyed by the file name. This should only be
47-
// accessed while synchronized on self.
48-
//
49-
// This is needed because we don't want to add the entries to the object
50-
// database until the tree's been written.
51-
@property (nonatomic, strong, readonly) NSMutableDictionary *fileNameToPendingData;
52-
5346
@end
5447

5548
@implementation GTTreeBuilder
@@ -80,8 +73,6 @@ - (instancetype)initWithTree:(GTTree *)treeOrNil repository:(GTRepository *)repo
8073
}
8174

8275
_repository = repository;
83-
_fileNameToPendingData = [NSMutableDictionary dictionary];
84-
8576
return self;
8677
}
8778

@@ -122,12 +113,11 @@ - (GTTreeEntry *)addEntryWithData:(NSData *)data fileName:(NSString *)fileName f
122113
NSParameterAssert(data != nil);
123114
NSParameterAssert(fileName != nil);
124115

125-
GTOID *OID = [GTOID OIDByHashingData:data type:GTObjectTypeBlob error:error];
126-
if (OID == nil) return nil;
116+
GTObjectDatabase *odb = [self.repository objectDatabaseWithError:error];
117+
if (odb == nil) return nil;
127118

128-
@synchronized (self) {
129-
self.fileNameToPendingData[fileName] = data;
130-
}
119+
GTOID *OID = [odb writeData:data type:GTObjectTypeBlob error:error];
120+
if (OID == nil) return nil;
131121

132122
return [self addEntryWithOID:OID fileName:fileName fileMode:fileMode error:error];
133123
}
@@ -153,38 +143,10 @@ - (BOOL)removeEntryWithFileName:(NSString *)fileName error:(NSError **)error {
153143
if (error != NULL) *error = [NSError git_errorFor:status description:@"Failed to remove entry with name %@ from tree builder.", fileName];
154144
}
155145

156-
@synchronized (self) {
157-
[self.fileNameToPendingData removeObjectForKey:fileName];
158-
}
159-
160146
return status == GIT_OK;
161147
}
162148

163-
- (BOOL)writePendingData:(NSError **)error {
164-
NSDictionary *copied;
165-
@synchronized (self) {
166-
copied = [self.fileNameToPendingData copy];
167-
[self.fileNameToPendingData removeAllObjects];
168-
}
169-
170-
if (copied.count != 0) {
171-
GTObjectDatabase *odb = [self.repository objectDatabaseWithError:error];
172-
if (odb == nil) return NO;
173-
174-
for (NSString *fileName in copied) {
175-
NSData *data = copied[fileName];
176-
GTOID *dataOID = [odb writeData:data type:GTObjectTypeBlob error:error];
177-
if (dataOID == nil) return NO;
178-
}
179-
}
180-
181-
return YES;
182-
}
183-
184149
- (GTTree *)writeTree:(NSError **)error {
185-
BOOL success = [self writePendingData:error];
186-
if (!success) return nil;
187-
188150
git_oid treeOid;
189151
int status = git_treebuilder_write(&treeOid, self.git_treebuilder);
190152
if (status != GIT_OK) {

‎ObjectiveGitTests/GTTreeBuilderSpec.m

+2-4
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,17 @@
103103
expect(foundEntry.SHA).to(equal(entry.SHA));
104104
});
105105

106-
it(@"should write new blobs when the tree is written", ^{
106+
it(@"should be possible to write a blob with data", ^{
107107
GTTreeEntry *entry = [builder addEntryWithData:[@"Hello, World!" dataUsingEncoding:NSUTF8StringEncoding] fileName:@"test.txt" fileMode:GTFileModeBlob error:NULL];
108108
expect(entry).notTo(beNil());
109109

110110
GTObjectDatabase *database = [repo objectDatabaseWithError:NULL];
111111
expect(database).notTo(beNil());
112112

113-
expect(@([database containsObjectWithOID:entry.OID])).to(beFalsy());
113+
expect(@([database containsObjectWithOID:entry.OID])).to(beTruthy());
114114

115115
GTTree *tree = [builder writeTree:NULL];
116116
expect(tree).notTo(beNil());
117-
118-
expect(@([database containsObjectWithOID:entry.OID])).to(beTruthy());
119117
});
120118

121119
it(@"should be possible to write a builder to a repository", ^{

0 commit comments

Comments
 (0)
Please sign in to comment.