private void Visit(SortItemData <T> item) { if (_cycleFound) { return; } if (item.Mark == Mark.Permanent) { return; } if (item.Mark == Mark.Temporary) { _logger.Minimal($"Cannot sort by dependencies, cycle found at item {item}"); _cycleFound = true; return; } item.Mark = Mark.Temporary; foreach (var dep in NodesDependedOn(item)) { Visit(dep); } item.Mark = Mark.Permanent; _sortedList.Add(item.Item); }
private void Visit(SortItemData item) { if (_cycleFound) { return; } if (item.Mark == Mark.Permanent) { return; } if (item.Mark == Mark.Temporary) { _logger.Minimal($"Cannot sort packages by dependencies, cycle found at package {item.PackageId}"); _cycleFound = true; return; } item.Mark = Mark.Temporary; var nodesDependedOn = item.Dependencies .Select(dep => _data.FirstOrDefault(i => i.PackageId == dep.Id)) .Where(dep => dep != null); foreach (var dep in nodesDependedOn) { Visit(dep); } item.Mark = Mark.Permanent; _sortedList.Add(item.PackageUpdateSet); }
private IEnumerable <SortItemData <T> > NodesDependedOn(SortItemData <T> item) { return(item.Dependencies .Select(dep => _data.FirstOrDefault(i => _match(i.Item, dep))) .Where(dep => dep != null)); }