Add query component to scm URL

Previously when constructing a scm URL from a path, if scm was not enabled
we returned a file URL. This could result in some unexpected behavior.
For instance, when a directory was selected in the file browser,
activating "SCM Status" would just open the untracked directory.
This patch, insteads, adds a query to the scm URL that can be parsed to
determine how to handle the scm status request later on.
This commit is contained in:
Ronald Wampler
2013-11-24 21:43:27 -05:00
committed by Allan Odgaard
parent 888ccbed16
commit e5841fe34f

View File

@@ -78,7 +78,13 @@ _Iter prune_path_children (_Iter it, _Iter last)
std::string root = scm::root_for_path([aPath fileSystemRepresentation]); std::string root = scm::root_for_path([aPath fileSystemRepresentation]);
if(root != NULL_STR) if(root != NULL_STR)
return [NSURL URLWithString:[NSString stringWithCxxString:"scm://localhost" + encode::url_part(root, "/") + "/"]]; return [NSURL URLWithString:[NSString stringWithCxxString:"scm://localhost" + encode::url_part(root, "/") + "/"]];
return [NSURL fileURLWithPath:aPath]; return [NSURL URLWithString:[@"scm://locahost" stringByAppendingString:[aPath stringByAppendingString:@"?status=unversioned"]]];
}
+ (NSString*)parseSCMURLStatusQuery:(NSURL*)anURL
{
NSArray* query = [[anURL query] componentsSeparatedByString:@"="];
return [query lastObject] ?: @"all";
} }
- (NSArray*)repositoryStatus - (NSArray*)repositoryStatus
@@ -104,13 +110,13 @@ _Iter prune_path_children (_Iter it, _Iter last)
std::sort(unstagedPaths.begin(), unstagedPaths.end(), text::less_t()); std::sort(unstagedPaths.begin(), unstagedPaths.end(), text::less_t());
std::sort(untrackedPaths.begin(), untrackedPaths.end(), text::less_t()); std::sort(untrackedPaths.begin(), untrackedPaths.end(), text::less_t());
FSItem* unstagedItem = [FSItem itemWithURL:URLAppend(self.rootItem.url, @".unstaged/")]; FSItem* unstagedItem = [FSItem itemWithURL:URLAppend(self.rootItem.url, @"?status=unstaged")];
unstagedItem.icon = SCMFolderIcon(); unstagedItem.icon = SCMFolderIcon();
unstagedItem.name = @"Uncommitted Changes"; unstagedItem.name = @"Uncommitted Changes";
unstagedItem.group = YES; unstagedItem.group = YES;
unstagedItem.children = convert(unstagedPaths, scmInfo->root_path(), options); unstagedItem.children = convert(unstagedPaths, scmInfo->root_path(), options);
FSItem* untrackedItem = [FSItem itemWithURL:URLAppend(self.rootItem.url, @".untracked/")]; FSItem* untrackedItem = [FSItem itemWithURL:URLAppend(self.rootItem.url, @"?status=untracked")];
untrackedItem.icon = SCMFolderIcon(); untrackedItem.icon = SCMFolderIcon();
untrackedItem.name = @"Untracked Items"; untrackedItem.name = @"Untracked Items";
untrackedItem.group = YES; untrackedItem.group = YES;
@@ -134,9 +140,21 @@ _Iter prune_path_children (_Iter it, _Iter last)
options = someOptions; options = someOptions;
std::string const rootPath = [[anURL path] fileSystemRepresentation]; std::string const rootPath = [[anURL path] fileSystemRepresentation];
std::string name = path::display_name(rootPath);
NSString* status = [FSSCMDataSource parseSCMURLStatusQuery:anURL];
if([status isEqualToString:@"unversioned"])
{
self.rootItem = [FSItem itemWithURL:nil];
self.rootItem.icon = [NSImage imageNamed:NSImageNameFolderSmart];
self.rootItem.name = [NSString stringWithCxxString:text::format("%s (%s)", name.c_str(), "Unversioned")];
self.rootItem.children = nil;
return self;
}
if(scmInfo = scm::info(rootPath)) if(scmInfo = scm::info(rootPath))
{ {
std::string name = path::display_name(rootPath);
if(!scmInfo->dry()) if(!scmInfo->dry())
{ {
auto const& vars = scmInfo->scm_variables(); auto const& vars = scmInfo->scm_variables();
@@ -145,10 +163,27 @@ _Iter prune_path_children (_Iter it, _Iter last)
name = text::format("%s (%s)", path::display_name(scmInfo->root_path()).c_str(), branch->second.c_str()); name = text::format("%s (%s)", path::display_name(scmInfo->root_path()).c_str(), branch->second.c_str());
} }
self.rootItem = [FSItem itemWithURL:anURL]; if([status isEqualToString:@"all"])
self.rootItem.icon = [NSImage imageNamed:NSImageNameFolderSmart]; {
self.rootItem.name = [NSString stringWithCxxString:name]; self.rootItem = [FSItem itemWithURL:anURL];
self.rootItem.children = [self repositoryStatus]; self.rootItem.icon = [NSImage imageNamed:NSImageNameFolderSmart];
self.rootItem.name = [NSString stringWithCxxString:name];
self.rootItem.children = [self repositoryStatus];
}
else
{
name = path::display_name(rootPath);
for(FSItem* item in [self repositoryStatus])
{
if([[FSSCMDataSource parseSCMURLStatusQuery:item.url] isEqualToString:status])
{
self.rootItem = [FSItem itemWithURL:anURL];
self.rootItem.icon = [NSImage imageNamed:NSImageNameFolderSmart];
self.rootItem.name = [NSString stringWithFormat:@"%@ (%@)", [NSString stringWithCxxString:name], item.name];
self.rootItem.children = item.children;
}
}
}
__weak FSSCMDataSource* weakSelf = self; __weak FSSCMDataSource* weakSelf = self;
scmInfo->add_callback(^(scm::info_t const&){ scmInfo->add_callback(^(scm::info_t const&){
@@ -161,6 +196,6 @@ _Iter prune_path_children (_Iter it, _Iter last)
- (NSArray*)expandedURLs - (NSArray*)expandedURLs
{ {
return @[ URLAppend(self.rootItem.url, @".unstaged/"), URLAppend(self.rootItem.url, @".untracked/") ]; return @[ URLAppend(self.rootItem.url, @"?status=unstaged"), URLAppend(self.rootItem.url, @"?status=untracked") ];
} }
@end @end