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);
        }
Example #2
0
        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));
 }