diff options
author | Marius Ungureanu <marius.ungureanu@xamarin.com> | 2014-04-09 17:26:54 +0400 |
---|---|---|
committer | Marius Ungureanu <marius.ungureanu@xamarin.com> | 2014-04-09 17:27:44 +0400 |
commit | a8c76b81ae114cff0540663097fb705179cf93d2 (patch) | |
tree | 5bf28228b28a4ce0580b5a70fc41a36a36747d98 /main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs | |
parent | cba38340e1a291d87909fd735bea48fc78aeebe9 (diff) |
[MergeWidget] Fix infinite loop.
When the text contained merge delimiters not at the start of the line it caused an infinite loop.
Diffstat (limited to 'main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs')
-rw-r--r-- | main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs index 6f0acb0286..ab9c7898d6 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs @@ -116,19 +116,29 @@ namespace MonoDevelop.VersionControl.Views } // todo: move to version control backend + const string conflictStart = "<<<<<<<"; + const string conflictDivider = "======="; + const string conflictEnd = ">>>>>>>"; + static IEnumerable<Conflict> Conflicts (TextDocument doc) { - int mergeStart = 0; - while ((mergeStart = doc.IndexOf ("<<<<<<<", mergeStart, doc.TextLength - mergeStart, StringComparison.Ordinal)) >= 0) { - DocumentLine start = doc.GetLineByOffset (mergeStart); - if (start.Offset != mergeStart) - continue; - int dividerOffset = doc.IndexOf ("=======", mergeStart, doc.TextLength - mergeStart, StringComparison.Ordinal); - DocumentLine divider = doc.GetLineByOffset (dividerOffset); - - int endOffset = doc.IndexOf (">>>>>>>", dividerOffset, doc.TextLength - dividerOffset, StringComparison.Ordinal); - DocumentLine end = doc.GetLineByOffset (endOffset); - mergeStart = dividerOffset + 1; + var startLines = new List<DocumentLine> (); + var dividerLines = new List<DocumentLine> (); + var endLines = new List<DocumentLine> (); + foreach (var line in doc.Lines) { + int len = Math.Min (7, line.Length); + if (doc.IndexOf (conflictStart, line.Offset, len, StringComparison.Ordinal) >= 0) + startLines.Add (line); + else if (doc.IndexOf (conflictDivider, line.Offset, len, StringComparison.Ordinal) >= 0) + dividerLines.Add (line); + else if (doc.IndexOf (conflictEnd, line.Offset, len, StringComparison.Ordinal) >= 0) + endLines.Add (line); + } + + for (int i = 0; i < startLines.Count; ++i) { + var start = startLines [i]; + var divider = dividerLines [i]; + var end = endLines [i]; yield return new Conflict (new TextSegment (start.EndOffsetIncludingDelimiter, divider.Offset - start.EndOffsetIncludingDelimiter), new TextSegment (divider.EndOffsetIncludingDelimiter, end.Offset - divider.EndOffsetIncludingDelimiter), |