Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added two new objective c wrappers for libgit2 #435

Merged
merged 8 commits into from
Feb 17, 2015
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ObjectiveGit/GTDiffPatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@
/// Returns the raw size of the delta, in bytes.
- (NSUInteger)sizeWithContext:(BOOL)includeContext hunkHeaders:(BOOL)includeHunkHeaders fileHeaders:(BOOL)includeFileHeaders;

/// Returns the raw patch data.
- (NSData *)patchData;

/// Enumerate the hunks contained in the patch.
///
/// This enumeration is synchronous, and will block the calling thread while
Expand Down
10 changes: 10 additions & 0 deletions ObjectiveGit/GTDiffPatch.m
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ - (NSUInteger)sizeWithContext:(BOOL)includeContext hunkHeaders:(BOOL)includeHunk
return git_patch_size(self.git_patch, includeContext, includeHunkHeaders, includeFileHeaders);
}

- (NSData *)patchData {
git_buf buf = GIT_BUF_INIT_CONST(0, NULL);
git_patch_to_buf(&buf, self.git_patch);

NSData* buffer = [[NSData alloc] initWithBytes:buf.ptr length:buf.size];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could prevent a copying using -initWithBytesNoCopy:length:deallocator:, but that's 10.9+ and I don't think we're that high yet.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style: NSData *buffer

git_buf_free(&buf);

return buffer;
}

#pragma mark Hunks

