diff --git a/Dockerfile.desktop b/Dockerfile.desktop index 84850d36d4c483804b112c25e892e7fb40514c66..4489c910022b63234b66006a14438f9e177fc3d1 100644 --- a/Dockerfile.desktop +++ b/Dockerfile.desktop @@ -23,10 +23,8 @@ RUN chown deadlock setup_trace.py COPY recorder-out deadlock/ COPY .gitignore_recorder deadlock/.gitignore - - COPY start.desktop.sh . -RUN chmod 504 deadlock/ -R +RUN chmod 500 /deadlock/recorder.js RUN chmod 500 start.desktop.sh RUN mkdir /project && mkdir /tmp/.ssh && mkdir /home/deadlock/mission diff --git a/deadlock-plugins/deadlock-extension/.vscode/launch.json b/deadlock-plugins/deadlock-extension/.vscode/launch.json index 4f8bc2e8d2f1f4b8aa1ec80a3f2397f818b097ad..fd9b761149d6e5972331e8ccec39c32f413c91b4 100644 --- a/deadlock-plugins/deadlock-extension/.vscode/launch.json +++ b/deadlock-plugins/deadlock-extension/.vscode/launch.json @@ -13,6 +13,17 @@ "outFiles": ["${workspaceFolder}/dist/**/*.js"], "preLaunchTask": "${defaultBuildTask}" }, + { + "name": "Run Extension in test mode", + "type": "extensionHost", + "request": "launch", + "env": { + "DL_MOUNT_EXTENSION": "true" + }, + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "preLaunchTask": "${defaultBuildTask}" + }, { "name": "Extension Tests", "type": "extensionHost", diff --git a/deadlock-plugins/deadlock-extension/package-lock.json b/deadlock-plugins/deadlock-extension/package-lock.json index 9a9aebbbf75b76c12b20a97b079548747d9f5f01..f2892bfbc53240cd27ea173e1779d5207e90d3a5 100644 --- a/deadlock-plugins/deadlock-extension/package-lock.json +++ b/deadlock-plugins/deadlock-extension/package-lock.json @@ -8,6 +8,7 @@ "name": "deadlock-coding", "version": "0.1.10", "dependencies": { + "@types/yaml": "^1.9.7", "@vscode/webview-ui-toolkit": "^1.0.0", "async": "^3.2.2", "axios": "^0.27.2", @@ -17,7 +18,8 @@ "marked": "^4.0.6", "node-fetch": "^2.6.7", "reflect-metadata": "^0.1.13", - "simple-git": "^3.7.0" + "simple-git": "^3.7.0", + "yaml": "^2.1.1" }, "devDependencies": { "@babel/preset-typescript": "^7.17.12", @@ -54,6 +56,19 @@ "vscode": ">=1.66.0" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -764,6 +779,28 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -800,6 +837,28 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -1734,6 +1793,15 @@ "@types/node": "*" } }, + "node_modules/@types/yaml": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz", + "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==", + "deprecated": "This is a stub types definition. yaml provides its own type definitions, so you do not need this installed.", + "dependencies": { + "yaml": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -2381,13 +2449,10 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-flatten": { "version": "2.1.2", @@ -3960,6 +4025,15 @@ "node": ">=4" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -3969,6 +4043,19 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -6508,19 +6595,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6775,12 +6849,6 @@ "markdown-it": "bin/markdown-it.js" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/markdown-it/node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -8592,7 +8660,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stack-utils": { @@ -9998,6 +10066,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", @@ -10606,6 +10682,27 @@ "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } } }, "@humanwhocodes/config-array": { @@ -10638,6 +10735,25 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -11108,6 +11224,12 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "@types/async": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.13.tgz", + "integrity": "sha512-7Q3awrhnvm89OzfsmqeqRQh8mh+8Pxfgq1UvSAn2nWQ5y/F3+NrbIF0RbkWq8+5dY99ozgap2b3DNBNwjLVOxw==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -11464,6 +11586,14 @@ "@types/node": "*" } }, + "@types/yaml": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz", + "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==", + "requires": { + "yaml": "*" + } + }, "@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -11951,13 +12081,10 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "array-flatten": { "version": "2.1.2", @@ -13134,11 +13261,30 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, @@ -15107,16 +15253,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -15318,12 +15454,6 @@ "uc.micro": "^1.0.5" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -16713,7 +16843,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "stack-utils": { @@ -17743,6 +17873,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==" + }, "yargs": { "version": "17.5.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", diff --git a/deadlock-plugins/deadlock-extension/package.json b/deadlock-plugins/deadlock-extension/package.json index 9f7b6810a8690bcd59f19b5f446a42e5729acbe4..55c12b9f7360887cc0b9274f646f205b31e263b6 100644 --- a/deadlock-plugins/deadlock-extension/package.json +++ b/deadlock-plugins/deadlock-extension/package.json @@ -62,6 +62,13 @@ "id": "help", "name": "Help", "visibility": "visible" + }, + { + "id": "commandTree", + "name": "Commands", + "icon": "media/dep.svg", + "contextualTitle": "Deadlock", + "when": "deadlock.showCommands" } ] }, @@ -99,6 +106,7 @@ "postversion": "git add package*.json && auto-changelog -p && git add CHANGELOG.md && git commit -m \"build: $npm_package_version\"" }, "dependencies": { + "@types/yaml": "^1.9.7", "@vscode/webview-ui-toolkit": "^1.0.0", "async": "^3.2.2", "axios": "^0.27.2", @@ -108,7 +116,8 @@ "marked": "^4.0.6", "node-fetch": "^2.6.7", "reflect-metadata": "^0.1.13", - "simple-git": "^3.7.0" + "simple-git": "^3.7.0", + "yaml": "^2.1.1" }, "devDependencies": { "@babel/preset-typescript": "^7.17.12", diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts index 29db6bb3c01d7e6616e6f9141c55e5bdbf7c8948..677faea6f2f59105971ffdf5add20a8eb7461224 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/devContainer.ts @@ -5,7 +5,7 @@ export interface DockerfileSpecific { 'build.args'?: string[]; 'build.target'?: string; 'build.cacheFrom'?: string; - containerEnv?: string; + containerEnv?: { [id: string]: string }; containerUser?: string; mounts?: string[]; workspaceMount?: string; @@ -18,7 +18,7 @@ export interface Base { forwardPorts?: string[]; portsAttributes?: string[]; otherPortsAttributes?: string[]; - remoteEnv?: string; + remoteEnv?: { [id: string]: string }; remoteUser?: string; updateRemoteUserUID?: string; userEnvProbe?: string; diff --git a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts index 4ff26fba8154b8be68bc5d485243e2a934345926..8350f2abb651049db4faeaa6b70f4f84a098742d 100644 --- a/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts +++ b/deadlock-plugins/deadlock-extension/src/core/mission/missionDevContainer.ts @@ -17,7 +17,7 @@ export class MissionDevContainer { private isInit = false; private mounts: string[] = []; private readonly dockerImageUrl = 'registry.takima.io/deadlock/deadlock-challenges'; - private readonly remoteGiteaWorkDir = `/workdir`; + private readonly remoteGiteaWorkDir = '/workdir'; private readonly dirs: { missionWorkdir: string; config: string; devcontainer: string; mounted: string }; @@ -98,13 +98,21 @@ export class MissionDevContainer { private createDevContainerFile(options?: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts>) { const hostMissionDevcontainerFileDir = `${this.dirs.devcontainer}/devcontainer.json`; - const image = `${this.dockerImageUrl}/${this.mission.id}:${this.mission.version}`; + let extTarget; this.mounts.push( `source=${userSshKeyFolderPath},target=/tmp/.ssh,type=bind,consistency=cached,readonly`, `source=${this.dirs.config},target=/home/config/,type=bind,consistency=cached,readonly`, 'source=/etc/hosts,target=/etc/hosts,type=bind,consistency=cached,readonly', ); + if (process.env.DL_MOUNT_EXTENSION === 'true') { + const extPath = + '/home/takima/Desktop/d-projects/deadlock-desktop/deadlock-plugins/deadlock-extension/deadlock-coding-0.1.10.vsix'; + extTarget = '/injected-extension/extension.vsix'; + this.mounts.push(`source=${extPath},target=${extTarget},type=bind`); + } else { + extTarget = 'Deadlock.deadlock-coding'; + } this.addInMountRCs(this.dirs.missionWorkdir, '.bashrc', '.zshrc'); @@ -114,7 +122,10 @@ export class MissionDevContainer { const devcontainer: Partial<DockerfileSpecific & Base & VSCodespecific & LifecycleScripts> = { name: `deadlock-${this.mission.id}`, image, - extensions: ['Deadlock.deadlock-coding'], + containerEnv: { + WORKDIR: `${remoteMissionDir}`, + }, + extensions: [extTarget], remoteUser: 'deadlock', mounts: this.mounts, userEnvProbe: 'interactiveShell', diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts index 15a2cf75af6c192e1a7b833f1c6a3d3919276fcc..e9f353467a38d7ecdf4ce3203fff0ae99666be8d 100644 --- a/deadlock-plugins/deadlock-extension/src/extension.ts +++ b/deadlock-plugins/deadlock-extension/src/extension.ts @@ -1,8 +1,10 @@ -import { window, ExtensionContext, workspace } from 'vscode'; +import { window, ExtensionContext, workspace, commands } from 'vscode'; import Controller from './core/controller'; +import isDocker from './core/utils/isdocker'; import { extensionError as error } from './recorder/utils/log'; import { DepNodeProvider } from './theia/deadlockPanel'; import UserConfigTheia from './theia/userConfigTheia'; +import { CommandTreeProvider } from './view/CommandTree'; export const userConfig = new UserConfigTheia(); @@ -13,9 +15,14 @@ export async function activate(context: ExtensionContext) { const workspaceFolders = workspace.workspaceFolders?.toString() ?? ''; if (!workspaceFolders) window.showInformationMessage('Pas de répertoires ouverts'); - const deadlockPanelProvider = new DepNodeProvider(workspaceFolders); + const deadlockPanelProvider = new DepNodeProvider(); window.registerTreeDataProvider('deadlockPanel', deadlockPanelProvider); - + if (isDocker()) { + commands.executeCommand('setContext', 'deadlock.showCommands', true); + window.registerTreeDataProvider('commandTree', new CommandTreeProvider(context)); + } else { + commands.executeCommand('setContext', 'deadlock.showCommands', false); + } try { await userConfig.init(); } catch (e) { diff --git a/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts b/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts new file mode 100644 index 0000000000000000000000000000000000000000..9991fe06f1ed40e07f82ba64ec3e187b9baa60a9 --- /dev/null +++ b/deadlock-plugins/deadlock-extension/src/model/challengeYaml.ts @@ -0,0 +1,20 @@ +interface ChallengeYaml { + version?: number; + name?: string; + label?: string; + description?: string; + level?: 'jedi'; + type?: 'DESKTOP'; + xp?: Map<string, number>; + desktop?: { + scripts: MissionCommand[]; + }; +} + +export interface MissionCommand { + name: string; + command: string; + description?: string; +} + +export default ChallengeYaml; diff --git a/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts b/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts index 3c81acd897012f29e75361013e32d6264755d3ae..f8a48cb423f5f66be71746cf96d8a2895190aef4 100644 --- a/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts +++ b/deadlock-plugins/deadlock-extension/src/theia/deadlockPanel.ts @@ -9,8 +9,6 @@ export class DepNodeProvider implements TreeDataProvider<Action> { readonly onDidChangeTreeData: Event<Action | undefined | void> = this._onDidChangeTreeData.event; - constructor(private workspaceRoot: string) {} - refresh(): void { this._onDidChangeTreeData.fire(); } diff --git a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7e7c5b2a66382c5f0394ac6693310814ab4ad20 --- /dev/null +++ b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts @@ -0,0 +1,58 @@ +import isDocker from '../core/utils/isdocker'; +import ChallengeYaml, { MissionCommand as MissionCommandYaml } from '../model/challengeYaml'; +import { parse } from 'yaml'; +import { readFileSync } from 'fs'; +import { commands, ExtensionContext, ThemeColor, ThemeIcon, TreeDataProvider, TreeItem, window } from 'vscode'; +import { extensionLog } from '../recorder/utils/log'; + +export class CommandTreeProvider implements TreeDataProvider<MissionCommand> { + challenge: ChallengeYaml; + context: ExtensionContext; + constructor(context: ExtensionContext) { + this.context = context; + if (isDocker()) { + this.challenge = parse(readFileSync('/deadlock/challenge.yaml', 'utf8')); + } else { + this.challenge = {}; + } + } + + getTreeItem(element: MissionCommand): TreeItem { + return element; + } + + getChildren(element?: MissionCommand): Thenable<MissionCommand[]> { + if (element) { + return Promise.resolve([]); + } else { + return Promise.resolve(this.challenge.desktop?.scripts?.map((script) => new MissionCommand(script)) ?? []); + } + } +} + +class MissionCommand extends TreeItem { + missionCommandYaml: MissionCommandYaml; + constructor(missionCommandYaml: MissionCommandYaml) { + super(missionCommandYaml.name); + this.missionCommandYaml = missionCommandYaml; + this.tooltip = missionCommandYaml.description; + this.description = missionCommandYaml.description; + this.iconPath = new ThemeIcon('notebook-execute', new ThemeColor('debugIcon.startForeground')); + commands.registerCommand(missionCommandYaml.name, () => { + const terminalName = `Deadlock`; + extensionLog(JSON.stringify(window.terminals)); + const terminal = + window.terminals.filter((terminal) => terminal.name === terminalName)[0] ?? + window.createTerminal({ + cwd: process.env.WORKDIR, + name: terminalName, + }); + terminal.sendText(missionCommandYaml.command); + terminal.show(); + }); + this.command = { + title: missionCommandYaml.name, + command: missionCommandYaml.name, + }; + } +}