/** * @param $sourceDir * @param $targetDir * @param $isDryRun * @return Observable\ConnectableObservable */ public function execute($sourceDir, $targetDir, $isDryRun) { $files = Observable::fromIterator($this->filesystem->ls($sourceDir)); $filesWithDate = $this->fileWithDateRepository->extractDateFrom($files)->publish(); $symlinkCommands = $this->symlinkCommandRepository->createSymlinkCommands($filesWithDate, new Path($targetDir)); $summary = $this->summaryRepository->summarize($filesWithDate); $symlinkCommands->merge($summary)->subscribe($this->output); if (!$isDryRun) { $symlinkCommands->subscribeCallback(function (SymlinkCommand $cmd) { $this->output->onNext("write file"); $this->linkRepository->createLink($cmd->getSource(), $cmd->getTarget()); }); } $filesWithDate->connect(); }