Skip to content

Commit 1323638

Browse files
committed
Add/modify convenience methods in PBRevSpecifier
- NSCopying - change isEqualTo: to isEqual: so that it works well with NSArray's (containsObject: and removeObject: will use isEqual: instead of pointer equality) - add hash to go with isEqual: - pre-calculate the isSimpleRef value. The rangeOf... methods are very slow and have a major effect on the tight loop in reloadRefs.
1 parent a0b11cf commit 1323638

File tree

4 files changed

+65
-45
lines changed

4 files changed

+65
-45
lines changed

PBGitRepository.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ - (PBGitRevSpecifier*) addBranch:(PBGitRevSpecifier*)branch
397397

398398
// First check if the branch doesn't exist already
399399
for (PBGitRevSpecifier *rev in branches)
400-
if ([branch isEqualTo: rev])
400+
if ([branch isEqual: rev])
401401
return rev;
402402

403403
NSIndexSet *newIndex = [NSIndexSet indexSetWithIndex:[branches count]];
@@ -412,7 +412,7 @@ - (PBGitRevSpecifier*) addBranch:(PBGitRevSpecifier*)branch
412412
- (BOOL) removeBranch:(PBGitRevSpecifier *)branch
413413
{
414414
for (PBGitRevSpecifier *rev in branches) {
415-
if ([branch isEqualTo:rev]) {
415+
if ([branch isEqual:rev]) {
416416
NSIndexSet *oldIndex = [NSIndexSet indexSetWithIndex:[branches indexOfObject:rev]];
417417
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:oldIndex forKey:@"branches"];
418418

PBGitRevSpecifier.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@
99
#import <Cocoa/Cocoa.h>
1010
#import <PBGitRef.h>
1111

12-
@interface PBGitRevSpecifier : NSObject {
12+
@interface PBGitRevSpecifier : NSObject <NSCopying> {
1313
NSString *description;
1414
NSArray *parameters;
1515
NSURL *workingDirectory;
16+
BOOL isSimpleRef;
1617
}
1718

1819
- (id) initWithParameters:(NSArray*) params;
1920
- (id) initWithRef: (PBGitRef*) ref;
2021

21-
- (BOOL) isSimpleRef;
2222
- (NSString*) simpleRef;
2323
- (PBGitRef *) ref;
2424
- (BOOL) hasPathLimiter;
2525
- (BOOL) hasLeftRight;
2626
- (NSString *) title;
2727

28-
- (BOOL) isEqualTo: (PBGitRevSpecifier*) other;
28+
- (BOOL) isEqual: (PBGitRevSpecifier*) other;
2929
- (BOOL) isAllBranchesRev;
3030
- (BOOL) isLocalBranchesRev;
3131

@@ -35,5 +35,6 @@
3535
@property(retain) NSString *description;
3636
@property(readonly) NSArray *parameters;
3737
@property(retain) NSURL *workingDirectory;
38+
@property(readonly) BOOL isSimpleRef;
3839

3940
@end

PBGitRevSpecifier.m

+58-39
Original file line numberDiff line numberDiff line change
@@ -12,54 +12,56 @@
1212
@implementation PBGitRevSpecifier
1313

1414
@synthesize parameters, description, workingDirectory;
15+
@synthesize isSimpleRef;
1516

16-
- (id) initWithParameters:(NSArray*) params
17+
18+
// internal designated init
19+
- (id) initWithParameters:(NSArray *)params description:(NSString *)descrip
1720
{
1821
parameters = params;
19-
description = nil;
22+
description = descrip;
23+
24+
if (([parameters count] > 1) || ([parameters count] == 0))
25+
isSimpleRef = NO;
26+
else {
27+
NSString *param = [parameters objectAtIndex:0];
28+
if ([param hasPrefix:@"-"] ||
29+
[param rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"^@{}~:"]].location != NSNotFound ||
30+
[param rangeOfString:@".."].location != NSNotFound)
31+
isSimpleRef = NO;
32+
else
33+
isSimpleRef = YES;
34+
}
35+
2036
return self;
2137
}
2238

23-
- (id) initWithRef: (PBGitRef*) ref
39+
- (id) initWithParameters:(NSArray *)params
2440
{
25-
parameters = [NSArray arrayWithObject: ref.ref];
26-
description = ref.shortName;
41+
[self initWithParameters:params description:nil];
2742
return self;
2843
}
2944

30-
- (id) initWithCoder:(NSCoder *)coder
45+
- (id) initWithRef:(PBGitRef *)ref
3146
{
32-
parameters = [coder decodeObjectForKey:@"Parameters"];
33-
description = [coder decodeObjectForKey:@"Description"];
47+
[self initWithParameters:[NSArray arrayWithObject:ref.ref] description:ref.shortName];
3448
return self;
3549
}
3650

37-
+ (PBGitRevSpecifier *)allBranchesRevSpec
51+
- (id) initWithCoder:(NSCoder *)coder
3852
{
39-
id revspec = [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObject:@"--all"]];
40-
[revspec setDescription:@"All branches"];
41-
return revspec;
53+
[self initWithParameters:[coder decodeObjectForKey:@"Parameters"] description:[coder decodeObjectForKey:@"Description"]];
54+
return self;
4255
}
4356

44-
+ (PBGitRevSpecifier *)localBranchesRevSpec
57+
+ (PBGitRevSpecifier *)allBranchesRevSpec
4558
{
46-
id revspec = [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObject:@"--branches"]];
47-
[revspec setDescription:@"Local branches"];
48-
return revspec;
59+
return [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObject:@"--all"] description:@"All branches"];
4960
}
5061

