diff --git a/makefile.shade b/makefile.shade index cb78b8e43b..35f8211f4a 100644 --- a/makefile.shade +++ b/makefile.shade @@ -929,15 +929,31 @@ functions { get { - if (Dependencies.Count > 0) - { - return 1 + Dependencies.Max(d => d.Order); - } - - return 1; + return GetOrder(new List(), this); } } + private static int GetOrder(List visited, RepositoryInfo info) + { + if (visited.Contains(info)) + { + throw new Exception("A cyclic dependency between the following repositories has been detected: " + + string.Join(" -> ", visited)); + } + + visited.Add(info); + + var order = 0; + foreach (var dependency in info.Dependencies) + { + order = Math.Max(order, GetOrder(visited, dependency)); + } + + visited.RemoveAt(visited.Count - 1); + + return order + 1; + } + public override string ToString() { return Name;