From 4a66b929448e58a4a4603e01456686f177bdc672 Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Fri, 5 Jul 2013 23:23:58 +0200 Subject: [PATCH 1/6] replace ticket numbers with links via .git/config configurable gitx.ticketurl ``` [gitx] ticketurl = "http://example.org/ticket/*" ``` --- html/views/history/history.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/html/views/history/history.js b/html/views/history/history.js index fb0639e95..38e1a7cbe 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -288,6 +288,21 @@ var enableFeatures = function() enableFeature("gravatar", $("committer_gravatar").parentNode) } +/* +Just add gitx.ticketurl to your repositories .git/config + +[gitx] + ticketurl = "http://trac.domain.com/ticket/*" + +*/ +var formatTicketUrls = function (html) { + var ticketUrl = Controller.getConfig_("gitx.ticketurl"); + if (ticketUrl) { + return html.replace(/#([0-9]+)/g,'#$1'); + } + return html; +} + var loadCommitDetails = function(data) { commit.parseDetails(data); @@ -317,7 +332,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(); From 86c52605e6e988d3c38e09f4786d33534385801e Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Mon, 8 Jul 2013 09:56:36 +0200 Subject: [PATCH 2/6] change pattern matching to: replace `{id}` or just append --- html/views/history/history.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/html/views/history/history.js b/html/views/history/history.js index 38e1a7cbe..850aacfb3 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -296,11 +296,19 @@ Just add gitx.ticketurl to your repositories .git/config */ var formatTicketUrls = function (html) { - var ticketUrl = Controller.getConfig_("gitx.ticketurl"); - if (ticketUrl) { - return html.replace(/#([0-9]+)/g,'#$1'); } - return html; + if (ticketUrl) { + var applyTicketUrl = ticketUrl.indexOf("{id}") >= 0 ? function (id) { + return ticketUrl.replace(/\{id\}/g,id); + } : function (id) { + return ticketUrl+""+id; + }; + var replaceTicketLinks = function(match,id) { + return ''+match+''; + }; + return html.replace(/#([0-9]+)/g, replaceTicketLinks); + } + return html; } var loadCommitDetails = function(data) From 8905138e42df29217c422fda14b41182aa082567 Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Mon, 8 Jul 2013 09:57:30 +0200 Subject: [PATCH 3/6] auto detect GitHub `remote.origin` as a fallback --- html/views/history/history.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/html/views/history/history.js b/html/views/history/history.js index 850aacfb3..f6fb78c44 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -296,6 +296,13 @@ Just add gitx.ticketurl to your repositories .git/config */ var formatTicketUrls = function (html) { + var ticketUrl = Controller.getConfig_("gitx.ticketurl"); + if (!ticketUrl) { + var origin = Controller.getConfig_("remote.origin.url"); + var matches = origin && origin.match(/github.com\/([^\/]+\/[^\/]+)\.git$/); + if (matches) { + ticketUrl = "https://github.com/"+matches[1]+"/issues/"; + } } if (ticketUrl) { var applyTicketUrl = ticketUrl.indexOf("{id}") >= 0 ? function (id) { From f3b2e431d60b1409d97d27567bc4d6a354359105 Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Mon, 8 Jul 2013 10:52:17 +0200 Subject: [PATCH 4/6] update gitx.ticketurl scheme in comment --- html/views/history/history.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/views/history/history.js b/html/views/history/history.js index f6fb78c44..133eed286 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -292,7 +292,7 @@ var enableFeatures = function() Just add gitx.ticketurl to your repositories .git/config [gitx] - ticketurl = "http://trac.domain.com/ticket/*" + ticketurl = "http://trac.domain.com/ticket/{id}" */ var formatTicketUrls = function (html) { From 6df36aea890db68effc959937a9580580dfae4c0 Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Mon, 8 Jul 2013 10:55:07 +0200 Subject: [PATCH 5/6] always make `#123` links and show a 'Configure URL' context menu which shows a help message on how to configure gitx.ticketurl. --- Classes/Controllers/PBGitHistoryController.h | 2 ++ Classes/Controllers/PBGitHistoryController.m | 17 ++++++++++++ Classes/Controllers/PBWebHistoryController.m | 15 +++++++++-- html/views/history/history.js | 27 ++++++++++---------- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/Classes/Controllers/PBGitHistoryController.h b/Classes/Controllers/PBGitHistoryController.h index 4a0be5376..cb33d528c 100644 --- a/Classes/Controllers/PBGitHistoryController.h +++ b/Classes/Controllers/PBGitHistoryController.h @@ -80,6 +80,8 @@ - (void)showCommitsFromTree:(id)sender; - (void)showInFinderAction:(id)sender; - (void)openFilesAction:(id)sender; +- (void) showConfigureGitxTicketUrl:(id)sender; +- (NSArray *)menuItemsForTicketLink; // Repository Methods - (IBAction) createBranch:(id)sender; diff --git a/Classes/Controllers/PBGitHistoryController.m b/Classes/Controllers/PBGitHistoryController.m index c6a67ec01..a04af1c14 100644 --- a/Classes/Controllers/PBGitHistoryController.m +++ b/Classes/Controllers/PBGitHistoryController.m @@ -640,6 +640,23 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths return menuItems; } +- (void) showConfigureGitxTicketUrl:(id)sender +{ + NSString *message = @"Configure Ticket/Issue URL:"; + NSString *info = @"It can be configured via gitx.ticketurl git-config setting.\n\n" + "$ git config gitx.ticketurl 'http://example.org/issues/{id}'\n\n"; + [self.repository.windowController showMessageSheet:message infoText:info]; +} + +- (NSArray *)menuItemsForTicketLink +{ + NSMenuItem *configureGitxTicketUrl = [[NSMenuItem alloc] initWithTitle:@"Configure URL..." + action:@selector(showConfigureGitxTicketUrl:) + keyEquivalent:@""]; + + NSArray *menuItems = [NSArray arrayWithObjects:configureGitxTicketUrl, nil]; + return menuItems; +} #pragma mark NSSplitView delegate methods diff --git a/Classes/Controllers/PBWebHistoryController.m b/Classes/Controllers/PBWebHistoryController.m index ff366b64f..f08985ef4 100644 --- a/Classes/Controllers/PBWebHistoryController.m +++ b/Classes/Controllers/PBWebHistoryController.m @@ -148,7 +148,11 @@ - (NSArray *) webView:(WebView *)sender return [NSArray arrayWithObject:item]; return nil; } - + + if ([[node className] hasPrefix:@"ticket"]) { + return [historyController menuItemsForTicketLink]; + } + node = [node parentNode]; } @@ -162,7 +166,14 @@ - (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] isEqualToString:@"configure-ticketurl"]) { + [historyController showConfigureGitxTicketUrl:nil]; + } + } + else { + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + } } - getConfig:(NSString *)key diff --git a/html/views/history/history.js b/html/views/history/history.js index 133eed286..52e5ebd6b 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -296,26 +296,25 @@ Just add gitx.ticketurl to your repositories .git/config */ var formatTicketUrls = function (html) { - var ticketUrl = Controller.getConfig_("gitx.ticketurl"); + var ticketUrl = Controller.getConfig_("gitx.ticketurl"); if (!ticketUrl) { - var origin = Controller.getConfig_("remote.origin.url"); + var origin = Controller.getConfig_("remote.origin.url"); var matches = origin && origin.match(/github.com\/([^\/]+\/[^\/]+)\.git$/); if (matches) { ticketUrl = "https://github.com/"+matches[1]+"/issues/"; } } - if (ticketUrl) { - var applyTicketUrl = ticketUrl.indexOf("{id}") >= 0 ? function (id) { - return ticketUrl.replace(/\{id\}/g,id); - } : function (id) { - return ticketUrl+""+id; - }; - var replaceTicketLinks = function(match,id) { - return ''+match+''; - }; - return html.replace(/#([0-9]+)/g, replaceTicketLinks); - } - return html; + var applyTicketUrl = (!ticketUrl) ? function (id) { + return '#configure-ticketurl'; + } : (ticketUrl.indexOf("{id}") >= 0 ? function (id) { + return ticketUrl.replace(/\{id\}/g,id); + } : function (id) { + return ticketUrl+""+id; + }); + var replaceTicketLinks = function(match,id) { + return ''+match+''; + }; + return html.replace(/#([0-9]+)/g, replaceTicketLinks); } var loadCommitDetails = function(data) From 6336b174f4f246286646f3439108c5125a2b3e07 Mon Sep 17 00:00:00 2001 From: Mathias Leppich Date: Wed, 10 Jul 2013 22:21:12 +0200 Subject: [PATCH 6/6] implemented TicketURL configuration sheet. and.. - moved logic away from javascript - added a "Copy URL" context menu item --- Classes/Controllers/PBGitHistoryController.h | 3 +- Classes/Controllers/PBGitHistoryController.m | 93 +- Classes/Controllers/PBWebHistoryController.m | 8 +- Classes/Views/PBGitXConfigureTicketURLSheet.h | 30 + Classes/Views/PBGitXConfigureTicketURLSheet.m | 98 ++ GitX.xcodeproj/project.pbxproj | 10 + .../XIBs/PBGitXConfigureTicketURLSheet.xib | 967 ++++++++++++++++++ html/views/history/history.js | 26 +- 8 files changed, 1199 insertions(+), 36 deletions(-) create mode 100644 Classes/Views/PBGitXConfigureTicketURLSheet.h create mode 100644 Classes/Views/PBGitXConfigureTicketURLSheet.m create mode 100644 Resources/XIBs/PBGitXConfigureTicketURLSheet.xib diff --git a/Classes/Controllers/PBGitHistoryController.h b/Classes/Controllers/PBGitHistoryController.h index cb33d528c..cb9417128 100644 --- a/Classes/Controllers/PBGitHistoryController.h +++ b/Classes/Controllers/PBGitHistoryController.h @@ -81,7 +81,8 @@ - (void)showInFinderAction:(id)sender; - (void)openFilesAction:(id)sender; - (void) showConfigureGitxTicketUrl:(id)sender; -- (NSArray *)menuItemsForTicketLink; +- (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 a04af1c14..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" @@ -642,20 +647,92 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths - (void) showConfigureGitxTicketUrl:(id)sender { - NSString *message = @"Configure Ticket/Issue URL:"; - NSString *info = @"It can be configured via gitx.ticketurl git-config setting.\n\n" - "$ git config gitx.ticketurl 'http://example.org/issues/{id}'\n\n"; - [self.repository.windowController showMessageSheet:message infoText:info]; + [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 +- (NSArray *)menuItemsForTicketLink:(NSString *)ticketNumber; { - NSMenuItem *configureGitxTicketUrl = [[NSMenuItem alloc] initWithTitle:@"Configure URL..." + 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]; + } - NSArray *menuItems = [NSArray arrayWithObjects:configureGitxTicketUrl, nil]; - return menuItems; + return [NSArray arrayWithArray:menuItems]; } #pragma mark NSSplitView delegate methods diff --git a/Classes/Controllers/PBWebHistoryController.m b/Classes/Controllers/PBWebHistoryController.m index f08985ef4..96f4431ad 100644 --- a/Classes/Controllers/PBWebHistoryController.m +++ b/Classes/Controllers/PBWebHistoryController.m @@ -150,7 +150,8 @@ - (NSArray *) webView:(WebView *)sender } if ([[node className] hasPrefix:@"ticket"]) { - return [historyController menuItemsForTicketLink]; + NSString *ticketNumber = [[[[node childNodes] item:0] textContent] substringFromIndex:1]; + return [historyController menuItemsForTicketLink:ticketNumber]; } node = [node parentNode]; @@ -167,8 +168,9 @@ - (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary decisionListener:(id < WebPolicyDecisionListener >)listener { if ([[[request URL] scheme] isEqualToString:@"file"]) { - if ([[[request URL] fragment] isEqualToString:@"configure-ticketurl"]) { - [historyController showConfigureGitxTicketUrl:nil]; + if ([[[request URL] fragment] hasPrefix:@"ticket:"]) { + NSString * ticketNumber = [[[request URL] fragment] substringFromIndex:7]; + [historyController showTicketWithNumber:ticketNumber]; } } else { 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 52e5ebd6b..a18df52c0 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -288,33 +288,11 @@ var enableFeatures = function() enableFeature("gravatar", $("committer_gravatar").parentNode) } -/* -Just add gitx.ticketurl to your repositories .git/config - -[gitx] - ticketurl = "http://trac.domain.com/ticket/{id}" -*/ var formatTicketUrls = function (html) { - var ticketUrl = Controller.getConfig_("gitx.ticketurl"); - if (!ticketUrl) { - var origin = Controller.getConfig_("remote.origin.url"); - var matches = origin && origin.match(/github.com\/([^\/]+\/[^\/]+)\.git$/); - if (matches) { - ticketUrl = "https://github.com/"+matches[1]+"/issues/"; - } - } - var applyTicketUrl = (!ticketUrl) ? function (id) { - return '#configure-ticketurl'; - } : (ticketUrl.indexOf("{id}") >= 0 ? function (id) { - return ticketUrl.replace(/\{id\}/g,id); - } : function (id) { - return ticketUrl+""+id; + return html.replace(/#([0-9]+)/g, function(match,id) { + return ''+match+''; }); - var replaceTicketLinks = function(match,id) { - return ''+match+''; - }; - return html.replace(/#([0-9]+)/g, replaceTicketLinks); } var loadCommitDetails = function(data)