Compare commits

...

12 Commits

Author SHA1 Message Date
Cory Miller
0be495a2f9 Detection for heredoc (#2738) 2023-08-08 11:12:42 -04:00
Ben Wells
9c8abf2a6e updating test cases and fixing normal style check 2023-07-26 15:53:57 +00:00
Ben Wells
45d079e5f3 syntax errors 2023-07-26 14:57:57 +00:00
Ben Wells
4da8c9e69a code review suggestion of checking heredocIndex < equalsIndex to short circuit the 'equals in delimiter' case 2023-07-26 14:51:57 +00:00
Ben Wells
3ee541e26a Update src/Test/L0/Worker/FileCommandTestBase.cs
Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
2023-07-26 10:46:04 -04:00
Ben Wells
71600dec6e throw argument exception to guard against case where pos1 is greater than pos2 2023-07-26 14:44:37 +00:00
Ben Wells
62d0a70002 Update src/Test/L0/Worker/FileCommandTestBase.cs
Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
2023-07-26 10:40:08 -04:00
Ben Wells
fc8a966a21 Update src/Runner.Worker/FileCommandManager.cs
Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
2023-07-26 10:39:44 -04:00
Ben Wells
184098ac5d Update src/Runner.Worker/FileCommandManager.cs
Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
2023-07-26 10:39:36 -04:00
Ben Wells
76e2904c63 Update FileCommandManager.cs 2023-07-21 16:05:30 -04:00
Ben Wells
2796fcdd87 Update FileCommandTestBase.cs to add additional heredoc edge cases 2023-07-21 15:55:35 -04:00
Ben Wells
c71eceaae3 Update heredoc detection to handle more edge cases 2023-07-21 15:49:51 -04:00
2 changed files with 55 additions and 6 deletions

View File

@@ -322,16 +322,28 @@ namespace GitHub.Runner.Worker
var equalsIndex = line.IndexOf("=", StringComparison.Ordinal);
var heredocIndex = line.IndexOf("<<", StringComparison.Ordinal);
// Heredoc style NAME<<EOF (where EOF is typically randomly-generated Base64 and may include an '=' character)
// Heredoc style NAME=<<EOF (where EOF is typically randomly-generated Base64 and may include an '=' character)
// see https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
if (heredocIndex >= 0 && (equalsIndex < 0 || heredocIndex < equalsIndex))
// "key=<<EOF is also considered heredoc where the key contains an =.
// Also we detect heredoc if whitespace chars exist between = and <<. (ex: "key <<EOF")
var isHeredoc = heredocIndex >= 0 &&
(
equalsIndex < 0 ||
heredocIndex < equalsIndex ||
(
heredocIndex > equalsIndex &&
OnlyContainsWhiteSpaceBetweenPositions(line, equalsIndex, heredocIndex)
)
);
if (isHeredoc)
{
var split = line.Split(new[] { "<<" }, 2, StringSplitOptions.None);
if (string.IsNullOrEmpty(split[0]) || string.IsNullOrEmpty(split[1]))
{
throw new Exception($"Invalid format '{line}'. Name must not be empty and delimiter must not be empty");
}
key = split[0];
key = split[0].Trim().TrimEnd('=');
var delimiter = split[1];
var startIndex = index; // Start index of the value (inclusive)
var endIndex = index; // End index of the value (exclusive)
@@ -352,8 +364,8 @@ namespace GitHub.Runner.Worker
output = endIndex > startIndex ? text.Substring(startIndex, endIndex - startIndex) : string.Empty;
}
// Normal style NAME=VALUE
else if (equalsIndex >= 0 && heredocIndex < 0)
// Normal style NAME=VALUE, can have << in the value.
else if (equalsIndex >= 0)
{
var split = line.Split(new[] { '=' }, 2, StringSplitOptions.None);
if (string.IsNullOrEmpty(line))
@@ -383,6 +395,32 @@ namespace GitHub.Runner.Worker
return GetEnumerator();
}
// accepts a string, two indexes, and returns true if only whitespace chars exist between those two indexes (non-inclusive)
private static bool OnlyContainsWhiteSpaceBetweenPositions(string str, int pos1, int pos2)
{
// Check if the provided positions are valid
if (pos1 < 0 || pos2 < 0 || pos1 >= str.Length || pos2 >= str.Length)
{
throw new ArgumentOutOfRangeException("OnlyContainsWhiteSpaceBetweenPositions: Positions should be within the string length.");
}
// Ensure pos1 is always the smaller position
if (pos2 < pos1)
{
throw new ArgumentException("OnlyContainsWhiteSpaceBetweenPositions: pos1 must be less than or equal to pos2.");
}
for (int i = pos1 + 1; i < pos2; i++)
{
if (!char.IsWhiteSpace(str[i]))
{
return false;
}
}
return true;
}
private static string ReadLine(
string text,
ref int index)

View File

@@ -238,15 +238,26 @@ namespace GitHub.Runner.Common.Tests.Worker
"MY_KEY_4<<EOF",
"EOF EOF",
"EOF",
"MY_KEY_5=abc << def",
"MY_KEY_6= <<EOF",
"white space test",
"EOF",
"MY_KEY_7 <<=EOF=",
"abc",
"=EOF=",
string.Empty
};
TestUtil.WriteContent(stateFile, content);
_fileCmdExtension.ProcessCommand(_executionContext.Object, stateFile, null);
Assert.Equal(0, _issues.Count);
Assert.Equal(4, _store.Count);
Assert.Equal(7, _store.Count);
Assert.Equal($"hello{BREAK}{BREAK}three{BREAK}", _store["MY_KEY_1"]);
Assert.Equal($"hello=two", _store["MY_KEY_2"]);
Assert.Equal($" EOF", _store["MY_KEY_3"]);
Assert.Equal($"EOF EOF", _store["MY_KEY_4"]);
Assert.Equal($"abc << def", _store["MY_KEY_5"]);
Assert.Equal($"white space test", _store["MY_KEY_6"]);
Assert.Equal($"abc", _store["MY_KEY_7"]);
}
}