Skip to content

Commit 81a665f

Browse files
committed
Fix a crash when having HEAD detached
With HEAD detached, the parseSymbolicReference code would find an OID as an unresolvedTarget, which would result in a nil branchRef, thus a nil _headOID, and a subsequent crash when trying to add this nil OID to a set "somewhere". Simplify all that by just using whatever our underlying HEAD reference says.
1 parent 5e4d922 commit 81a665f

File tree

2 files changed

+14
-19
lines changed

2 files changed

+14
-19
lines changed

Classes/git/PBGitRepository.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ typedef enum branchFilterTypes {
124124
- (PBGitRevSpecifier*) addBranch: (PBGitRevSpecifier*) rev;
125125
- (BOOL)removeBranch:(PBGitRevSpecifier *)rev;
126126

127-
- (GTReference*) parseSymbolicReference:(NSString*) ref;
128127
- (BOOL) revisionExists:(NSString*) spec;
129128

130129
- (void) forceUpdateRevisions;

Classes/git/PBGitRepository.m

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,23 @@ - (void) lazyReload
273273

274274
- (PBGitRevSpecifier *)headRef
275275
{
276-
if (_headRef)
276+
if (_headRef && _headOID)
277277
return _headRef;
278278

279-
GTReference *branchRef = [self parseSymbolicReference: @"HEAD"];
280-
if (branchRef && [branchRef.name hasPrefix:@"refs/heads/"])
281-
_headRef = [[PBGitRevSpecifier alloc] initWithRef:[PBGitRef refFromString:branchRef.name]];
282-
else
283-
_headRef = [[PBGitRevSpecifier alloc] initWithRef:[PBGitRef refFromString:@"HEAD"]];
279+
NSError *error = nil;
280+
GTReference *headRef = [self.gtRepo headReferenceWithError:&error];
281+
if (!headRef) {
282+
PBLogError(error);
283+
return nil;
284+
}
284285

286+
GTReference *branchRef = [headRef resolvedReferenceWithError:&error];
287+
if (!branchRef) {
288+
PBLogError(error);
289+
return nil;
290+
}
291+
292+
_headRef = [[PBGitRevSpecifier alloc] initWithRef:[PBGitRef refFromString:branchRef.name]];
285293
_headOID = branchRef.OID;
286294

287295
return _headRef;
@@ -1108,16 +1116,4 @@ - (BOOL)revisionExists:(NSString *)spec
11081116
return [self.gtRepo lookUpObjectByRevParse:spec error:nil] != nil;
11091117
}
11101118

1111-
- (GTReference *)parseSymbolicReference:(NSString*) reference
1112-
{
1113-
GTReference *gtRef = [self.gtRepo lookUpReferenceWithName:reference error:nil];
1114-
if (!gtRef) return nil;
1115-
id target = gtRef.unresolvedTarget;
1116-
if ([target isKindOfClass:[GTReference class]]) {
1117-
NSString *ref = ((GTReference *)target).name;
1118-
if ([ref hasPrefix:@"refs/"]) return target;
1119-
}
1120-
return nil;
1121-
}
1122-
11231119
@end

0 commit comments

Comments
 (0)