From 8b79ad7a6483b0623c7e44691f5cca52783660ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Tue, 9 May 2017 14:27:49 +0200 Subject: [Ide] Preserve encoding when doing find in files. The find in files operation could add BOMs. --- .../MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FileProvider.cs | 9 +++++++-- .../MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FindReplace.cs | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'main') diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FileProvider.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FileProvider.cs index 0c57a7c40e..5b8b035080 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FileProvider.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FileProvider.cs @@ -60,6 +60,8 @@ namespace MonoDevelop.Ide.FindInFiles set; } + public Encoding CurrentEncoding { get; private set; } + public FileProvider(string fileName) : this(fileName, null) { } @@ -107,7 +109,9 @@ namespace MonoDevelop.Ide.FindInFiles return null; if (!readBinaryFiles && TextFileUtility.IsBinary (FileName)) return null; - return TextFileUtility.OpenStream (FileName); + var sr = TextFileUtility.OpenStream (FileName); + CurrentEncoding = sr.CurrentEncoding; + return sr; } catch (Exception e) { LoggingService.LogError ("Error while opening " + FileName, e); return null; @@ -126,11 +130,12 @@ namespace MonoDevelop.Ide.FindInFiles IDisposable undoGroup; Encoding encoding; - public async void BeginReplace (string content) + public async void BeginReplace (string content, Encoding encoding) { somethingReplaced = false; buffer = new StringBuilder (content); document = await SearchDocument (); + this.encoding = encoding; if (document != null) { Gtk.Application.Invoke (delegate { undoGroup = document.Editor.OpenUndoGroup (); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FindReplace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FindReplace.cs index f70545988b..2a90d12253 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FindReplace.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.FindInFiles/FindReplace.cs @@ -85,6 +85,7 @@ namespace MonoDevelop.Ide.FindInFiles public TextReader Reader; public List Results; public string Text { get; internal set; } + public System.Text.Encoding Encoding { get; internal set; } public FileSearchResult (FileProvider provider, TextReader reader, List results) { @@ -172,6 +173,7 @@ namespace MonoDevelop.Ide.FindInFiles Interlocked.Increment (ref searchedFilesCount); if (replacePattern != null) { content.Text = content.Reader.ReadToEnd (); + content.Encoding = content.Provider.CurrentEncoding; content.Reader = new StringReader (content.Text); } content.Results.AddRange(FindAll (monitor, content.Provider, content.Reader, pattern, replacePattern, filter)); @@ -193,7 +195,7 @@ namespace MonoDevelop.Ide.FindInFiles if (content.Results.Count == 0) continue; try { - content.Provider.BeginReplace (content.Text); + content.Provider.BeginReplace (content.Text, content.Encoding); Replace (content.Provider, content.Results, replacePattern); content.Provider.EndReplace (); } catch (Exception e) { @@ -248,7 +250,7 @@ namespace MonoDevelop.Ide.FindInFiles continue; matches.Add(match); } - provider.BeginReplace (content); + provider.BeginReplace (content, provider.CurrentEncoding); int delta = 0; for (int i = 0; !monitor.CancellationToken.IsCancellationRequested && i < matches.Count; i++) { Match match = matches[i]; -- cgit v1.2.3