51-
- (BOOL) isSimpleRef
62+
+ (PBGitRevSpecifier *)localBranchesRevSpec
5263
{
53-
if ([parameters count] > 1)
54-
return NO;
55-
56-
NSString *param = [parameters objectAtIndex:0];
57-
if ([param hasPrefix:@"-"] ||
58-
[param rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"^@{}~:"]].location != NSNotFound ||
59-
[param rangeOfString:@".."].location != NSNotFound)
60-
return NO;
61-
62-
return YES;
64+
return [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObject:@"--branches"] description:@"Local branches"];
6365
}
6466

6567
- (NSString*) simpleRef
@@ -77,12 +79,12 @@ - (PBGitRef *) ref
7779
return [PBGitRef refFromString:[self simpleRef]];
7880
}
7981

80-
- (NSString*) description
82+
- (NSString *) description
8183
{
82-
if (description)
83-
return description;
84-
85-
return [parameters componentsJoinedByString:@" "];
84+
if (!description)
85+
description = [parameters componentsJoinedByString:@" "];
86+
87+
return description;
8688
}
8789

8890
- (NSString *) title
@@ -122,32 +124,49 @@ - (BOOL) hasLeftRight
122124
return YES;
123125
return NO;
124126
}
125-
126-
- (BOOL) isEqualTo: (PBGitRevSpecifier*) other
127+
128+
- (BOOL) isEqual:(PBGitRevSpecifier *)other
127129
{
128130
if ([self isSimpleRef] ^ [other isSimpleRef])
129131
return NO;
130132

131133
if ([self isSimpleRef])
132-
return [[[self parameters] objectAtIndex: 0] isEqualToString: [other.parameters objectAtIndex: 0]];
134+
return [[[self parameters] objectAtIndex:0] isEqualToString:[other.parameters objectAtIndex:0]];
133135

134-
return ([[parameters componentsJoinedByString:@" "] isEqualToString: [other.parameters componentsJoinedByString:@" "]] &&
135-
(!description || [description isEqualToString:other.description]));
136+
return [self.description isEqualToString:other.description];
137+
}
138+
139+
- (NSUInteger) hash
140+
{
141+
if ([self isSimpleRef])
142+
return [[[self parameters] objectAtIndex:0] hash];
143+
144+
return [self.description hash];
136145
}
137146

138147
- (BOOL) isAllBranchesRev
139148
{
140-
return [self isEqualTo:[PBGitRevSpecifier allBranchesRevSpec]];
149+
return [self isEqual:[PBGitRevSpecifier allBranchesRevSpec]];
141150
}
142151

143152
- (BOOL) isLocalBranchesRev
144153
{
145-
return [self isEqualTo:[PBGitRevSpecifier localBranchesRevSpec]];
154+
return [self isEqual:[PBGitRevSpecifier localBranchesRevSpec]];
146155
}
147156

148157
- (void) encodeWithCoder:(NSCoder *)coder
149158
{
150159
[coder encodeObject:description forKey:@"Description"];
151160
[coder encodeObject:parameters forKey:@"Parameters"];
152161
}
162+
163+
- (id)copyWithZone:(NSZone *)zone
164+
{
165+
PBGitRevSpecifier *copy = [[[self class] allocWithZone:zone] initWithParameters:[self.parameters copy]];
166+
copy.description = [self.description copy];
167+
copy.workingDirectory = [self.workingDirectory copy];
168+
169+
return copy;
170+
}
171+
153172
@end

PBGitSidebarController.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ - (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item
200200

201201
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(PBSourceViewCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(PBSourceViewItem *)item
202202
{
203-
cell.isCheckedOut = [item.revSpecifier isEqualTo:[repository headRef]];
203+
cell.isCheckedOut = [item.revSpecifier isEqual:[repository headRef]];
204204

205205
[cell setImage:[item icon]];
206206
}

0 commit comments

Comments
 (0)