+sub clone_all {
+ my ($self, $todo, $m) = @_;
+ # handle no-dependency repos, first
+ for (@{delete($todo->{''}) // []}) {
+ clone_v1($_, 1);
+ return if $self->{lei}->{child_error};
+ }
+ # resolve references, deepest, first:
+ while (scalar keys %$todo) {
+ for my $x (keys %$todo) {
+ my $nr;
+ # resolve multi-level references
+ while (defined(my $nxt = $m->{$x}->{reference})) {
+ exists($todo->{$nxt}) or last;
+ die <<EOM if ++$nr > 1000;
+E: dependency loop detected (`$x' => `$nxt')
+EOM
+ $x = $nxt;
+ }
+ my $y = delete $todo->{$x} // next; # already done
+ for (@$y) {
+ clone_v1($_, 1);
+ return if $self->{lei}->{child_error};
+ }
+ last; # restart %$todo iteration
+ }
+ }
+}
+