diff --git a/src/spec-common/variableSubstitution.ts b/src/spec-common/variableSubstitution.ts index d973f0cd6..77f8658aa 100644 --- a/src/spec-common/variableSubstitution.ts +++ b/src/spec-common/variableSubstitution.ts @@ -83,9 +83,14 @@ function evaluateSingleVariable(replace: Replace, match: string, variable: strin // try to separate variable arguments from variable name let args: string[] = []; const parts = variable.split(':'); - if (parts.length > 1) { - variable = parts[0]; - args = parts.slice(1); + const limitedParts = [ + ...parts.slice(0, 2), + parts.slice(2).join(':') + ]; + const parts = variable.split(':', 3); + if (limitedParts.length > 1) { + variable = limitedParts[0]; + args = limitedParts.slice(1); } return replace(match, variable, args); @@ -168,4 +173,4 @@ function devcontainerIdForLabels(idLabels: Record): string { .toString(32) .padStart(52, '0'); return uniqueId; -} \ No newline at end of file +} diff --git a/src/test/variableSubstitution.test.ts b/src/test/variableSubstitution.test.ts index e95002464..9c2a973d2 100644 --- a/src/test/variableSubstitution.test.ts +++ b/src/test/variableSubstitution.test.ts @@ -88,6 +88,21 @@ describe('Variable substitution', function () { assert.strictEqual(result.foo, 'bardefaultbar'); }); + it(`environment variables with default value containing colon if they do not exist`, async () => { + const raw = { + foo: 'bar${localEnv:baz:de:fault}bar' + }; + const result = substitute({ + platform: 'linux', + localWorkspaceFolder: '/foo/bar', + containerWorkspaceFolder: '/baz/blue', + configFile: URI.file('/foo/bar/baz.json'), + env: { + }, + }, raw); + assert.strictEqual(result.foo, 'barde:faultbar'); + }); + it(`environment variables without default value if they do not exist`, async () => { const raw = { foo: 'bar${localEnv:baz}bar'