@@ -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
231218int 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: >Error];
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
0 commit comments