From aa97e4d7775906d827bbeda5c85d639b71ce78fa Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 26 Aug 2016 10:19:21 -0700 Subject: [PATCH] Fail gracefully when repositories have cycles Fixes #451 --- makefile.shade | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) 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;