Beispiel #1
0
        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);
                    }
                }
            }
        }
Beispiel #2
0
        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());
        }
Beispiel #3
0
        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());
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
 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());
 }