- (BOOL)enumerateHunksUsingBlock:(void (^)(GTDiffHunk *hunk, BOOL *stop))block {
Expand Down
7 changes: 7 additions & 0 deletions ObjectiveGit/GTTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ typedef NS_ENUM(NSInteger, GTTreeEnumerationOptions) {
/// returns a GTTreeEntry or nil if there is nothing with the specified name
- (GTTreeEntry *)entryWithName:(NSString *)name;

/// Get a entry by path
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nitpick: a/an.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was actually a copy-paste error ;-) I'll fix the other occurrences as well.

///
/// path - the path of the entry relative to the repository root
///
/// returns a GTTreeEntry or nil if there is nothing with the specified path
- (GTTreeEntry *)entryWithPath:(NSString *)path error:(NSError **)error;

/// Enumerates the contents of the tree
///
/// options - One of `GTTreeEnumerationOptionPre` (for pre-order walks) or
Expand Down
21 changes: 16 additions & 5 deletions ObjectiveGit/GTTree.m
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,27 @@ - (NSUInteger)entryCount {
return (NSUInteger)git_tree_entrycount(self.git_tree);
}

- (GTTreeEntry *)createEntryWithEntry:(const git_tree_entry *)entry {
return (entry != NULL ? [GTTreeEntry entryWithEntry:entry parentTree:self] : nil);
- (GTTreeEntry *)createEntryWithCopyOfEntry:(const git_tree_entry *)entry {
return (entry != NULL ? [GTTreeEntry entryWithCopyOfEntry:entry parentTree:self error:nil] : nil);
}

- (GTTreeEntry *)entryAtIndex:(NSUInteger)index {
return [self createEntryWithEntry:git_tree_entry_byindex(self.git_tree, index)];
return [self createEntryWithCopyOfEntry:git_tree_entry_byindex(self.git_tree, index)];
}

- (GTTreeEntry *)entryWithName:(NSString *)name {
return [self createEntryWithEntry:git_tree_entry_byname(self.git_tree, name.UTF8String)];
return [self createEntryWithCopyOfEntry:git_tree_entry_byname(self.git_tree, name.UTF8String)];
}

- (GTTreeEntry *)entryWithPath:(NSString *)path error:(NSError **)error {
git_tree_entry *entry = NULL;
int gitError = git_tree_entry_bypath(&entry, self.git_tree, path.UTF8String);
if (error != GIT_OK) {
*error = [NSError git_errorFor:gitError description:@"Failed to get tree ntry %@", path];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If NULL is passed you'll crash.

return nil;
}

return [GTTreeEntry entryWithEntry:entry parentTree:self];
}

- (git_tree *)git_tree {
Expand All @@ -79,7 +90,7 @@ static int treewalk_cb(const char *root, const git_tree_entry *git_entry, void *
NSString *rootString = @(root);
GTTreeEntry *parentEntry = enumerationStruct->directoryStructure[rootString];
GTTree *parentTree = parentEntry != nil ? parentEntry.tree : enumerationStruct->myself;
GTTreeEntry *entry = [GTTreeEntry entryWithEntry:git_entry parentTree:parentTree];
GTTreeEntry *entry = [GTTreeEntry entryWithCopyOfEntry:git_entry parentTree:parentTree error:nil];

if (entry.type == GTObjectTypeTree) {
NSString *path = [rootString stringByAppendingPathComponent:entry.name];
Expand Down
4 changes: 2 additions & 2 deletions ObjectiveGit/GTTreeBuilder.m
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ - (GTTreeEntry *)entryWithFileName:(NSString *)fileName {
const git_tree_entry *entry = git_treebuilder_get(self.git_treebuilder, fileName.UTF8String);
if (entry == NULL) return nil;

return [GTTreeEntry entryWithEntry:entry parentTree:nil];
return [GTTreeEntry entryWithCopyOfEntry:entry parentTree:nil error:nil];
}

- (GTTreeEntry *)addEntryWithData:(NSData *)data fileName:(NSString *)fileName fileMode:(GTFileMode)fileMode error:(NSError **)error {
Expand Down Expand Up @@ -139,7 +139,7 @@ - (GTTreeEntry *)addEntryWithOID:(GTOID *)oid fileName:(NSString *)fileName file
return nil;
}

return [GTTreeEntry entryWithEntry:entry parentTree:nil];
return [GTTreeEntry entryWithCopyOfEntry:entry parentTree:nil error:nil];
}

- (BOOL)removeEntryWithFileName:(NSString *)fileName error:(NSError **)error {
Expand Down
7 changes: 4 additions & 3 deletions ObjectiveGit/GTTreeEntry.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@
@interface GTTreeEntry : NSObject

/// Initializer and convience methods.
- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent;
+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent;
- (instancetype)initWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent;
+ (instancetype)entryWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent;
+ (instancetype)entryWithCopyOfEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error;

/// The underlying `git_tree_entry`.
- (const git_tree_entry *)git_tree_entry __attribute__((objc_returns_inner_pointer));
- (git_tree_entry *)git_tree_entry __attribute__((objc_returns_inner_pointer));

/// The entry's parent tree. This may be nil if nil is passed in to -initWithEntry:
@property (nonatomic, strong, readonly) GTTree *tree;
Expand Down
23 changes: 20 additions & 3 deletions ObjectiveGit/GTTreeEntry.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
#import "git2/errors.h"

@interface GTTreeEntry ()
@property (nonatomic, assign, readonly) const git_tree_entry *git_tree_entry;
@property (nonatomic, assign, readonly) git_tree_entry *git_tree_entry;
@end

@implementation GTTreeEntry
Expand All @@ -64,9 +64,13 @@ - (BOOL)isEqualToEntry:(GTTreeEntry *)treeEntry {
return git_tree_entry_cmp(self.git_tree_entry, treeEntry.git_tree_entry) == 0 ? YES : NO;
}

- (void)dealloc {
git_tree_entry_free(_git_tree_entry);
}

#pragma mark API

- (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent {
- (instancetype)initWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent {
NSParameterAssert(theEntry != NULL);
if((self = [super init])) {
_git_tree_entry = theEntry;
Expand All @@ -75,10 +79,23 @@ - (instancetype)initWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTre
return self;
}

+ (instancetype)entryWithEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent {
+ (instancetype)entryWithEntry:(git_tree_entry *)theEntry parentTree:(GTTree *)parent {
return [[self alloc] initWithEntry:theEntry parentTree:parent];
}

+ (instancetype)entryWithCopyOfEntry:(const git_tree_entry *)theEntry parentTree:(GTTree *)parent error:(NSError **)error{
NSParameterAssert(theEntry != NULL);
git_tree_entry* copyOfEntry = nil;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style: git_tree_entry *copyOfEntry

int gitError = git_tree_entry_dup(&copyOfEntry, theEntry);
if (gitError != GIT_OK) {
if (error != NULL) {
*error = [NSError git_errorFor:gitError description:@"Failed to duplicate tree entry."];
}
return nil;
}
return [GTTreeEntry entryWithEntry:copyOfEntry parentTree:parent];
}

- (NSString *)name {
return @(git_tree_entry_name(self.git_tree_entry));
}
Expand Down
26 changes: 13 additions & 13 deletions ObjectiveGitFramework.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,13 @@
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
3D6123BD1A6432F6008F831A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0A330ED16027F1E00A616FA;
remoteInfo = libgit2;
};
6A28265A17C69D6300C6A948 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
Expand Down Expand Up @@ -346,13 +353,6 @@
remoteGlobalIDString = D0A330F216027F3600A616FA;
remoteInfo = "libgit2-iOS";
};
D0A330F716027F4900A616FA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D0A330ED16027F1E00A616FA;
remoteInfo = libgit2;
};
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
Expand Down Expand Up @@ -1094,7 +1094,7 @@
buildRules = (
);
dependencies = (
D0A330F816027F4900A616FA /* PBXTargetDependency */,
3D6123BE1A6432F6008F831A /* PBXTargetDependency */,
);
name = "ObjectiveGit-Mac";
productInstallPath = "$(HOME)/Library/Frameworks";
Expand Down Expand Up @@ -1396,6 +1396,11 @@
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
3D6123BE1A6432F6008F831A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0A330ED16027F1E00A616FA /* libgit2 */;
targetProxy = 3D6123BD1A6432F6008F831A /* PBXContainerItemProxy */;
};
6A28265B17C69D6300C6A948 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6A28265217C69CB400C6A948 /* OpenSSL-iOS */;
Expand All @@ -1421,11 +1426,6 @@
target = D0A330F216027F3600A616FA /* libgit2-iOS */;
targetProxy = D019779619F8335100F523DA /* PBXContainerItemProxy */;
};
D0A330F816027F4900A616FA /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D0A330ED16027F1E00A616FA /* libgit2 */;
targetProxy = D0A330F716027F4900A616FA /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
Expand Down