static (VbpLine, Comparison) FindLine(VbpLine queryLine, Vbp targetVbp) { var searchSpace = targetVbp.Lines.Where(targetLine => (!targetLine.processed) && (targetLine.Section == queryLine.Section)); foreach (var targetLine in searchSpace) { var comparison = queryLine.Compare(targetLine); if (comparison != Comparison.different) { return(targetLine, comparison); } } return(null, Comparison.different); }
static void ProcessStep(Vbp vbpOurs, Vbp vbpTheirs, Vbp vbpCommon) { var unprocLines = vbpOurs.Lines.Where(ourLine => !ourLine.processed); foreach (var ourLine in unprocLines) { if (ourLine.Line == "") { ourLine.mergestatsus = MergeStatus.excluded; } else { (var theirLine, var compareTheirs) = FindLine(ourLine, vbpTheirs); if (compareTheirs == Comparison.different) { (var commonLine, var compareCommon) = FindLine(ourLine, vbpCommon); if (compareCommon == Comparison.different) { ourLine.mergestatsus = MergeStatus.included; } else { ourLine.mergestatsus = MergeStatus.excluded; } } else { theirLine.processed = true; theirLine.mergestatsus = MergeStatus.excluded; ourLine.mergestatsus = MergeStatus.included; if (compareTheirs == Comparison.modified) { (var commonOurs, var compareCommonOurs) = FindLine(ourLine, vbpCommon); if (compareCommonOurs == Comparison.equal) { theirLine.mergestatsus = MergeStatus.included; ourLine.mergestatsus = MergeStatus.excluded; } } } } ourLine.processed = true; } }
static IEnumerable <string> Merge(Vbp vbpOurs, Vbp vbpTheirs) { var oursIncluded = NumerateAndFilter(vbpOurs).ToList(); var theirsIncluded = NumerateAndFilter(vbpTheirs); foreach (var element in theirsIncluded) { var objective = oursIncluded.Where(x => x.Item2.Section == element.Item2.Section && x.Item1 > element.Item1).FirstOrDefault(); if (objective == null) { objective = oursIncluded.Where(x => x.Item1 > element.Item1).FirstOrDefault(); } if (objective == null) { oursIncluded.Append(element); } else { oursIncluded.Insert(oursIncluded.IndexOf(objective), element); } } return(oursIncluded.Select(x => x.Item2.Line)); }
private static IEnumerable <Tuple <int, VbpLine> > NumerateAndFilter(Vbp vbp) { return(vbp.Lines.Select((item, index) => new Tuple <int, VbpLine>(index, item)).Where(x => x.Item2.mergestatsus == MergeStatus.included)); }