private static void ReleaseGVFSLock(string fullCommand, int pid, Process parentProcess, NamedPipeClient pipeClient) { NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(pid, fullCommand); NamedPipeMessages.Message requestMessage = request.CreateMessage(NamedPipeMessages.ReleaseLock.Request); pipeClient.SendRequest(requestMessage); NamedPipeMessages.ReleaseLock.Response response = null; ConsoleHelper.ShowStatusWhileRunning( () => { response = new NamedPipeMessages.ReleaseLock.Response(pipeClient.ReadResponse()); if (response.ResponseData == null) { return(ConsoleHelper.ActionResult.Failure); } return(response.ResponseData.HasFailures ? ConsoleHelper.ActionResult.CompletedWithErrors : ConsoleHelper.ActionResult.Success); }, "Waiting for GVFS to parse index and update placeholder files", output: Console.Out, showSpinner: !ConsoleHelper.IsConsoleOutputRedirectedToFile(), suppressGvfsLogMessage: false, initialDelayMs: PostCommandSpinnerDelayMs); if (response == null || response.ResponseData == null) { Console.WriteLine("\nError communicating with GVFS: Run 'git status' to check the status of your repo"); } else if (response.ResponseData.HasFailures) { if (response.ResponseData.FailureCountExceedsMaxFileNames) { Console.WriteLine( "\nGVFS failed to update {0} files, run 'git status' to check the status of files in the repo", response.ResponseData.FailedToDeleteCount + response.ResponseData.FailedToUpdateCount); } else { string deleteFailuresMessage = BuildUpdatePlaceholderFailureMessage(response.ResponseData.FailedToDeleteFileList, "delete", "git clean -f "); if (deleteFailuresMessage.Length > 0) { Console.WriteLine(deleteFailuresMessage); } string updateFailuresMessage = BuildUpdatePlaceholderFailureMessage(response.ResponseData.FailedToUpdateFileList, "update", "git checkout -- "); if (updateFailuresMessage.Length > 0) { Console.WriteLine(updateFailuresMessage); } } } }
private void HandleReleaseLockRequest(string messageBody, NamedPipeServer.Connection connection) { NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(messageBody); if (request.RequestData == null) { this.tracer.RelatedError($"{nameof(this.HandleReleaseLockRequest)} received invalid lock request with body '{messageBody}'"); this.UnmountAndStopWorkingDirectoryCallbacks(); Environment.Exit((int)ReturnCode.NullRequestData); } NamedPipeMessages.ReleaseLock.Response response = this.fileSystemCallbacks.TryReleaseExternalLock(request.RequestData.PID); connection.TrySendResponse(response.CreateMessage()); }
private static void ReleaseLock(string enlistmentPipename, string enlistmentRoot) { using (NamedPipeClient pipeClient = new NamedPipeClient(enlistmentPipename)) { if (!pipeClient.Connect()) { throw new Exception("The repo does not appear to be mounted. Use 'gvfs status' to check."); } int pid = Process.GetCurrentProcess().Id; NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(pid: pid, isElevated: false, checkAvailabilityOnly: false, parsedCommand: AcquireGVFSLockVerb.fullCommand, gitCommandSessionId: string.Empty); NamedPipeMessages.Message requestMessage = request.CreateMessage(NamedPipeMessages.ReleaseLock.Request); pipeClient.SendRequest(requestMessage); NamedPipeMessages.ReleaseLock.Response response = response = new NamedPipeMessages.ReleaseLock.Response(pipeClient.ReadResponse()); } }
public static void ReleaseGVFSLock( bool unattended, NamedPipeClient pipeClient, string fullCommand, int pid, bool isElevated, bool isConsoleOutputRedirectedToFile, Action <NamedPipeMessages.ReleaseLock.Response> responseHandler, string gvfsEnlistmentRoot, string waitingMessage = "", int spinnerDelay = 0) { NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(pid, isElevated, checkAvailabilityOnly: false, parsedCommand: fullCommand); NamedPipeMessages.Message requestMessage = request.CreateMessage(NamedPipeMessages.ReleaseLock.Request); pipeClient.SendRequest(requestMessage); NamedPipeMessages.ReleaseLock.Response response = null; Func <ConsoleHelper.ActionResult> releaseLock = () => { response = new NamedPipeMessages.ReleaseLock.Response(pipeClient.ReadResponse()); responseHandler(response); return(ConsoleHelper.ActionResult.Success); }; if (unattended || isConsoleOutputRedirectedToFile) { releaseLock(); } else { ConsoleHelper.ShowStatusWhileRunning( releaseLock, waitingMessage, output: Console.Out, showSpinner: true, gvfsLogEnlistmentRoot: gvfsEnlistmentRoot, initialDelayMs: spinnerDelay); } }
public static void ReleaseGVFSLock( NamedPipeClient pipeClient, string fullCommand, int pid, Process parentProcess, Action <NamedPipeMessages.ReleaseLock.Response> responseHandler, string gvfsEnlistmentRoot, string waitingMessage = "", int spinnerDelay = 0) { NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(pid, fullCommand); NamedPipeMessages.Message requestMessage = request.CreateMessage(NamedPipeMessages.ReleaseLock.Request); pipeClient.SendRequest(requestMessage); NamedPipeMessages.ReleaseLock.Response response = null; if (ConsoleHelper.IsConsoleOutputRedirectedToFile()) { // If output is redirected then don't show waiting message or it might be interpreted as error response = new NamedPipeMessages.ReleaseLock.Response(pipeClient.ReadResponse()); responseHandler(response); } else { ConsoleHelper.ShowStatusWhileRunning( () => { response = new NamedPipeMessages.ReleaseLock.Response(pipeClient.ReadResponse()); responseHandler(response); return(ConsoleHelper.ActionResult.Success); }, waitingMessage, output: Console.Out, showSpinner: true, gvfsLogEnlistmentRoot: gvfsEnlistmentRoot, initialDelayMs: spinnerDelay); } }
private void HandleReleaseLockRequest(string messageBody, NamedPipeServer.Connection connection) { NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(messageBody); NamedPipeMessages.ReleaseLock.Response response = this.gvfltCallbacks.TryReleaseExternalLock(request.RequestData.PID); connection.TrySendResponse(response.CreateMessage()); }