mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
Handle open\close document events with git URI prefix (#254)
This commit is contained in:
committed by
Kevin Cunnane
parent
e920c9212b
commit
fdca9fa220
@@ -48,6 +48,23 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace
|
|||||||
|
|
||||||
#region Public Methods
|
#region Public Methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if a given URI is contained in a workspace
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath"></param>
|
||||||
|
/// <returns>Flag indicating if the file is tracked in workspace</returns>
|
||||||
|
public bool ContainsFile(string filePath)
|
||||||
|
{
|
||||||
|
Validate.IsNotNullOrWhitespaceString("filePath", filePath);
|
||||||
|
|
||||||
|
// Resolve the full file path
|
||||||
|
string resolvedFilePath = this.ResolveFilePath(filePath);
|
||||||
|
string keyName = resolvedFilePath.ToLower();
|
||||||
|
|
||||||
|
ScriptFile scriptFile = null;
|
||||||
|
return this.workspaceFiles.TryGetValue(keyName, out scriptFile);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an open file in the workspace. If the file isn't open but
|
/// Gets an open file in the workspace. If the file isn't open but
|
||||||
/// exists on the filesystem, load and return it. Virtual method to
|
/// exists on the filesystem, load and return it. Virtual method to
|
||||||
@@ -124,9 +141,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace
|
|||||||
// with 'inmemory'. Untitled files which have been marked of
|
// with 'inmemory'. Untitled files which have been marked of
|
||||||
// type SqlTools have a path starting with 'untitled'.
|
// type SqlTools have a path starting with 'untitled'.
|
||||||
return
|
return
|
||||||
filePath.StartsWith("inmemory") ||
|
filePath.StartsWith("inmemory:") ||
|
||||||
filePath.StartsWith("tsqloutput") ||
|
filePath.StartsWith("tsqloutput:") ||
|
||||||
filePath.StartsWith("untitled");
|
filePath.StartsWith("git:") ||
|
||||||
|
filePath.StartsWith("untitled:");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -244,6 +244,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace
|
|||||||
{
|
{
|
||||||
Logger.Write(LogLevel.Verbose, "HandleDidOpenTextDocumentNotification");
|
Logger.Write(LogLevel.Verbose, "HandleDidOpenTextDocumentNotification");
|
||||||
|
|
||||||
|
if (IsScmEvent(openParams.TextDocument.Uri))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// read the SQL file contents into the ScriptFile
|
// read the SQL file contents into the ScriptFile
|
||||||
ScriptFile openedFile = Workspace.GetFileBuffer(openParams.TextDocument.Uri, openParams.TextDocument.Text);
|
ScriptFile openedFile = Workspace.GetFileBuffer(openParams.TextDocument.Uri, openParams.TextDocument.Text);
|
||||||
|
|
||||||
@@ -260,6 +265,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace
|
|||||||
{
|
{
|
||||||
Logger.Write(LogLevel.Verbose, "HandleDidCloseTextDocumentNotification");
|
Logger.Write(LogLevel.Verbose, "HandleDidCloseTextDocumentNotification");
|
||||||
|
|
||||||
|
if (IsScmEvent(closeParams.TextDocument.Uri))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Skip closing this file if the file doesn't exist
|
// Skip closing this file if the file doesn't exist
|
||||||
var closedFile = Workspace.GetFile(closeParams.TextDocument.Uri);
|
var closedFile = Workspace.GetFile(closeParams.TextDocument.Uri);
|
||||||
if (closedFile == null)
|
if (closedFile == null)
|
||||||
@@ -312,6 +322,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static bool IsScmEvent(string filePath)
|
||||||
|
{
|
||||||
|
// if the URI is prefixed with git: then we want to skip processing that file
|
||||||
|
return filePath.StartsWith("git:");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,5 +145,56 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Workspace
|
|||||||
Assert.NotNull(workspace.ResolveRelativeScriptPath(@"c:\path\", "file.sql"));
|
Assert.NotNull(workspace.ResolveRelativeScriptPath(@"c:\path\", "file.sql"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task DontProcessGitFileEvents()
|
||||||
|
{
|
||||||
|
// setup test workspace
|
||||||
|
var workspace = new ServiceLayer.Workspace.Workspace();
|
||||||
|
var workspaceService = new WorkspaceService<SqlToolsSettings> {Workspace = workspace};
|
||||||
|
|
||||||
|
// send a document open event with git:/ prefix URI
|
||||||
|
string filePath = "git:/myfile.sql";
|
||||||
|
var openParams = new DidOpenTextDocumentNotification
|
||||||
|
{
|
||||||
|
TextDocument = new TextDocumentItem { Uri = filePath }
|
||||||
|
};
|
||||||
|
|
||||||
|
await workspaceService.HandleDidOpenTextDocumentNotification(openParams, eventContext: null);
|
||||||
|
|
||||||
|
// verify the file is not being tracked by workspace
|
||||||
|
Assert.False(workspaceService.Workspace.ContainsFile(filePath));
|
||||||
|
|
||||||
|
// send a close event with git:/ prefix URI
|
||||||
|
var closeParams = new DidCloseTextDocumentParams
|
||||||
|
{
|
||||||
|
TextDocument = new TextDocumentItem { Uri = filePath }
|
||||||
|
};
|
||||||
|
|
||||||
|
await workspaceService.HandleDidCloseTextDocumentNotification(closeParams, eventContext: null);
|
||||||
|
|
||||||
|
// this is not that interesting validation since the open is ignored
|
||||||
|
// the main validation is that close doesn't raise an exception
|
||||||
|
Assert.False(workspaceService.Workspace.ContainsFile(filePath));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task WorkspaceContainsFile()
|
||||||
|
{
|
||||||
|
var workspace = new ServiceLayer.Workspace.Workspace();
|
||||||
|
var workspaceService = new WorkspaceService<SqlToolsSettings> {Workspace = workspace};
|
||||||
|
var openedFile = workspace.GetFileBuffer(TestObjects.ScriptUri, string.Empty);
|
||||||
|
|
||||||
|
// send a document open event
|
||||||
|
var openParams = new DidOpenTextDocumentNotification
|
||||||
|
{
|
||||||
|
TextDocument = new TextDocumentItem { Uri = TestObjects.ScriptUri }
|
||||||
|
};
|
||||||
|
|
||||||
|
await workspaceService.HandleDidOpenTextDocumentNotification(openParams, eventContext: null);
|
||||||
|
|
||||||
|
// verify the file is being tracked by workspace
|
||||||
|
Assert.True(workspaceService.Workspace.ContainsFile(TestObjects.ScriptUri));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user