32
32
#import " GTRemote.h"
33
33
#import " GTRepository.h"
34
34
#import " NSError+Git.h"
35
+ #import " NSData+Git.h"
35
36
36
37
#import " git2/branch.h"
37
38
#import " git2/errors.h"
@@ -65,30 +66,32 @@ + (NSString *)remoteNamePrefix {
65
66
return @" refs/remotes/" ;
66
67
}
67
68
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];
70
71
}
71
72
72
73
- (instancetype )init {
73
74
NSAssert (NO , @" Call to an unavailable initializer." );
74
75
return nil ;
75
76
}
76
77
77
- - (instancetype )initWithReference : (GTReference *)ref repository : (GTRepository *) repo {
78
+ - (instancetype )initWithReference : (GTReference *)ref {
78
79
NSParameterAssert (ref != nil );
79
- NSParameterAssert (repo != nil );
80
80
81
81
self = [super init ];
82
82
if (self == nil ) return nil ;
83
83
84
- _repository = repo;
85
84
_reference = ref;
86
85
87
86
return self;
88
87
}
89
88
90
89
- (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);
92
95
}
93
96
94
97
- (NSString *)shortName {
@@ -112,17 +115,12 @@ - (GTOID *)OID {
112
115
}
113
116
114
117
- (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 );
119
120
if (gitError != GIT_OK) return nil ;
120
121
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];
126
124
}
127
125
128
126
- (GTCommit *)targetCommitWithError : (NSError **)error {
@@ -142,6 +140,10 @@ - (NSUInteger)numberOfCommitsWithError:(NSError **)error {
142
140
return [enumerator countRemainingObjects: error];
143
141
}
144
142
143
+ - (GTRepository *)repository {
144
+ return self.reference .repository ;
145
+ }
146
+
145
147
- (GTBranchType)branchType {
146
148
if (self.reference .remote ) {
147
149
return GTBranchTypeRemote;
@@ -150,6 +152,10 @@ - (GTBranchType)branchType {
150
152
}
151
153
}
152
154
155
+ - (BOOL )isHEAD {
156
+ return (git_branch_is_head (self.reference .git_reference ) ? YES : NO );
157
+ }
158
+
153
159
- (NSArray *)uniqueCommitsRelativeToBranch : (GTBranch *)otherBranch error : (NSError **)error {
154
160
GTEnumerator *enumerator = [self .repository enumeratorForUniqueCommitsFromOID: self .OID relativeToOID: otherBranch.OID error: error];
155
161
return [enumerator allObjectsWithError: error];
@@ -165,6 +171,19 @@ - (BOOL)deleteWithError:(NSError **)error {
165
171
return YES ;
166
172
}
167
173
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
+
168
187
- (GTBranch *)trackingBranchWithError : (NSError **)error success : (BOOL *)success {
169
188
if (self.branchType == GTBranchTypeRemote) {
170
189
if (success != NULL ) *success = YES ;
@@ -194,7 +213,7 @@ - (GTBranch *)trackingBranchWithError:(NSError **)error success:(BOOL *)success
194
213
195
214
if (success != NULL ) *success = YES ;
196
215
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]];
198
217
}
199
218
200
219
- (BOOL )updateTrackingBranch : (GTBranch *)trackingBranch error : (NSError **)error {
@@ -216,7 +235,7 @@ - (GTBranch *)reloadedBranchWithError:(NSError **)error {
216
235
GTReference *reloadedRef = [self .reference reloadedReferenceWithError: error];
217
236
if (reloadedRef == nil ) return nil ;
218
237
219
- return [[self .class alloc ] initWithReference: reloadedRef repository: self .repository ];
238
+ return [[self .class alloc ] initWithReference: reloadedRef];
220
239
}
221
240
222
241
- (BOOL )calculateAhead : (size_t *)ahead behind : (size_t *)behind relativeTo : (GTBranch *)branch error : (NSError **)error {
0 commit comments