diff --git a/ObjGit.h b/ObjGit.h index fb57b1d..d415184 100644 --- a/ObjGit.h +++ b/ObjGit.h @@ -12,14 +12,17 @@ @interface ObjGit : NSObject { NSString* gitDirectory; + NSString* gitName; } -@property(assign, readwrite) NSString *gitDirectory; +@property(copy, readwrite) NSString *gitDirectory; +@property(copy, readwrite) NSString *gitName; - (BOOL) openRepo:(NSString *)dirPath; - (BOOL) ensureGitPath; - (void) initGitRepo; - (NSArray *) getAllRefs; +- (NSString *) getName; - (NSString *) writeObject:(NSData *)objectData withType:(NSString *)type withSize:(int)size; - (void) updateRef:(NSString *)refName toSha:(NSString *)toSha; diff --git a/ObjGit.m b/ObjGit.m index 36a343e..bc10489 100644 --- a/ObjGit.m +++ b/ObjGit.m @@ -14,6 +14,7 @@ @implementation ObjGit @synthesize gitDirectory; +@synthesize gitName; - (id) init { @@ -25,10 +26,17 @@ - (void) dealloc [super dealloc]; } +- (NSString *) getName +{ + NSLog(@"GIT NAME TEST"); + NSLog(@"GIT NAME:%@", self.gitName); + return self.gitName; +} + - (BOOL) ensureGitPath { BOOL isDir; NSFileManager *fm = [NSFileManager defaultManager]; - if ([fm fileExistsAtPath:gitDirectory isDirectory:&isDir] && isDir) { + if ([fm fileExistsAtPath:self.gitDirectory isDirectory:&isDir] && isDir) { return YES; } else { [self initGitRepo]; @@ -41,7 +49,7 @@ - (NSArray *) getAllRefs BOOL isDir=NO; NSMutableArray *refsFinal = [[NSMutableArray alloc] init]; NSString *tempRef, *thisSha; - NSString *refsPath = [gitDirectory stringByAppendingPathComponent:@"refs"]; + NSString *refsPath = [self.gitDirectory stringByAppendingPathComponent:@"refs"]; NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:refsPath isDirectory:&isDir] && isDir) { NSEnumerator *e = [[fileManager subpathsAtPath:refsPath] objectEnumerator]; @@ -64,32 +72,32 @@ - (NSArray *) getAllRefs - (void) updateRef:(NSString *)refName toSha:(NSString *)toSha { NSFileManager *fm = [NSFileManager defaultManager]; - NSString *refPath = [gitDirectory stringByAppendingPathComponent:refName]; + NSString *refPath = [self.gitDirectory stringByAppendingPathComponent:refName]; [fm createFileAtPath:refPath contents:[NSData dataWithBytes:[toSha UTF8String] length:[toSha length]] attributes:nil]; } - (void) initGitRepo { NSFileManager *fm = [NSFileManager defaultManager]; - [fm createDirectoryAtPath:gitDirectory attributes:nil]; + [fm createDirectoryAtPath:self.gitDirectory attributes:nil]; //NSLog(@"Dir Created: %@ %d", gitDirectory, [gitDirectory length]); NSString *config = @"[core]\n\trepositoryformatversion = 0\n\tfilemode = true\n\tbare = true\n\tlogallrefupdates = true\n"; - NSString *configFile = [gitDirectory stringByAppendingPathComponent:@"config"]; + NSString *configFile = [self.gitDirectory stringByAppendingPathComponent:@"config"]; [fm createFileAtPath:configFile contents:[NSData dataWithBytes:[config UTF8String] length:[config length]] attributes:nil]; NSString *head = @"ref: refs/heads/master\n"; - NSString *headFile = [gitDirectory stringByAppendingPathComponent:@"HEAD"]; + NSString *headFile = [self.gitDirectory stringByAppendingPathComponent:@"HEAD"]; [fm createFileAtPath:headFile contents:[NSData dataWithBytes:[head UTF8String] length:[head length]] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"refs"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"refs/heads"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"refs/tags"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"objects"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"objects/info"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"objects/pack"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"branches"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"hooks"] attributes:nil]; - [fm createDirectoryAtPath:[gitDirectory stringByAppendingPathComponent:@"info"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"refs"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"refs/heads"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"refs/tags"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"objects"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"objects/info"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"objects/pack"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"branches"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"hooks"] attributes:nil]; + [fm createDirectoryAtPath:[self.gitDirectory stringByAppendingPathComponent:@"info"] attributes:nil]; } - (NSString *) writeObject:(NSData *)objectData withType:(NSString *)type withSize:(int)size @@ -107,7 +115,7 @@ - (NSString *) writeObject:(NSData *)objectData withType:(NSString *)type withSi CC_SHA1([object bytes], [object length], rawsha); [ObjGit gitUnpackHex:rawsha fillSha:sha1]; - //NSLog(@"WRITING SHA: %s", sha1); + NSLog(@"WRITING SHA: %s", sha1); // write object to file shaStr = [NSString stringWithCString:sha1 encoding:NSASCIIStringEncoding]; @@ -119,7 +127,7 @@ - (NSString *) writeObject:(NSData *)objectData withType:(NSString *)type withSi - (BOOL) openRepo:(NSString *)dirPath { - gitDirectory = dirPath; + self.gitDirectory = dirPath; return YES; } @@ -154,7 +162,7 @@ - (NSMutableArray *) getCommitsFromSha:(NSString *)shaValue withLimit:(int)commi - (ObjGitObject *) getObjectFromSha:(NSString *)sha1 { NSString *objectPath = [self getLooseObjectPathBySha:sha1]; - // NSLog(@"READ FROM FILE: %@", objectPath); + NSLog(@"READ FROM FILE: %@", objectPath); NSFileHandle *fm = [NSFileHandle fileHandleForReadingAtPath:objectPath]; return [[ObjGitObject alloc] initFromRaw:[fm availableData] withSha:sha1]; } @@ -177,7 +185,7 @@ - (NSString *) getLooseObjectPathBySha: (NSString *)shaValue NSString *looseSubDir = [shaValue substringWithRange:NSMakeRange(0, 2)]; NSString *looseFileName = [shaValue substringWithRange:NSMakeRange(2, 38)]; - NSString *dir = [NSString stringWithFormat: @"%@/objects/%@", gitDirectory, looseSubDir]; + NSString *dir = [NSString stringWithFormat: @"%@/objects/%@", self.gitDirectory, looseSubDir]; BOOL isDir; NSFileManager *fm = [NSFileManager defaultManager]; @@ -186,7 +194,7 @@ - (NSString *) getLooseObjectPathBySha: (NSString *)shaValue } return [NSString stringWithFormat: @"%@/objects/%@/%@", \ - gitDirectory, looseSubDir, looseFileName]; + self.gitDirectory, looseSubDir, looseFileName]; } diff --git a/ObjGitCommit.h b/ObjGitCommit.h index 3a2850f..f1c324b 100644 --- a/ObjGitCommit.h +++ b/ObjGitCommit.h @@ -7,6 +7,7 @@ #import "ObjGitObject.h" @interface ObjGitCommit : NSObject { + NSString *sha; NSArray *parentShas; NSString *treeSha; NSString *author; @@ -19,14 +20,15 @@ ObjGitObject *git_object; } +@property(assign, readwrite) NSString *sha; @property(assign, readwrite) NSArray *parentShas; @property(assign, readwrite) NSString *treeSha; @property(assign, readwrite) NSString *author; @property(assign, readwrite) NSString *author_email; -@property(assign, readwrite) NSDate *authored_date; +@property(copy , readwrite) NSDate *authored_date; @property(assign, readwrite) NSString *committer; @property(assign, readwrite) NSString *committer_email; -@property(assign, readwrite) NSDate *committed_date; +@property(retain, readwrite) NSDate *committed_date; @property(assign, readwrite) NSString *message; @property(assign, readwrite) ObjGitObject *git_object; diff --git a/ObjGitCommit.m b/ObjGitCommit.m index 7cd26a8..d82e260 100644 --- a/ObjGitCommit.m +++ b/ObjGitCommit.m @@ -18,10 +18,12 @@ @implementation ObjGitCommit @synthesize committed_date; @synthesize message; @synthesize git_object; +@synthesize sha; - (id) initFromGitObject:(ObjGitObject *)gitObject { self = [super init]; - git_object = gitObject; + self.sha = [gitObject sha]; + self.git_object = gitObject; [self parseContent]; return self; } @@ -29,9 +31,10 @@ - (id) initFromGitObject:(ObjGitObject *)gitObject { - (id) initFromRaw:(NSData *)rawData withSha:(NSString *)shaValue { self = [super init]; - git_object = [[ObjGitObject alloc] initFromRaw:rawData withSha:shaValue]; + self.git_object = [[ObjGitObject alloc] initFromRaw:rawData withSha:shaValue]; + self.sha = shaValue; [self parseContent]; - // [self logObject]; + //[self logObject]; return self; } @@ -47,7 +50,7 @@ - (void) logObject - (void) parseContent { // extract parent shas, tree sha, author/committer info, message - NSArray *lines = [git_object.contents componentsSeparatedByString:@"\n"]; + NSArray *lines = [self.git_object.contents componentsSeparatedByString:@"\n"]; NSEnumerator *enumerator; NSMutableArray *parents; NSMutableString *buildMessage; @@ -68,27 +71,27 @@ - (void) parseContent key = [values objectAtIndex: 0]; val = [values objectAtIndex: 1]; if([key isEqualToString: @"tree"]) { - treeSha = val; + self.treeSha = val; } else if ([key isEqualToString: @"parent"]) { [parents addObject: val]; } else if ([key isEqualToString: @"author"]) { NSArray *name_email_date = [self parseAuthorString:line withType:@"author "]; - author = [name_email_date objectAtIndex: 0]; - author_email = [name_email_date objectAtIndex: 1]; - authored_date = [name_email_date objectAtIndex: 2]; + self.author = [name_email_date objectAtIndex: 0]; + self.author_email = [name_email_date objectAtIndex: 1]; + self.authored_date = [name_email_date objectAtIndex: 2]; } else if ([key isEqualToString: @"committer"]) { NSArray *name_email_date = [self parseAuthorString:line withType:@"committer "]; - committer = [name_email_date objectAtIndex: 0]; - committer_email = [name_email_date objectAtIndex: 1]; - committed_date = [name_email_date objectAtIndex: 2]; + self.committer = [name_email_date objectAtIndex: 0]; + self.committer_email = [name_email_date objectAtIndex: 1]; + self.committed_date = [name_email_date objectAtIndex: 2]; } } } else { [buildMessage appendString: line]; } } - message = buildMessage; - parentShas = parents; + self.message = buildMessage; + self.parentShas = parents; } - (NSArray *) parseAuthorString:(NSString *)authorString withType:(NSString *)typeString diff --git a/ObjGitObject.h b/ObjGitObject.h index bded0c8..f33f4ba 100644 --- a/ObjGitObject.h +++ b/ObjGitObject.h @@ -15,13 +15,13 @@ NSData* raw; } -@property(assign, readwrite) NSString *sha; +@property(copy, readwrite) NSString *sha; @property(assign, readwrite) NSInteger size; -@property(assign, readwrite) NSString *type; -@property(assign, readwrite) NSString *contents; +@property(copy, readwrite) NSString *type; +@property(copy, readwrite) NSString *contents; @property(assign, readwrite) char *rawContents; @property(assign, readwrite) int rawContentLen; -@property(assign, readwrite) NSData *raw; +@property(copy, readwrite) NSData *raw; - (id) initFromRaw:(NSData *)rawData withSha:(NSString *)shaValue; - (void) parseRaw; diff --git a/ObjGitServerHandler.h b/ObjGitServerHandler.h index 1599fcd..b457a34 100644 --- a/ObjGitServerHandler.h +++ b/ObjGitServerHandler.h @@ -56,7 +56,7 @@ - (void) unpackDeltified:(int)type size:(int)size; - (NSData *) patchDelta:(NSData *)deltaData withObject:(ObjGitObject *)gitObject; -- (NSArray *) patchDeltaHeaderSize:(NSData *)deltaData position:(int)position; +- (NSArray *) patchDeltaHeaderSize:(NSData *)deltaData position:(unsigned long)position; - (NSString *)readServerSha; - (int) readPackHeader; diff --git a/ObjGitServerHandler.m b/ObjGitServerHandler.m index ddc325e..1d57892 100644 --- a/ObjGitServerHandler.m +++ b/ObjGitServerHandler.m @@ -113,6 +113,7 @@ - (void) receiveNeeds - (void) uploadPackFile { + NSLog(@"upload pack file"); NSString *command, *shaValue; NSArray *thisRef; @@ -127,6 +128,7 @@ - (void) uploadPackFile } } + NSLog(@"gathering shas"); e = [needRefs objectEnumerator]; while ( (thisRef = [e nextObject]) ) { command = [thisRef objectAtIndex:0]; @@ -141,6 +143,7 @@ - (void) uploadPackFile - (void) sendPackData { + NSLog(@"send pack data"); NSString *current; NSEnumerator *e; @@ -226,7 +229,6 @@ - (void) longVal:(uint32_t)raw toByteBuffer:(uint8_t *)buffer - (void) gatherObjectShasFromCommit:(NSString *)shaValue { NSString *parentSha; - ObjGitCommit *commit = [[ObjGitCommit alloc] initFromGitObject:[gitRepo getObjectFromSha:shaValue]]; [refDict setObject:@"_commit" forKey:shaValue]; @@ -234,10 +236,10 @@ - (void) gatherObjectShasFromCommit:(NSString *)shaValue [self gatherObjectShasFromTree:[commit treeSha]]; NSArray *parents = [commit parentShas]; - [commit release]; NSEnumerator *e = [parents objectEnumerator]; while ( (parentSha = [e nextObject]) ) { + NSLog(@"parent sha:%@", parentSha); // TODO : check that refDict does not have this [self gatherObjectShasFromCommit:parentSha]; } @@ -415,7 +417,8 @@ - (void) unpackDeltified:(int)type size:(int)size { ObjGitObject *object; object = [gitRepo getObjectFromSha:sha1]; contents = [self patchDelta:objectData withObject:object]; - [gitRepo writeObject:contents withType:[self typeString:type] withSize:size]; + //NSLog(@"unpacked delta: %@ : %@", contents, [object type]); + [gitRepo writeObject:contents withType:[object type] withSize:[contents length]]; } else { // TODO : OBJECT ISN'T HERE YET, SAVE THIS DELTA FOR LATER // /* @@ -431,28 +434,31 @@ - (void) unpackDeltified:(int)type size:(int)size { - (NSData *) patchDelta:(NSData *)deltaData withObject:(ObjGitObject *)gitObject { - int sourceSize, destSize, position; - int cp_off, cp_size; + unsigned long sourceSize, destSize, position; + unsigned long cp_off, cp_size; unsigned char c[2], d[2]; int buffLength = 1000; NSMutableData *buffer = [[NSMutableData alloc] initWithCapacity:buffLength]; NSArray *sizePos = [self patchDeltaHeaderSize:deltaData position:0]; - sourceSize = [[sizePos objectAtIndex:0] intValue]; - position = [[sizePos objectAtIndex:1] intValue]; + sourceSize = [[sizePos objectAtIndex:0] longValue]; + position = [[sizePos objectAtIndex:1] longValue]; - sizePos = [self patchDeltaHeaderSize:deltaData position:position]; - destSize = [[sizePos objectAtIndex:0] intValue]; - position = [[sizePos objectAtIndex:1] intValue]; + //NSLog(@"SS: %d Pos:%d", sourceSize, position); - //NSLog(@"DS: %d Pos:%d", destSize, position); + sizePos = [self patchDeltaHeaderSize:deltaData position:position]; + destSize = [[sizePos objectAtIndex:0] longValue]; + position = [[sizePos objectAtIndex:1] longValue]; - NSData *source = [NSData dataWithBytes:[[gitObject contents] UTF8String] length:[gitObject size]]; + NSData *source = [NSData dataWithBytes:[gitObject rawContents] length:[gitObject rawContentLen]]; + + //NSLog(@"SOURCE:%@", source); NSMutableData *destination = [NSMutableData dataWithCapacity:destSize]; - while (position < ([deltaData length] - 1)) { + while (position < ([deltaData length])) { [deltaData getBytes:c range:NSMakeRange(position, 1)]; + //NSLog(@"DS: %d Pos:%d", destSize, position); //NSLog(@"CHR: %d", c[0]); position += 1; @@ -502,6 +508,7 @@ - (NSData *) patchDelta:(NSData *)deltaData withObject:(ObjGitObject *)gitObject [source getBytes:[buffer mutableBytes] range:NSMakeRange(cp_off, cp_size)]; [destination appendBytes:[buffer bytes] length:cp_size]; + //NSLog(@"dest: %@", destination); } else if(c[0] != 0) { //NSLog(@"thingy: %d, %d", position, c[0]); [source getBytes:[buffer mutableBytes] range:NSMakeRange(position, c[0])]; @@ -511,23 +518,24 @@ - (NSData *) patchDelta:(NSData *)deltaData withObject:(ObjGitObject *)gitObject NSLog(@"invalid delta data"); } } - return [NSData dataWithBytes:destination length:[destination length]]; + return destination; } -- (NSArray *) patchDeltaHeaderSize:(NSData *)deltaData position:(int)position +- (NSArray *) patchDeltaHeaderSize:(NSData *)deltaData position:(unsigned long)position { - int size = 0; + unsigned long size = 0; int shift = 0; unsigned char c[2]; do { [deltaData getBytes:c range:NSMakeRange(position, 1)]; + //NSLog(@"read bytes:%d %d", c[0], position); position += 1; size |= (c[0] & 0x7f) << shift; shift += 7; } while ( (c[0] & 0x80) != 0 ); - return [NSArray arrayWithObjects:[NSNumber numberWithInt:size], [NSNumber numberWithInt:position], nil]; + return [NSArray arrayWithObjects:[NSNumber numberWithLong:size], [NSNumber numberWithLong:position], nil]; } - (NSString *) readServerSha diff --git a/ObjGitTree.m b/ObjGitTree.m index 57d97f3..dea8214 100644 --- a/ObjGitTree.m +++ b/ObjGitTree.m @@ -13,7 +13,9 @@ @implementation ObjGitTree @synthesize gitObject; - (id) initFromGitObject:(ObjGitObject *)object { + NSLog(@"Tree init1"); self = [super init]; + NSLog(@"Tree init"); gitObject = object; [self parseContent]; return self;