From faea30d6abe651ef91443beb1d9f93cb85c39300 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Sun, 2 Jan 2022 13:54:32 +0100 Subject: [PATCH] Fixed issue #3770: TortoiseGitMerge can't apply NonANSI (e.g., UTF-8) patch Signed-off-by: Sven Strickroth --- src/Changelog.txt | 1 + src/TortoiseMerge/Patch.cpp | 10 +--------- test/UnitTests/PatchTest.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/Changelog.txt b/src/Changelog.txt index 8368b72d1..0defa3a29 100644 --- a/src/Changelog.txt +++ b/src/Changelog.txt @@ -54,6 +54,7 @@ Released: unreleased * Fixed issue #3790: TortoiseGitMerge: Prevent calling "mark as resolved" twice * Fixed issue #6765: TortoiseGitMerge crashes with files larger than 1GB * Fixed issue #3826: Help links to TortoiseGit site don't open in a sensible browser + * Fixed issue #3770: TortoiseGitMerge can't apply NonANSI (e.g., UTF-8) patch = Release 2.12.0 = Released: 2021-03-31 diff --git a/src/TortoiseMerge/Patch.cpp b/src/TortoiseMerge/Patch.cpp index 15b89fab3..17c22bfb7 100644 --- a/src/TortoiseMerge/Patch.cpp +++ b/src/TortoiseMerge/Patch.cpp @@ -1,6 +1,6 @@ // TortoiseGitMerge - a Diff/Patch program -// Copyright (C) 2009-2013, 2015-2021 - TortoiseGit +// Copyright (C) 2009-2013, 2015-2022 - TortoiseGit // Copyright (C) 2012-2013 - Sven Strickroth // Copyright (C) 2004-2009,2011-2014 - TortoiseSVN @@ -457,14 +457,6 @@ int CPatch::PatchFile(const int strip, int nIndex, const CString& sPatchPath, co { CString sPatchLine = chunk->arLines.GetAt(j); EOL ending = chunk->arEOLs[j]; - if ((m_UnicodeType != CFileTextLines::UTF8)&&(m_UnicodeType != CFileTextLines::UTF8BOM)) - { - if ((PatchLines.GetUnicodeType()==CFileTextLines::UTF8)||(m_UnicodeType == CFileTextLines::UTF8BOM)) - { - // convert the UTF-8 contents in CString sPatchLine into a CStringA - sPatchLine = CUnicodeUtils::GetUnicode(CStringA(sPatchLine)); - } - } int nPatchState = static_cast(chunk->arLinesStates.GetAt(j)); switch (nPatchState) { diff --git a/test/UnitTests/PatchTest.cpp b/test/UnitTests/PatchTest.cpp index 3157adb1e..416634a55 100644 --- a/test/UnitTests/PatchTest.cpp +++ b/test/UnitTests/PatchTest.cpp @@ -395,3 +395,29 @@ TEST(CPatch, PatchFile) EXPECT_STREQ(patch.GetRevision2(2), hashAfter.ToString(patch.GetRevision2(2).GetLength())); } } + +TEST(CPatch, PatchFile_UTF8) +{ + CString resourceDir; + ASSERT_TRUE(GetResourcesDir(resourceDir)); + + CAutoTempDir tempDir; + ASSERT_TRUE(::CreateDirectory(tempDir.GetTempDir() + L"\\input", nullptr)); + ASSERT_TRUE(::CreateDirectory(tempDir.GetTempDir() + L"\\output", nullptr)); + ASSERT_TRUE(CStringUtils::WriteStringToTextFile(tempDir.GetTempDir() + L"\\input\\ödp.txt", L"dsfds\r\nä\r\ndsf\r\nädsf\r\ndsf\r\nsdf", true)); + + CPatch patch; + EXPECT_TRUE(patch.OpenUnifiedDiffFile(resourceDir + L"\\patches\\patch-utf8.patch")); + EXPECT_STREQ(L"", patch.GetErrorMessage()); + EXPECT_EQ(1, patch.GetNumberOfFiles()); + + git_oid oid1 = { 0 }; + EXPECT_EQ(0, git_odb_hashfile(&oid1, CUnicodeUtils::GetUTF8(tempDir.GetTempDir() + L"\\input\\" + patch.GetFilename(0)), GIT_OBJECT_BLOB)); + CGitHash hashBefore = oid1; + EXPECT_STREQ(patch.GetRevision(0), hashBefore.ToString(patch.GetRevision(0).GetLength())); + EXPECT_EQ(TRUE, patch.PatchFile(0, 0, tempDir.GetTempDir() + L"\\input", tempDir.GetTempDir() + L"\\output\\" + patch.GetFilename2(0), L"", false)); + git_oid oid2 = { 0 }; + EXPECT_EQ(0, git_odb_hashfile(&oid2, CUnicodeUtils::GetUTF8(tempDir.GetTempDir() + L"\\output\\" + patch.GetFilename2(0)), GIT_OBJECT_BLOB)); + CGitHash hashAfter = oid2; + EXPECT_STREQ(patch.GetRevision2(0), hashAfter.ToString(patch.GetRevision2(0).GetLength())); +} -- 2.11.4.GIT