Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Ungureanu <marius.ungureanu@xamarin.com>2014-04-09 17:26:54 +0400
committerMarius Ungureanu <marius.ungureanu@xamarin.com>2014-04-09 17:27:44 +0400
commita8c76b81ae114cff0540663097fb705179cf93d2 (patch)
tree5bf28228b28a4ce0580b5a70fc41a36a36747d98 /main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/MergeWidget.cs
parentcba38340e1a291d87909fd735bea48fc78aeebe9 (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.cs32
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),