Skip to content

Commit 5d9d113

Browse files
committed
Fix bug in - [PBGitRepository addRef:] with symbolic refs showing the wrong name
1 parent 2ee72c9 commit 5d9d113

File tree

5 files changed

+69
-79
lines changed

5 files changed

+69
-79
lines changed

Classes/git/PBGitCommit.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ - (NSString *)SVNRevision
115115
- (PBGitSHA *)sha
116116
{
117117
if (!self->_sha) {
118-
const git_oid *oid = git_commit_id(self.gtCommit.git_commit);
118+
const git_oid *oid = self.gtCommit.OID.git_oid;
119119
if (oid) {
120-
PBGitSHA *newSha = [PBGitSHA shaWithOID:*oid];
120+
PBGitSHA *newSha = [PBGitSHA shaWithOID:oid];
121121
self.sha = newSha;
122122
}
123123
}
@@ -210,12 +210,12 @@ - (BOOL) hasRef:(PBGitRef *)ref
210210

211211
- (NSMutableArray *)refs
212212
{
213-
return [[self.repository refs] objectForKey:self.sha];
213+
return self.repository.refs[self.sha];
214214
}
215215

216216
- (void) setRefs:(NSMutableArray *)refs
217217
{
218-
[[self.repository refs] setObject:refs forKey:self.sha];
218+
self.repository.refs[self.sha] = [NSMutableArray arrayWithArray:refs];
219219
}
220220

221221

Classes/git/PBGitRepository.m

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -189,43 +189,30 @@ - (PBGitWindowController *)windowController
189189

190190
- (void) addRef:(GTReference*)gtRef
191191
{
192-
while (gtRef && gtRef.referenceType == GTReferenceTypeSymbolic) {
193-
// GTReference *oldRef = gtRef;
194-
gtRef = gtRef.resolvedReference;
195-
// NSLog(@"Resolved reference %@ to %@", oldRef, gtRef);
196-
}
197-
if (gtRef == nil)
198-
{
199-
NSLog(@"Sneaky attempt to add nil GTReference");
192+
GTObject *refTarget = gtRef.resolvedTarget;
193+
if (![refTarget isKindOfClass:[GTObject class]]) {
194+
NSLog(@"Tried to add invalid ref %@ -> %@", gtRef, refTarget);
200195
return;
201196
}
202-
if (gtRef.referenceType != GTReferenceTypeOid) {
203-
NSLog(@"Can't addRef for %@ ref of unsupported type \"%u\"", gtRef.name, gtRef.referenceType);
197+
198+
PBGitSHA *sha = [PBGitSHA shaWithOID:refTarget.OID.git_oid];
199+
if (!sha) {
200+
NSLog(@"Couldn't determine sha for ref %@ -> %@", gtRef, refTarget);
204201
return;
205202
}
206203

207-
git_oid refOid = *gtRef.OID.git_oid;
208-
git_object* gitTarget = NULL;
209-
git_tag* gitTag = NULL;
210-
211-
PBGitSHA *sha = [PBGitSHA shaWithOID:refOid];
212-
if (git_tag_lookup(&gitTag, self.gtRepo.git_repository, gtRef.git_oid) == GIT_OK)
213-
{
214-
if (git_tag_peel(&gitTarget, gitTag) == GIT_OK)
215-
{
216-
GTObject* peeledObject = [GTObject objectWithObj:gitTarget inRepository:self.gtRepo];
217-
// NSLog(@"peeled sha:%@", peeledObject.sha);
218-
sha = [PBGitSHA shaWithString:peeledObject.SHA];
219-
}
220-
}
221-
222204
PBGitRef* ref = [[PBGitRef alloc] initWithString:gtRef.name];
223205
// NSLog(@"addRef %@ %@ at %@", ref.type, gtRef.name, [sha string]);
224-
NSMutableArray* curRefs;
225-
if ( (curRefs = [refs objectForKey:sha]) != nil )
206+
NSMutableArray* curRefs = refs[sha];
207+
if ( curRefs != nil ) {
208+
if ([curRefs containsObject:ref]) {
209+
NSLog(@"Duplicate ref shouldn't be added: %@", ref);
210+
return;
211+
}
226212
[curRefs addObject:ref];
227-
else
228-
[refs setObject:[NSMutableArray arrayWithObject:ref] forKey:sha];
213+
} else {
214+
refs[sha] = [NSMutableArray arrayWithObject:ref];
215+
}
229216
}
230217

231218
int addSubmoduleName(git_submodule *module, const char* name, void * context)
@@ -343,9 +330,10 @@ - (PBGitSHA *)shaForRef:(PBGitRef *)ref
343330
if (!ref)
344331
return nil;
345332

346-
for (PBGitSHA *sha in refs)
333+
for (PBGitSHA *sha in refs.allKeys)
347334
{
348-
for (PBGitRef *existingRef in [refs objectForKey:sha])
335+
NSMutableSet *refsForSha = [refs objectForKey:sha];
336+
for (PBGitRef *existingRef in refsForSha)
349337
{
350338
if ([existingRef isEqualToRef:ref])
351339
{
@@ -459,11 +447,12 @@ - (BOOL) checkRefFormat:(NSString *)refName
459447

460448
- (BOOL) refExists:(PBGitRef *)ref
461449
{
462-
int retValue = 1;
463-
NSString *output = [self outputInWorkdirForArguments:[NSArray arrayWithObjects:@"for-each-ref", [ref ref], nil] retValue:&retValue];
464-
if (retValue || [output isEqualToString:@""])
465-
return NO;
466-
return YES;
450+
NSError *gtError = nil;
451+
GTReference *gtRef = [GTReference referenceByLookingUpReferencedNamed:ref.ref inRepository:self.gtRepo error:&gtError];
452+
if (gtRef) {
453+
return YES;
454+
}
455+
return NO;
467456
}
468457

469458
// useful for getting the full ref for a user entered name
@@ -579,8 +568,9 @@ - (PBGitRef *) remoteRefForBranch:(PBGitRef *)branch error:(NSError **)error
579568
if (remoteName && ([remoteName isKindOfClass:[NSString class]] && ![remoteName isEqualToString:@""])) {
580569
PBGitRef *remoteRef = [PBGitRef refFromString:[kGitXRemoteRefPrefix stringByAppendingString:remoteName]];
581570
// check that the remote is a valid ref and exists
582-
if ([self checkRefFormat:[remoteRef ref]] && [self refExists:remoteRef])
571+
if ([self checkRefFormat:[remoteRef ref]] && [self refExists:remoteRef]) {
583572
return remoteRef;
573+
}
584574
}
585575
}
586576

Classes/git/PBGitSHA.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,15 @@
1010
#include <git2/oid.h>
1111

1212

13-
@interface PBGitSHA : NSObject <NSCopying> {
14-
git_oid oid;
15-
NSString *string;
16-
}
13+
@interface PBGitSHA : NSObject <NSCopying>
1714

18-
19-
+ (PBGitSHA *)shaWithOID:(git_oid)oid;
15+
+ (PBGitSHA *)shaWithOID:(git_oid const *)oid;
2016
+ (PBGitSHA *)shaWithString:(NSString *)shaString;
2117
+ (PBGitSHA *)shaWithCString:(const char *)shaCString;
2218

23-
- (BOOL)isEqualToOID:(git_oid)other_oid;
19+
- (BOOL)isEqualToOID:(git_oid const *)other_oid;
2420

25-
@property (readonly) git_oid oid;
26-
@property (readonly) NSString *string;
21+
@property (nonatomic, assign, readonly) git_oid oid;
22+
@property (nonatomic, strong, readonly) NSString *string;
2723

2824
@end

Classes/git/PBGitSHA.m

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,16 @@
1212

1313
@interface PBGitSHA ()
1414

15-
- (id)initWithOID:(git_oid)g_oid;
15+
@property (nonatomic, assign) git_oid oid;
16+
@property (nonatomic, strong) NSString *string;
1617

1718
@end
1819

1920

2021
@implementation PBGitSHA
2122

2223

23-
@synthesize oid;
24-
@synthesize string;
25-
26-
27-
+ (PBGitSHA *)shaWithOID:(git_oid)oid
24+
+ (PBGitSHA *)shaWithOID:(git_oid const *)oid
2825
{
2926
return [[PBGitSHA alloc] initWithOID:oid];
3027
}
@@ -34,10 +31,11 @@ + (PBGitSHA *)shaWithString:(NSString *)shaString
3431
{
3532
git_oid oid;
3633
int err = git_oid_fromstr(&oid, [shaString UTF8String]);
37-
if (err != GIT_OK)
34+
if (err != GIT_OK) {
3835
return nil;
36+
}
3937

40-
return [self shaWithOID:oid];
38+
return [self shaWithOID:&oid];
4139
}
4240

4341

@@ -48,7 +46,7 @@ + (PBGitSHA *)shaWithCString:(const char *)shaCString
4846
if (err != GIT_OK)
4947
return nil;
5048

51-
return [self shaWithOID:oid];
49+
return [self shaWithOID:&oid];
5250
}
5351

5452

@@ -68,29 +66,35 @@ + (BOOL)isKeyExcludedFromWebScript:(const char *)name
6866
#pragma mark -
6967
#pragma mark PBGitSHA
7068

71-
- (id)initWithOID:(git_oid)g_oid
69+
- (id)initWithOID:(git_oid const *)g_oid
7270
{
71+
if (!g_oid) {
72+
return nil;
73+
}
74+
7375
self = [super init];
74-
if (!self)
76+
if (!self) {
7577
return nil;
78+
}
7679

77-
oid = g_oid;
80+
_oid = *g_oid;
7881

7982
return self;
8083
}
8184

8285

8386
- (NSString *)string
8487
{
85-
if (!string) {
86-
const size_t buffer_size = GIT_OID_HEXSZ + 1;
87-
char hex[buffer_size] = {0};
88-
89-
const char* result = git_oid_tostr(hex, buffer_size, &oid);
90-
string = [NSString stringWithUTF8String:result];
88+
if (_string) {
89+
return _string;
9190
}
9291

93-
return string;
92+
const size_t buffer_size = GIT_OID_HEXSZ + 1;
93+
char hex[buffer_size] = {0};
94+
95+
const char* result = git_oid_tostr(hex, buffer_size, &_oid);
96+
_string = [NSString stringWithUTF8String:result];
97+
return _string;
9498
}
9599

96100

@@ -102,21 +106,23 @@ - (BOOL)isEqual:(id)otherSHA
102106
if (!otherSHA)
103107
return NO;
104108

105-
git_oid other_oid = ((PBGitSHA *)otherSHA)->oid;
106-
return git_oid_cmp(&oid, &other_oid) == 0;
109+
return git_oid_cmp(&_oid, &((PBGitSHA *)otherSHA)->_oid) == 0;
107110
}
108111

109112

110-
- (BOOL)isEqualToOID:(git_oid)other_oid
113+
- (BOOL)isEqualToOID:(git_oid const *)other_oid
111114
{
112-
return git_oid_cmp(&oid, &other_oid) == 0;
115+
if (!other_oid) {
116+
return nil;
117+
}
118+
return git_oid_cmp(&_oid, other_oid) == 0;
113119
}
114120

115121

116122
- (NSUInteger)hash
117123
{
118124
NSUInteger hash;
119-
memcpy(&hash, &(oid.id), sizeof(NSUInteger));
125+
memcpy(&hash, &(_oid.id), sizeof(NSUInteger));
120126

121127
return hash;
122128
}
@@ -133,9 +139,7 @@ - (NSString *)description
133139

134140
- (id)copyWithZone:(NSZone *)zone
135141
{
136-
git_oid oidCopy;
137-
git_oid_cpy(&oidCopy, &oid);
138-
PBGitSHA *copy = [[[self class] allocWithZone:zone] initWithOID:oidCopy];
142+
PBGitSHA *copy = [[[self class] allocWithZone:zone] initWithOID:&(self->_oid)];
139143

140144
return copy;
141145
}

GitX.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,8 @@
969969
4A5D768914A9A9CC00DF6C68 /* GitXRelativeDateFormatter.m */,
970970
4A5D768A14A9A9CC00DF6C68 /* GitXScriptingConstants.h */,
971971
4A5D768B14A9A9CC00DF6C68 /* main.m */,
972+
4A2125A217C0C78A00B5B582 /* NSColor+RGB.h */,
973+
4A2125A317C0C78A00B5B582 /* NSColor+RGB.m */,
972974
4A5D768C14A9A9CC00DF6C68 /* PBChangedFile.h */,
973975
4A5D768D14A9A9CC00DF6C68 /* PBChangedFile.m */,
974976
4A5D768E14A9A9CC00DF6C68 /* PBCLIProxy.h */,
@@ -988,8 +990,6 @@
988990
4A5D76A314A9A9CC00DF6C68 /* Terminal.h */,
989991
4A5D76A414A9A9CC00DF6C68 /* Util */,
990992
4A5D76B314A9A9CC00DF6C68 /* Views */,
991-
4A2125A217C0C78A00B5B582 /* NSColor+RGB.h */,
992-
4A2125A317C0C78A00B5B582 /* NSColor+RGB.m */,
993993
);
994994
path = Classes;
995995
sourceTree = "<group>";

0 commit comments

Comments
 (0)