From 92067eb1a5f271278373d6b2c2df9b6f9c373446 Mon Sep 17 00:00:00 2001 From: Owen Young <62473795+theowenyoung@users.noreply.github.com> Date: Mon, 2 Nov 2020 21:40:46 +0800 Subject: [PATCH] fix: outputs espace (#404) * fix: outputs espace * refactor: move unescape to func * refactor: fix ci lint * refactor: unescape function --- pkg/runner/command.go | 33 ++++++++++++++++++++++++++++++++- pkg/runner/command_test.go | 15 +++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/pkg/runner/command.go b/pkg/runner/command.go index 9e27b742..c635322e 100644 --- a/pkg/runner/command.go +++ b/pkg/runner/command.go @@ -38,7 +38,8 @@ func (rc *RunContext) commandHandler(ctx context.Context) common.LineHandler { if resumeCommand != "" && command != resumeCommand { return false } - + arg = unescapeCommandData(arg) + kvPairs = unescapeKvPairs(kvPairs) switch command { case "set-env": rc.setEnv(ctx, kvPairs, arg) @@ -95,3 +96,33 @@ func parseKeyValuePairs(kvPairs string, separator string) map[string]string { } return rtn } +func unescapeCommandData(arg string) string { + escapeMap := map[string]string{ + "%25": "%", + "%0D": "\r", + "%0A": "\n", + } + for k, v := range escapeMap { + arg = strings.Replace(arg, k, v, -1) + } + return arg +} +func unescapeCommandProperty(arg string) string { + escapeMap := map[string]string{ + "%25": "%", + "%0D": "\r", + "%0A": "\n", + "%3A": ":", + "%2C": ",", + } + for k, v := range escapeMap { + arg = strings.Replace(arg, k, v, -1) + } + return arg +} +func unescapeKvPairs(kvPairs map[string]string) map[string]string { + for k, v := range kvPairs { + kvPairs[k] = unescapeCommandProperty(v) + } + return kvPairs +} diff --git a/pkg/runner/command_test.go b/pkg/runner/command_test.go index 6abe5275..1274dbf7 100644 --- a/pkg/runner/command_test.go +++ b/pkg/runner/command_test.go @@ -30,6 +30,21 @@ func TestSetOutput(t *testing.T) { } handler("::set-output name=x::valz\n") assert.Equal("valz", rc.StepResults["my-step"].Outputs["x"]) + + handler("::set-output name=x::percent2%25\n") + assert.Equal("percent2%", rc.StepResults["my-step"].Outputs["x"]) + + handler("::set-output name=x::percent2%25%0Atest\n") + assert.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x"]) + + handler("::set-output name=x::percent2%25%0Atest another3%25test\n") + assert.Equal("percent2%\ntest another3%test", rc.StepResults["my-step"].Outputs["x"]) + + handler("::set-output name=x%3A::percent2%25%0Atest\n") + assert.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x:"]) + + handler("::set-output name=x%3A%2C%0A%25%0D%3A::percent2%25%0Atest\n") + assert.Equal("percent2%\ntest", rc.StepResults["my-step"].Outputs["x:,\n%\r:"]) } func TestAddpath(t *testing.T) {