messing with wfMerge
authorDaniel Kinzler <daniel.kinzler@wikimedia.de>
Mon, 19 Mar 2012 17:49:00 +0000 (17:49 +0000)
committerDaniel Kinzler <daniel.kinzler@wikimedia.de>
Wed, 4 Apr 2012 17:55:50 +0000 (19:55 +0200)
includes/ContentHandler.php
includes/EditPage.php

index 07df8a5..1a80b37 100644 (file)
@@ -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 {
 
index bf166be..91d2be4 100644 (file)
@@ -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 {