3232#import " GTRemote.h"
3333#import " GTRepository.h"
3434#import " NSError+Git.h"
35+ #import " NSData+Git.h"
3536
3637#import " git2/branch.h"
3738#import " git2/errors.h"
@@ -65,30 +66,32 @@ + (NSString *)remoteNamePrefix {
6566 return @" refs/remotes/" ;
6667}
6768
68- + (instancetype )branchWithReference : (GTReference *)ref repository : (GTRepository *) repo {
69- return [[self alloc ] initWithReference: ref repository: repo ];
69+ + (instancetype )branchWithReference : (GTReference *)ref {
70+ return [[self alloc ] initWithReference: ref];
7071}
7172
7273- (instancetype )init {
7374 NSAssert (NO , @" Call to an unavailable initializer." );
7475 return nil ;
7576}
7677
77- - (instancetype )initWithReference : (GTReference *)ref repository : (GTRepository *) repo {
78+ - (instancetype )initWithReference : (GTReference *)ref {
7879 NSParameterAssert (ref != nil );
79- NSParameterAssert (repo != nil );
8080
8181 self = [super init ];
8282 if (self == nil ) return nil ;
8383
84- _repository = repo;
8584 _reference = ref;
8685
8786 return self;
8887}
8988
9089- (NSString *)name {
91- return self.reference .name ;
90+ const char *charName;
91+ int gitError = git_branch_name (&charName, self.reference .git_reference );
92+ if (gitError != GIT_OK || charName == NULL ) return nil ;
93+
94+ return @(charName);
9295}
9396
9497- (NSString *)shortName {
@@ -112,17 +115,12 @@ - (GTOID *)OID {
112115}
113116
114117- (NSString *)remoteName {
115- if (self.branchType == GTBranchTypeLocal) return nil ;
116-
117- const char *name;
118- int gitError = git_branch_name (&name, self.reference .git_reference );
118+ git_buf remote_name = GIT_BUF_INIT_CONST (0 , NULL );
119+ int gitError = git_branch_remote_name (&remote_name, self.repository .git_repository , self.reference .name .UTF8String );
119120 if (gitError != GIT_OK) return nil ;
120121
121- // Find out where the remote name ends.
122- const char *end = strchr (name, ' /' );
123- if (end == NULL || end == name) return nil ;
124-
125- return [[NSString alloc ] initWithBytes: name length: end - name encoding: NSUTF8StringEncoding];
122+ NSData *data = [NSData git_dataWithBuffer: &remote_name];
123+ return [[NSString alloc ] initWithData: data encoding: NSUTF8StringEncoding];
126124}
127125
128126- (GTCommit *)targetCommitWithError : (NSError **)error {
@@ -142,6 +140,10 @@ - (NSUInteger)numberOfCommitsWithError:(NSError **)error {
142140 return [enumerator countRemainingObjects: error];
143141}
144142
143+ - (GTRepository *)repository {
144+ return self.reference .repository ;
145+ }
146+
145147- (GTBranchType)branchType {
146148 if (self.reference .remote ) {
147149 return GTBranchTypeRemote;
@@ -150,6 +152,10 @@ - (GTBranchType)branchType {
150152 }
151153}
152154
155+ - (BOOL )isHEAD {
156+ return (git_branch_is_head (self.reference .git_reference ) ? YES : NO );
157+ }
158+
153159- (NSArray *)uniqueCommitsRelativeToBranch : (GTBranch *)otherBranch error : (NSError **)error {
154160 GTEnumerator *enumerator = [self .repository enumeratorForUniqueCommitsFromOID: self .OID relativeToOID: otherBranch.OID error: error];
155161 return [enumerator allObjectsWithError: error];
@@ -165,6 +171,19 @@ - (BOOL)deleteWithError:(NSError **)error {
165171 return YES ;
166172}
167173
174+ - (BOOL )rename : (NSString *)name force : (BOOL )force error : (NSError **)error {
175+ git_reference *git_ref;
176+ int gitError = git_branch_move (&git_ref, self.reference .git_reference , name.UTF8String , (force ? 1 : 0 ));
177+ if (gitError != GIT_OK) {
178+ if (error) *error = [NSError git_errorFor: gitError description: @" Rename branch failed" ];
179+ return NO ;
180+ }
181+
182+ _reference = [[GTReference alloc ] initWithGitReference: git_ref repository: self .repository];
183+
184+ return YES ;
185+ }
186+
168187- (GTBranch *)trackingBranchWithError : (NSError **)error success : (BOOL *)success {
169188 if (self.branchType == GTBranchTypeRemote) {
170189 if (success != NULL ) *success = YES ;
@@ -194,7 +213,7 @@ - (GTBranch *)trackingBranchWithError:(NSError **)error success:(BOOL *)success
194213
195214 if (success != NULL ) *success = YES ;
196215
197- return [[self class ] branchWithReference: [[GTReference alloc ] initWithGitReference: trackingRef repository: self .repository] repository: self .repository ];
216+ return [[self class ] branchWithReference: [[GTReference alloc ] initWithGitReference: trackingRef repository: self .repository]];
198217}
199218
200219- (BOOL )updateTrackingBranch : (GTBranch *)trackingBranch error : (NSError **)error {
@@ -216,7 +235,7 @@ - (GTBranch *)reloadedBranchWithError:(NSError **)error {
216235 GTReference *reloadedRef = [self .reference reloadedReferenceWithError: error];
217236 if (reloadedRef == nil ) return nil ;
218237
219- return [[self .class alloc ] initWithReference: reloadedRef repository: self .repository ];
238+ return [[self .class alloc ] initWithReference: reloadedRef];
220239}
221240
222241- (BOOL )calculateAhead : (size_t *)ahead behind : (size_t *)behind relativeTo : (GTBranch *)branch error : (NSError **)error {
0 commit comments