getActiveVersion(); if ($this->rebuildText($parentContent) === $snipContents) { return; } // Create new snipContent entity with previous one as parent $content = new SnipContent(); $content ->setText($snipContents) ->setSnip($snip) ; if ($parentContent !== null) { $content->setParent($parentContent); $this->contentToRelative($parentContent); } $this->em->persist($content); $this->em->flush(); $snip->setActiveVersion($content); $this->em->persist($snip); $this->em->flush(); } public function getActiveText(Snip $snip): string { $contentRepo = $this->em->getRepository(SnipContent::class); return $this->rebuildText($contentRepo->find($snip->getActiveVersion())); } public function rebuildText(SnipContent $snipContent): string { if ($snipContent->getText()) { return $snipContent->getText(); } $parentContent = $snipContent->getParent(); if ($parentContent === null && $snipContent->getDiff() === null) { return '---Something went very wrong, cant rebuild the text---'; } return MyersDiff::rebuildBFromCompact( $this->rebuildText($parentContent), $snipContent->getDiff() ); } public function setVersion(Snip $snip, SnipContent $version): void { $activeVersion = $snip->getActiveVersion(); $this->contentToAbsolute($version); $this->contentToRelative($activeVersion); $snip->setActiveVersion($version); $this->em->persist($snip); $this->em->flush(); } public function contentToRelative(SnipContent $content): void { if ($content->getText() === null || $content->getParent() === null) { return; } $contentText = $content->getText(); $parentText = $this->rebuildText($content->getParent()); $diff = MyersDiff::calculate($parentText, $contentText); $content->setDiff($diff); $content->setText(null); $this->em->persist($content); $this->em->flush(); } public function contentToAbsolute(SnipContent $content): void { if ($content->getDiff() === null) { return; } $content->setText($this->rebuildText($content)); $content->setDiff(null); $this->em->persist($content); $this->em->flush(); } public function delete(Snip $snip): void { // Cleanup the versions } }