From: Daniel Kinzler Date: Mon, 19 Mar 2012 17:49:00 +0000 (+0000) Subject: messing with wfMerge X-Git-Tag: 1.31.0-rc.0~22097^2^2~293 X-Git-Url: http://git.heureux-cyclage.org/?a=commitdiff_plain;h=4b9a671b8fd8b1af1b2305c3476b8eafffd96caa;hp=989f0685ade5c4cd9c895b38d8824eec861c2a26;p=lhc%2Fweb%2Fwiklou.git messing with wfMerge --- diff --git a/includes/ContentHandler.php b/includes/ContentHandler.php index 07df8a5e21..1a80b371f9 100644 --- a/includes/ContentHandler.php +++ b/includes/ContentHandler.php @@ -201,7 +201,22 @@ abstract class ContentHandler { return $de; } - #XXX: is the native model for wikitext a string or the parser output? parse early or parse late? + /** + * attempts to merge differences between three versions. + * Returns a new Content object for a clean merge and false for failure or a conflict. + * + * This default implementation always returns false. + * + * @param $oldContent String + * @param $myContent String + * @param $yourContent String + * @return Content|Bool + */ + public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) { + return false; + } + + #TODO: cover patch/undo just like merge3. #TODO: how to handle extra message for JS/CSS previews?? #TODO: Article::showCssOrJsPage ---> specialized classes! @@ -221,6 +236,34 @@ abstract class TextContentHandler extends ContentHandler { return $content->getRawData(); } + /** + * attempts to merge differences between three versions. + * Returns a new Content object for a clean merge and false for failure or a conflict. + * + * This text-based implementation uses wfMerge(). + * + * @param $oldContent String + * @param $myContent String + * @param $yourContent String + * @return Content|Bool + */ + public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) { + $format = $this->getDefaultFormat(); + + $old = $this->serialize( $oldContent, $format ); + $mine = $this->serialize( $myContent, $format ); + $yours = $this->serialize( $yourContent, $format ); + + $ok = wfMerge( $old, $mine, $yours, $result ); + + if ( !$ok ) return false; + if ( !$result ) return $this->emptyContent(); + + $mergedContent = $this->unserialize( $result, $format ); + return $mergedContent; + } + + } class WikitextContentHandler extends TextContentHandler { diff --git a/includes/EditPage.php b/includes/EditPage.php index bf166be9a2..91d2be4789 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1312,7 +1312,7 @@ class EditPage { $text = $this->textbox1; // do not try to merge here! } elseif ( $this->isConflict ) { # Attempt merge - if ( $this->mergeChangesInto( $text ) ) { #FIXME: use ContentHandler + if ( $this->mergeChangesInto( $text ) ) { #FIXME: passe/receive Content object // Successful merge! Maybe we should tell the user the good news? $this->isConflict = false; wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" ); @@ -1515,7 +1515,7 @@ class EditPage { wfProfileOut( __METHOD__ ); return false; } - $baseText = $baseRevision->getText(); + $baseContent = $baseRevision->getContent(); // The current state, we want to merge updates into it $currentRevision = Revision::loadFromTitle( $db, $this->mTitle ); @@ -1523,11 +1523,14 @@ class EditPage { wfProfileOut( __METHOD__ ); return false; } - $currentText = $currentRevision->getText(); + $currentContent = $currentRevision->getContent(); - $result = ''; - if ( wfMerge( $baseText, $editText, $currentText, $result ) ) { - $editText = $result; + $handler = ContentHandler::getForModelName( $baseContent->getModelName() ); + $editContent = $handler->unserialize( $editText ); #FIXME: supply serialization fomrat from edit form! + + $result = $handler->merge3( $baseContent, $editContent, $currentContent ); + if ( $result ) { + $editText = ContentHandler::getContentText($result); #FIXME: supply serialization fomrat from edit form! wfProfileOut( __METHOD__ ); return true; } else {