diff --git a/pkgs/development/lisp-modules/import/repository/quicklisp.lisp b/pkgs/development/lisp-modules/import/repository/quicklisp.lisp index 9666fc9fba2a..634795ab17a4 100644 --- a/pkgs/development/lisp-modules/import/repository/quicklisp.lisp +++ b/pkgs/development/lisp-modules/import/repository/quicklisp.lisp @@ -120,16 +120,34 @@ asds 'vector)))))) - ;; Skip known broken systems and their dependents - (dolist (system *broken-systems*) - (sql-query - "with recursive broken(name) as ( - select ? - union - select s.name from quicklisp_system s, broken b - where b.name in (select value from json_each(deps)) - ) delete from quicklisp_system where name in (select name from broken)" - system)) + ;; Weed out circular dependencies from the package graph. + (sqlite:with-transaction db + (sql-query "create temp table will_delete (root,name)") + (loop for (system) in (sql-query "select name from quicklisp_system") do + (when (sql-query + "with recursive dep(root, name) as ( + select s.name, d.value + from quicklisp_system s + cross join json_each(s.deps) d + where s.name = ? + union + select dep.root, d.value + from quicklisp_system s, dep + cross join json_each(s.deps) d + where s.name = dep.name + ) select 1 from dep where name = root" + system) + (sql-query + "with recursive broken(name) as ( + select ? + union + select s.name from quicklisp_system s, broken b + where b.name in (select value from json_each(s.deps)) + ) insert into will_delete select ?, name from broken" + system system))) + (loop for (root name) in (sql-query "select root, name from will_delete") do + (warn "Circular dependency in '~a': Omitting '~a'" root name) + (sql-query "delete from quicklisp_system where name = ?" name))) (sqlite:with-transaction db ;; Should these be temp tables, that then get queried by