private function getBaseDir($sourceDir)
 {
     return FilesystemTools::slotDir($sourceDir, $this->options);
 }
 private function doSaveBlocks(BlockManagerApprover $approver, $basePath, array $options)
 {
     $options["slot"] = basename($basePath);
     $slotPath = sprintf('%s/contributors/%s', FilesystemTools::slotDir($this->baseDir, $options), $this->username);
     if (!is_dir($slotPath)) {
         return array();
     }
     $activeSlotDefinition = json_decode(FilesystemTools::readFile($basePath . '/active/slot.json'), true);
     $contributorSlotDefinition = json_decode(FilesystemTools::readFile($slotPath . '/slot.json'), true);
     $removedBlocks = array();
     $contributorSlotDefinitionBlocks = $contributorSlotDefinition["blocks"];
     if (null === $contributorSlotDefinitionBlocks) {
         $contributorSlotDefinitionBlocks = array();
     }
     if (null !== $activeSlotDefinition) {
         $removedBlocks = array_diff_key($activeSlotDefinition["blocks"], $contributorSlotDefinitionBlocks);
     }
     foreach ($removedBlocks as $blockName) {
         $options["blockname"] = $blockName;
         $approver->approveRemoval($this->baseDir, $options, $this->username);
     }
     $approvedBlocks = array();
     $blocks = array_diff_key($contributorSlotDefinitionBlocks, $removedBlocks);
     foreach ($blocks as $blockName) {
         $options["blockname"] = $blockName;
         $approved = $approver->approve($this->baseDir, $options, $this->username);
         $approvedBlocks[] = $approved;
     }
     return $approvedBlocks;
 }