diff --git a/Classes/Controllers/PBGitHistoryController.h b/Classes/Controllers/PBGitHistoryController.h index 4a0be5376..cb9417128 100644 --- a/Classes/Controllers/PBGitHistoryController.h +++ b/Classes/Controllers/PBGitHistoryController.h @@ -80,6 +80,9 @@ - (void)showCommitsFromTree:(id)sender; - (void)showInFinderAction:(id)sender; - (void)openFilesAction:(id)sender; +- (void) showConfigureGitxTicketUrl:(id)sender; +- (void) showTicketWithNumber:(NSString *)ticketNumber; +- (NSArray *)menuItemsForTicketLink:(NSString *)ticketNumber; // Repository Methods - (IBAction) createBranch:(id)sender; diff --git a/Classes/Controllers/PBGitHistoryController.m b/Classes/Controllers/PBGitHistoryController.m index c6a67ec01..cb34de4c4 100644 --- a/Classes/Controllers/PBGitHistoryController.m +++ b/Classes/Controllers/PBGitHistoryController.m @@ -25,6 +25,11 @@ #define QLPreviewPanel NSClassFromString(@"QLPreviewPanel") #import "PBQLTextView.h" #import "GLFileView.h" +#import "PBGitXConfigureTicketURLSheet.h" +#import +#import +#import + #define kHistorySelectedDetailIndexKey @"PBHistorySelectedDetailIndex" @@ -640,6 +645,95 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths return menuItems; } +- (void) showConfigureGitxTicketUrl:(id)sender +{ + [PBGitXConfigureTicketURLSheet beginConfigureTicketURLSheetForRepo:self.repository]; +} + +- (NSString *) ticketURLPattern +{ + NSError *error = nil; + GTConfiguration* config = [self.repository.gtRepo configurationWithError:&error]; + NSString * currentTicketURL = [config stringForKey:GITX_TICKET_URL_SETTING]; + if (currentTicketURL != nil) { + return currentTicketURL; + } + // not configured, but look if remote.origin is github and default to its issues + NSString * originURL = [config stringForKey:@"remote.origin.url"]; + if (originURL != nil) { + NSString *regexString = @"github.com/([^/]+/[^/]+)\\.git"; + NSRegularExpressionOptions options = NSRegularExpressionCaseInsensitive; + NSError *error = nil; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexString options:options error:&error]; + if (error) { + NSLog(@"%@", [error description]); + return nil; + } + NSTextCheckingResult *result = [regex firstMatchInString:originURL options:0 range:NSMakeRange(0, [originURL length])]; + if (result) { + NSString* githubRepository = [originURL substringWithRange:[result rangeAtIndex:1]]; + return [NSString stringWithFormat:@"https://github.com/%@/issues/{id}", githubRepository]; + } + } + return nil; +} + +- (NSURL *) assembleTicketUrlWithNumber:(NSString *)ticketNumber +{ + NSString * pattern = [self ticketURLPattern]; + if (pattern != nil) { + NSArray * parts = [pattern componentsSeparatedByString:@"{id}"]; + BOOL found = [parts count] > 1; + NSString * urlStr = [parts componentsJoinedByString:ticketNumber]; + if (!found) { + urlStr = [urlStr stringByAppendingString:ticketNumber]; + } + NSLog(@"urlStr: %@", urlStr); + return [NSURL URLWithString:urlStr]; + } + return nil; +} + +- (void) showTicketWithNumber:(NSString *)ticketNumber +{ + NSURL * url = [self assembleTicketUrlWithNumber:ticketNumber]; + NSLog(@"URL: %@", url); + if (url != nil) { + [[NSWorkspace sharedWorkspace] openURL:url]; + } + else { + [self showConfigureGitxTicketUrl:nil]; + } +} + +- (void) copyTicketUrl:(id)sender +{ + NSString *ticketNumber = [sender representedObject]; + NSURL * ticketURL = [self assembleTicketUrlWithNumber:ticketNumber]; + if (ticketURL != nil) { + [[NSPasteboard generalPasteboard] clearContents]; + [[NSPasteboard generalPasteboard] setString:[ticketURL description] forType:NSPasteboardTypeString]; + } +} + +- (NSArray *)menuItemsForTicketLink:(NSString *)ticketNumber; +{ + NSMutableArray *menuItems = [NSMutableArray array]; + + NSMenuItem *configureGitxTicketUrl = [[NSMenuItem alloc] initWithTitle:@"Configure Ticket/Issue URL..." + action:@selector(showConfigureGitxTicketUrl:) + keyEquivalent:@""]; + [menuItems addObject:configureGitxTicketUrl]; + if ([self ticketURLPattern] != nil) { + NSMenuItem *copyTicketUrl = [[NSMenuItem alloc] initWithTitle:@"Copy URL" + action:@selector(copyTicketUrl:) + keyEquivalent:@""]; + copyTicketUrl.representedObject = ticketNumber; + [menuItems addObject:copyTicketUrl]; + } + + return [NSArray arrayWithArray:menuItems]; +} #pragma mark NSSplitView delegate methods diff --git a/Classes/Controllers/PBWebHistoryController.m b/Classes/Controllers/PBWebHistoryController.m index ff366b64f..96f4431ad 100644 --- a/Classes/Controllers/PBWebHistoryController.m +++ b/Classes/Controllers/PBWebHistoryController.m @@ -148,7 +148,12 @@ - (NSArray *) webView:(WebView *)sender return [NSArray arrayWithObject:item]; return nil; } - + + if ([[node className] hasPrefix:@"ticket"]) { + NSString *ticketNumber = [[[[node childNodes] item:0] textContent] substringFromIndex:1]; + return [historyController menuItemsForTicketLink:ticketNumber]; + } + node = [node parentNode]; } @@ -162,7 +167,15 @@ - (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener { - [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + if ([[[request URL] scheme] isEqualToString:@"file"]) { + if ([[[request URL] fragment] hasPrefix:@"ticket:"]) { + NSString * ticketNumber = [[[request URL] fragment] substringFromIndex:7]; + [historyController showTicketWithNumber:ticketNumber]; + } + } + else { + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + } } - getConfig:(NSString *)key diff --git a/Classes/Views/PBGitXConfigureTicketURLSheet.h b/Classes/Views/PBGitXConfigureTicketURLSheet.h new file mode 100644 index 000000000..c1ac1b8b1 --- /dev/null +++ b/Classes/Views/PBGitXConfigureTicketURLSheet.h @@ -0,0 +1,30 @@ +// +// PBGitXConfigureTicketURLSheet.h +// GitX +// +// Created by Mathias Leppich on 7/11/13. +// Copyright 2013 Mathias Leppich. All rights reserved. +// + +#import + +#import "RJModalRepoSheet.h" + +#define GITX_TICKET_URL_SETTING @"gitx.ticketurl" + +@interface PBGitXConfigureTicketURLSheet : RJModalRepoSheet +{ + NSImageView *iconView; + NSTextField *ticketURLTextField; +} + ++ (void)beginConfigureTicketURLSheetForRepo:(PBGitRepository *)repo; + +- (void)beginConfigureTicketURLSheet; + +- (IBAction)closeMessageSheet:(id)sender; + +@property IBOutlet NSImageView *iconView; +@property IBOutlet NSTextField *ticketURLTextField; + +@end diff --git a/Classes/Views/PBGitXConfigureTicketURLSheet.m b/Classes/Views/PBGitXConfigureTicketURLSheet.m new file mode 100644 index 000000000..fd97b870a --- /dev/null +++ b/Classes/Views/PBGitXConfigureTicketURLSheet.m @@ -0,0 +1,98 @@ +// +// PBGitXConfigureTicketURLSheet.m +// GitX +// +// Created by Mathias Leppich on 7/11/13. +// Copyright 2013 Mathias Leppich. All rights reserved. +// + +#import "PBGitXConfigureTicketURLSheet.h" + +#import "PBGitRepository.h" +#import +#import + +@interface PBGitXConfigureTicketURLSheet () + +@end + +@implementation PBGitXConfigureTicketURLSheet + +@synthesize iconView, ticketURLTextField; + + +#pragma mark - +#pragma mark PBGitXConfigureTicketURLSheet + ++ (void)beginConfigureTicketURLSheetForRepo:(PBGitRepository *)repo +{ + PBGitXConfigureTicketURLSheet *sheet = [[self alloc] initWithWindowNibName:@"PBGitXConfigureTicketURLSheet" + forRepo:repo]; + [sheet beginConfigureTicketURLSheet]; +} + +- (id)initWithWindowNibName:(NSString *)windowNibName + forRepo:(PBGitRepository *)repo +{ + self = [super initWithWindowNibName:windowNibName forRepo:repo]; + if (!self) + return nil; + return self; +} + +- (IBAction)closeMessageSheet:(id)sender +{ + [self hide]; +} + +#pragma mark Private +- (void)beginConfigureTicketURLSheet { + [self window]; + + [self loadSettings]; + + [self show]; +} + +- (void)loadSettings { + NSError *error = nil; + GTConfiguration* config = [self.repository.gtRepo configurationWithError:&error]; + NSString * currentTicketURL = [config stringForKey:GITX_TICKET_URL_SETTING]; + if (currentTicketURL == nil) { + currentTicketURL = @""; + } + ticketURLTextField.stringValue = currentTicketURL; + NSLog(@"loadSettings: %@", currentTicketURL); +} + +- (void)persistSettings { + NSString * currentTicketURL = [ticketURLTextField stringValue]; + NSLog(@"persistSettings: %@", currentTicketURL); + NSError *error = nil; + GTConfiguration* config = [self.repository.gtRepo configurationWithError:&error]; + if ([currentTicketURL isEqualToString:@""]) { + [config deleteValueForKey:GITX_TICKET_URL_SETTING error:&error]; + } else { + [config setString:currentTicketURL forKey:GITX_TICKET_URL_SETTING]; + } +} + +- (void)show { + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(controlTextDidChange:) + name: NSControlTextDidChangeNotification + object: ticketURLTextField]; + [super show]; +} + +- (void)hide { + [[NSNotificationCenter defaultCenter] removeObserver: self]; + [super hide]; +} + +- (void)controlTextDidChange:(NSNotification *)obj { + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [self performSelector:@selector(persistSettings) withObject:self afterDelay:0.2]; +} + +@end diff --git a/GitX.xcodeproj/project.pbxproj b/GitX.xcodeproj/project.pbxproj index c6fcd3205..fa738e484 100644 --- a/GitX.xcodeproj/project.pbxproj +++ b/GitX.xcodeproj/project.pbxproj @@ -181,6 +181,8 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 911112370E5A097800BF76B4 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 911112360E5A097800BF76B4 /* Security.framework */; }; 913D5E500E55645900CECEA2 /* gitx in Resources */ = {isa = PBXBuildFile; fileRef = 913D5E490E55644600CECEA2 /* gitx */; }; + A2EA3604178ECB5300636291 /* PBGitXConfigureTicketURLSheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2EA3603178ECB5300636291 /* PBGitXConfigureTicketURLSheet.xib */; }; + A2EA3610178ED22A00636291 /* PBGitXConfigureTicketURLSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = A2EA360F178ED22A00636291 /* PBGitXConfigureTicketURLSheet.m */; }; BC0444AD17648CC900353E6D /* AddRemoteTemplate.png in Resources */ = {isa = PBXBuildFile; fileRef = BC0444AC17648CC900353E6D /* AddRemoteTemplate.png */; }; BC0444B817648D0200353E6D /* BranchHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = BC0444B717648D0200353E6D /* BranchHighlighted.png */; }; BC0444BA17648DA800353E6D /* FolderHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = BC0444B917648DA700353E6D /* FolderHighlighted.png */; }; @@ -644,6 +646,9 @@ 8D1107320486CEB800E47090 /* GitX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GitX.app; sourceTree = BUILT_PRODUCTS_DIR; }; 911112360E5A097800BF76B4 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; 913D5E490E55644600CECEA2 /* gitx */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gitx; sourceTree = BUILT_PRODUCTS_DIR; }; + A2EA3603178ECB5300636291 /* PBGitXConfigureTicketURLSheet.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PBGitXConfigureTicketURLSheet.xib; sourceTree = ""; }; + A2EA360E178ED22A00636291 /* PBGitXConfigureTicketURLSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBGitXConfigureTicketURLSheet.h; sourceTree = ""; }; + A2EA360F178ED22A00636291 /* PBGitXConfigureTicketURLSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBGitXConfigureTicketURLSheet.m; sourceTree = ""; }; BC0444AC17648CC900353E6D /* AddRemoteTemplate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AddRemoteTemplate.png; sourceTree = ""; }; BC0444B717648D0200353E6D /* BranchHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BranchHighlighted.png; sourceTree = ""; }; BC0444B917648DA700353E6D /* FolderHighlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FolderHighlighted.png; sourceTree = ""; }; @@ -935,6 +940,7 @@ 4A5D75BE14A9A90500DF6C68 /* PBGitHistoryView.xib */, 4A5D75BF14A9A90500DF6C68 /* PBGitSidebarView.xib */, 4A5D75C014A9A90500DF6C68 /* PBGitXMessageSheet.xib */, + A2EA3603178ECB5300636291 /* PBGitXConfigureTicketURLSheet.xib */, ); path = XIBs; sourceTree = ""; @@ -1176,6 +1182,8 @@ 4A5D777014A9AEB000DF6C68 /* PBSourceViewItems.h */, 4A5D777114A9AEB000DF6C68 /* PBSourceViewRemote.h */, 4A5D777214A9AEB000DF6C68 /* PBSourceViewRemote.m */, + A2EA360E178ED22A00636291 /* PBGitXConfigureTicketURLSheet.h */, + A2EA360F178ED22A00636291 /* PBGitXConfigureTicketURLSheet.m */, ); path = Views; sourceTree = ""; @@ -1499,6 +1507,7 @@ BC0444C617648EBE00353E6D /* TagHighlighted.png in Resources */, BC77578C176766B60048BB48 /* BranchTemplate@2x.png in Resources */, BC775797176766C60048BB48 /* RemoteBranchTemplate@2x.png in Resources */, + A2EA3604178ECB5300636291 /* PBGitXConfigureTicketURLSheet.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1642,6 +1651,7 @@ 643952741603E9BC00BB7AFF /* PBGitSubmodule.m in Sources */, 643952771603EF9B00BB7AFF /* PBGitSVSubmoduleItem.m in Sources */, 4AB057E31652652000DE751D /* GitRepoFinder.m in Sources */, + A2EA3610178ED22A00636291 /* PBGitXConfigureTicketURLSheet.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Resources/XIBs/PBGitXConfigureTicketURLSheet.xib b/Resources/XIBs/PBGitXConfigureTicketURLSheet.xib new file mode 100644 index 000000000..b2c9bdaa9 --- /dev/null +++ b/Resources/XIBs/PBGitXConfigureTicketURLSheet.xib @@ -0,0 +1,967 @@ + + + + 1080 + 12E55 + 3084 + 1187.39 + 626.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSImageCell + NSImageView + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + PBGitXConfigureTicketURLSheet + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{196, 331}, {540, 179}} + 544736256 + Window + NSWindow + + + + + 256 + + + + 289 + {{430, 18}, {96, 32}} + + + YES + + 67108864 + 134217728 + OK + + LucidaGrande + 13 + 1044 + + + -2038284288 + 129 + + DQ + 200 + 25 + + NO + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{20, 31}, {64, 128}} + + + + YES + + 134217728 + 33554432 + + NSImage + NSApplicationIcon + + 1 + 0 + 0 + NO + + NO + YES + + + + 268 + {{103, 142}, {420, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Configure Ticket/Issue URL + + LucidaGrande-Bold + 13 + 2072 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{103, 94}, {420, 40}} + + + + _NS:9 + {250, 750} + YES + + 67108864 + 272629760 + SXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIGdpdHgudGlja2V0dXJsIGdpdC1jb25maWcgc2V0dGluZy4K +Tm90ZSB0aGF0ICJ7aWR9IiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBudW1iZXIgb2YgIzEyMy4KA + + LucidaGrande + 13 + 16 + + _NS:9 + + + + + NO + YES + + + + 268 + {{103, 63}, {127, 17}} + + + _NS:1535 + YES + + 68157504 + 272630784 + gitx.ticketurl = + + Menlo-Regular + 12 + 16 + + _NS:1535 + + + + + NO + + + + 268 + {{225, 58}, {295, 22}} + + + _NS:9 + YES + + -1804599231 + 272630784 + + + e.g. http://example.org/issue/{id} + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + {540, 179} + + + + + {{0, 0}, {2560, 1578}} + {10000000000000, 10000000000000} + YES + + + + + + + iconView + + + + 171 + + + + closeMessageSheet: + + + + 172 + + + + window + + + + 174 + + + + ticketURLTextField + + + + 196 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 67 + + + + + + + + 68 + + + + + 4 + 0 + + 4 + 1 + + 25 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 58 + + 1000 + + 3 + 9 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + 69 + + + + + + 7 + 0 + + 0 + 1 + + 84 + + 1000 + + 3 + 9 + 1 + + + + + + 72 + + + + + + 7 + 0 + + 0 + 1 + + 64 + + 1000 + + 3 + 9 + 1 + + + + + + 73 + + + + + 78 + + + + + 80 + + + + + 92 + + + + + 93 + + + + + + 7 + 0 + + 0 + 1 + + 414 + + 1000 + + 3 + 9 + 1 + + + + + + 94 + + + + + 96 + + + + + 98 + + + + + + 8 + 0 + + 0 + 1 + + 40 + + 1000 + + 3 + 9 + 1 + + + + + + 99 + + + + + 100 + + + + + 101 + + + + + 106 + + + + + + 8 + 0 + + 0 + 1 + + 17 + + 1000 + + 3 + 9 + 1 + + + + + + 107 + + + + + 138 + + + + + 139 + + + + + 148 + + + + + 151 + + + + + 153 + + + + + 154 + + + + + 156 + + + + + 162 + + + + + 170 + + + + + 187 + + + + + 189 + + + + + + 7 + 0 + + 0 + 1 + + 295 + + 1000 + + 3 + 9 + 1 + + + + + + 190 + + + + + 191 + + + + + 192 + + + + + 193 + + + + + 195 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{663, 521}, {540, 179}} + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + 103 + 0 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 196 + + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + PBGitXConfigureTicketURLSheet + RJModalRepoSheet + + closeMessageSheet: + id + + + closeMessageSheet: + + closeMessageSheet: + id + + + + NSImageView + NSTextField + + + + iconView + NSImageView + + + ticketURLTextField + NSTextField + + + + IBProjectSource + ./Classes/PBGitXConfigureTicketURLSheet.h + + + + RJModalRepoSheet + NSWindowController + + IBProjectSource + ./Classes/RJModalRepoSheet.h + + + + + 0 + IBCocoaFramework + YES + 3 + + NSApplicationIcon + {128, 128} + + YES + + diff --git a/html/views/history/history.js b/html/views/history/history.js index fb0639e95..a18df52c0 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -288,6 +288,13 @@ var enableFeatures = function() enableFeature("gravatar", $("committer_gravatar").parentNode) } + +var formatTicketUrls = function (html) { + return html.replace(/#([0-9]+)/g, function(match,id) { + return ''+match+''; + }); +} + var loadCommitDetails = function(data) { commit.parseDetails(data); @@ -317,7 +324,7 @@ var loadCommitDetails = function(data) $("committerDate").parentNode.style.display = "none"; } - $("message").innerHTML = commit.message.replace(/\b(https?:\/\/[^\s<]*)/ig, "$1").replace(/\n/g,"
"); + $("message").innerHTML = formatTicketUrls(commit.message.replace(/\b(https?:\/\/[^\s<]*)/ig, "$1").replace(/\n/g,"
")); if (commit.diff.length < 200000) showDiff();