1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Fix shell-env timeout (#2938)

This commit is contained in:
Jim Ehrismann 2021-06-09 14:54:19 -04:00 committed by GitHub
parent a1a1c240e9
commit 86d0a86ec9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 13 deletions

View File

@ -22,7 +22,7 @@
import type { Cluster } from "../cluster";
import { Kubectl } from "../kubectl";
import type * as WebSocket from "ws";
import shellEnv from "shell-env";
import { shellEnv } from "../utils/shell-env";
import { app } from "electron";
import { clearKubeconfigEnvVars } from "../utils/clear-kube-env-vars";
import path from "path";

View File

@ -19,10 +19,9 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import shellEnv from "shell-env";
import { shellEnv } from "./utils/shell-env";
import os from "os";
import { app } from "electron";
import logger from "./logger";
interface Env {
[key: string]: string;
@ -37,16 +36,7 @@ export async function shellSync() {
const { shell } = os.userInfo();
let envVars = {};
try {
envVars = await Promise.race([
shellEnv(shell),
new Promise((_resolve, reject) => setTimeout(() => {
reject(new Error("Resolving shell environment is taking very long. Please review your shell configuration."));
}, 5_000))
]);
} catch (error) {
logger.error(`shellEnv: ${error}`);
}
envVars = await shellEnv(shell);
const env: Env = JSON.parse(JSON.stringify(envVars));

View File

@ -0,0 +1,66 @@
/**
* Copyright (c) 2021 OpenLens Authors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import shellEnvironment from "shell-env";
import logger from "../logger";
export interface EnvironmentVariables {
readonly [key: string]: string;
}
let shellSyncFailed = false;
/**
* Attempts to get the shell environment per the user's existing startup scripts.
* If the environment can't be retrieved after 5 seconds an error message is logged.
* Subsequent calls after such a timeout simply log an error message without trying
* to get the environment, unless forceRetry is true.
* @param shell the shell to get the environment from
* @param forceRetry if true will always try to get the environment, otherwise if
* a previous call to this function failed then this call will fail too.
* @returns object containing the shell's environment variables. An empty object is
* returned if the call fails.
*/
export async function shellEnv(shell?: string, forceRetry = false) : Promise<EnvironmentVariables> {
let envVars = {};
if (forceRetry) {
shellSyncFailed = false;
}
if (!shellSyncFailed) {
try {
envVars = await Promise.race([
shellEnvironment(shell),
new Promise((_resolve, reject) => setTimeout(() => {
reject(new Error("Resolving shell environment is taking very long. Please review your shell configuration."));
}, 5_000))
]);
} catch (error) {
logger.error(`shellEnv: ${error}`);
shellSyncFailed = true;
}
} else {
logger.error("shellSync(): Resolving shell environment took too long. Please review your shell configuration.");
}
return envVars;
}