Skip to content

Commit dd9fcfc

Browse files
authored
Replace invalid file name chars in diag log name (actions#3249)
1 parent 5107c5e commit dd9fcfc

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

src/Runner.Sdk/Util/IOUtil.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,34 @@ public static void CreateEmptyFile(string path)
459459
File.WriteAllText(path, null);
460460
}
461461

462+
/// <summary>
463+
/// Replaces invalid file name characters with '_'
464+
/// </summary>
465+
public static string ReplaceInvalidFileNameChars(string fileName)
466+
{
467+
var result = new StringBuilder();
468+
var invalidChars = Path.GetInvalidFileNameChars();
469+
470+
var current = 0; // Current index
471+
while (current < fileName?.Length)
472+
{
473+
var next = fileName.IndexOfAny(invalidChars, current);
474+
if (next >= 0)
475+
{
476+
result.Append(fileName.Substring(current, next - current));
477+
result.Append('_');
478+
current = next + 1;
479+
}
480+
else
481+
{
482+
result.Append(fileName.Substring(current));
483+
break;
484+
}
485+
}
486+
487+
return result.ToString();
488+
}
489+
462490
/// <summary>
463491
/// Recursively enumerates a directory without following directory reparse points.
464492
/// </summary>

src/Runner.Worker/DiagnosticLogManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ public void UploadDiagnosticLogs(IExecutionContext executionContext,
9191
string phaseName = executionContext.Global.Variables.System_PhaseDisplayName ?? "UnknownPhaseName";
9292

9393
// zip the files
94-
string diagnosticsZipFileName = $"{buildName}-{phaseName}.zip";
94+
string diagnosticsZipFileName = $"{buildName}-{IOUtil.ReplaceInvalidFileNameChars(phaseName)}.zip";
9595
string diagnosticsZipFilePath = Path.Combine(supportRootFolder, diagnosticsZipFileName);
9696
ZipFile.CreateFromDirectory(supportFilesFolder, diagnosticsZipFilePath);
9797

9898
// upload the json metadata file
9999
executionContext.Debug("Uploading diagnostic metadata file.");
100-
string metadataFileName = $"diagnostics-{buildName}-{phaseName}.json";
100+
string metadataFileName = $"diagnostics-{buildName}-{IOUtil.ReplaceInvalidFileNameChars(phaseName)}.json";
101101
string metadataFilePath = Path.Combine(supportFilesFolder, metadataFileName);
102102
string phaseResult = GetTaskResultAsString(executionContext.Result);
103103

src/Test/L0/Util/IOUtilL0.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,33 @@ public void LoadObject_ThrowsOnRequiredLoadObject()
960960
}
961961
}
962962

963+
[Fact]
964+
[Trait("Level", "L0")]
965+
[Trait("Category", "Common")]
966+
public void ReplaceInvalidFileNameChars()
967+
{
968+
Assert.Equal(string.Empty, IOUtil.ReplaceInvalidFileNameChars(null));
969+
Assert.Equal(string.Empty, IOUtil.ReplaceInvalidFileNameChars(string.Empty));
970+
Assert.Equal("hello.txt", IOUtil.ReplaceInvalidFileNameChars("hello.txt"));
971+
#if OS_WINDOWS
972+
// Refer https://github.com/dotnet/runtime/blob/ce84f1d8a3f12711bad678a33efbc37b461f684f/src/libraries/System.Private.CoreLib/src/System/IO/Path.Windows.cs#L15
973+
Assert.Equal(
974+
"1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ 10_ 11_ 12_ 13_ 14_ 15_ 16_ 17_ 18_ 19_ 20_ 21_ 22_ 23_ 24_ 25_ 26_ 27_ 28_ 29_ 30_ 31_ 32_ 33_ 34_ 35_ 36_ 37_ 38_ 39_ 40_ 41_",
975+
IOUtil.ReplaceInvalidFileNameChars($"1\" 2< 3> 4| 5\0 6{(char)1} 7{(char)2} 8{(char)3} 9{(char)4} 10{(char)5} 11{(char)6} 12{(char)7} 13{(char)8} 14{(char)9} 15{(char)10} 16{(char)11} 17{(char)12} 18{(char)13} 19{(char)14} 20{(char)15} 21{(char)16} 22{(char)17} 23{(char)18} 24{(char)19} 25{(char)20} 26{(char)21} 27{(char)22} 28{(char)23} 29{(char)24} 30{(char)25} 31{(char)26} 32{(char)27} 33{(char)28} 34{(char)29} 35{(char)30} 36{(char)31} 37: 38* 39? 40\\ 41/"));
976+
#else
977+
// Refer https://github.com/dotnet/runtime/blob/ce84f1d8a3f12711bad678a33efbc37b461f684f/src/libraries/System.Private.CoreLib/src/System/IO/Path.Unix.cs#L12
978+
Assert.Equal("1_ 2_", IOUtil.ReplaceInvalidFileNameChars("1\0 2/"));
979+
#endif
980+
Assert.Equal("_leading", IOUtil.ReplaceInvalidFileNameChars("/leading"));
981+
Assert.Equal("__consecutive leading", IOUtil.ReplaceInvalidFileNameChars("//consecutive leading"));
982+
Assert.Equal("trailing_", IOUtil.ReplaceInvalidFileNameChars("trailing/"));
983+
Assert.Equal("consecutive trailing__", IOUtil.ReplaceInvalidFileNameChars("consecutive trailing//"));
984+
Assert.Equal("middle_middle", IOUtil.ReplaceInvalidFileNameChars("middle/middle"));
985+
Assert.Equal("consecutive middle__consecutive middle", IOUtil.ReplaceInvalidFileNameChars("consecutive middle//consecutive middle"));
986+
Assert.Equal("_leading_middle_trailing_", IOUtil.ReplaceInvalidFileNameChars("/leading/middle/trailing/"));
987+
Assert.Equal("__consecutive leading__consecutive middle__consecutive trailing__", IOUtil.ReplaceInvalidFileNameChars("//consecutive leading//consecutive middle//consecutive trailing//"));
988+
}
989+
963990
private static async Task CreateDirectoryReparsePoint(IHostContext context, string link, string target)
964991
{
965992
#if OS_WINDOWS

0 commit comments

Comments
 (0)