public function createTree() { $tree = new Tree(); foreach ($this->entries as $name => $entry) { $explosion = explode("/", $name); $blob_name = array_pop($explosion); $current_tree = $tree; foreach ($explosion as $subtree_name) { if (!$current_tree->hasNodeNamed($subtree_name)) { $subtree = new Tree(); $subtree_node = new TreeNode(); $subtree_node->setTree($subtree); $subtree_node->setName($subtree_name); $current_tree->addNode($subtree_node); } $node = $current_tree->getNodeNamed($subtree_name); if (!$node instanceof TreeNode) { throw new InvalidTypeException("Blob path {$name} specifies another blob as parent tree, which is impossible"); } $current_tree = $node->getTree(); } $blob_node = $entry->createBlobNode(); $blob_node->setName($blob_name); $current_tree->addNode($blob_node); } return $tree; }