From 340a6043064c31c19fd267861391cb6f917236c0 Mon Sep 17 00:00:00 2001 From: Alexander Hjelm Date: Thu, 8 Jun 2023 10:30:40 +0200 Subject: [PATCH 1/2] Fix incorrect formatting for jira image URLs in comments --- .../WitClient/WitClientUtils.cs | 15 +++++++-- .../WitClient/WitClientUtilsTests.cs | 32 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs b/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs index ff58c9e9..a2a14a8b 100644 --- a/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs +++ b/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs @@ -565,10 +565,12 @@ private void CorrectImagePath(WorkItem wi, WiItem wiItem, WiRevision rev, ref st throw new ArgumentException(nameof(rev)); } - foreach (var att in wiItem.Revisions.SelectMany(r => r.Attachments.Where(a => a.Change == ReferenceChangeType.Added))) + var filteredRelations = wiItem.Revisions.SelectMany(r => r.Attachments.Where(a => a.Change == ReferenceChangeType.Added)); + + foreach (var att in filteredRelations) { var fileName = att.FilePath.Split('\\')?.Last() ?? string.Empty; - var encodedFileName = HttpUtility.UrlEncode(fileName); + var encodedFileName = EncodeFileNameUsingJiraStandard(fileName); if (textField.Contains(fileName) || textField.IndexOf(encodedFileName, StringComparison.OrdinalIgnoreCase) >= 0 || textField.Contains("_thumb_" + att.AttOriginId)) { var tfsAtt = IdentifyAttachment(att, wi, isAttachmentMigratedDelegate); @@ -596,6 +598,15 @@ private void CorrectImagePath(WorkItem wi, WiItem wiItem, WiRevision rev, ref st } } + public string EncodeFileNameUsingJiraStandard(string fileName) + { + string fileNameEncoded = HttpUtility.UrlEncode(fileName); + fileNameEncoded = fileNameEncoded.Replace("(", "%28"); + fileNameEncoded = fileNameEncoded.Replace(")", "%29"); + return fileNameEncoded; + } + + private void CorrectClosedByAndClosedDate(WiRevision rev, WorkItem wi) { var wiState = wi.Fields[WiFieldReference.State].ToString() ?? string.Empty; diff --git a/src/WorkItemMigrator/tests/Migration.Wi-Import.Tests/WitClient/WitClientUtilsTests.cs b/src/WorkItemMigrator/tests/Migration.Wi-Import.Tests/WitClient/WitClientUtilsTests.cs index 1f60a170..d8519b83 100644 --- a/src/WorkItemMigrator/tests/Migration.Wi-Import.Tests/WitClient/WitClientUtilsTests.cs +++ b/src/WorkItemMigrator/tests/Migration.Wi-Import.Tests/WitClient/WitClientUtilsTests.cs @@ -974,5 +974,37 @@ public void When_calling_save_workitem_fields_with_populated_workitem_Then_worki Assert.That(updatedWI.Fields[WiFieldReference.Priority], Is.EqualTo(createdWI.Fields[WiFieldReference.Priority])); }); } + + [Test] + public void EncodeFileNameUsingJiraStandard_encodes_file_name_with_special_characters() + { + // Arrange + MockedWitClientWrapper witClientWrapper = new MockedWitClientWrapper(); + WitClientUtils wiUtils = new WitClientUtils(witClientWrapper); + string fileName = "My File (Special).txt"; + string expectedEncodedFileName = "My+File+%28Special%29.txt"; + + // Act + string encodedFileName = wiUtils.EncodeFileNameUsingJiraStandard(fileName); + + // Assert + Assert.AreEqual(expectedEncodedFileName, encodedFileName); + } + + [Test] + public void EncodeFileNameUsingJiraStandard_encodes_file_name_with_no_special_characters() + { + // Arrange + MockedWitClientWrapper witClientWrapper = new MockedWitClientWrapper(); + WitClientUtils wiUtils = new WitClientUtils(witClientWrapper); + string fileName = "MyFile.txt"; + string expectedEncodedFileName = "MyFile.txt"; + + // Act + string encodedFileName = wiUtils.EncodeFileNameUsingJiraStandard(fileName); + + // Assert + Assert.AreEqual(expectedEncodedFileName, encodedFileName); + } } } \ No newline at end of file From 16d36b3f86ef697aada247cc9ffe4de73aca8eca Mon Sep 17 00:00:00 2001 From: Alexander Hjelm Date: Thu, 8 Jun 2023 13:27:19 +0200 Subject: [PATCH 2/2] Fix image mapping for rest api links --- .../WorkItemImport/WitClient/WitClientUtils.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs b/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs index a2a14a8b..1b538f8b 100644 --- a/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs +++ b/src/WorkItemMigrator/WorkItemImport/WitClient/WitClientUtils.cs @@ -569,9 +569,15 @@ private void CorrectImagePath(WorkItem wi, WiItem wiItem, WiRevision rev, ref st foreach (var att in filteredRelations) { - var fileName = att.FilePath.Split('\\')?.Last() ?? string.Empty; - var encodedFileName = EncodeFileNameUsingJiraStandard(fileName); - if (textField.Contains(fileName) || textField.IndexOf(encodedFileName, StringComparison.OrdinalIgnoreCase) >= 0 || textField.Contains("_thumb_" + att.AttOriginId)) + string fileName = att.FilePath.Split('\\')?.Last() ?? string.Empty; + string encodedFileName = EncodeFileNameUsingJiraStandard(fileName); + string restApiUrlOption = "/rest/api/3/attachment/content/" + att.AttOriginId; + if ( + textField.Contains(fileName) + || textField.IndexOf(encodedFileName, StringComparison.OrdinalIgnoreCase) >= 0 + || textField.Contains("_thumb_" + att.AttOriginId) + || textField.Contains(restApiUrlOption) + ) { var tfsAtt = IdentifyAttachment(att, wi, isAttachmentMigratedDelegate);