/** * Overload Sprig::update() to save revision change * @param bump whether to bump the version number */ public function update($bump = TRUE) { Kohana::$log->add(Kohana::DEBUG, 'Executing Versioned_Sprig::update'); $updated = FALSE; foreach ($this->_fields as $field => $object) { if ($object instanceof Sprig_Field_Tracked and $this->changed($field)) { $this->comment = UTF8::ucwords($object->label) . ' changed from "' . $this->_original[$field] . '" to "' . $this->_changed[$field] . '".'; } if ($object instanceof Sprig_Field_Versioned and $this->changed($field) and $bump) { $diff = ''; if ($this->version != 0) { $diff = Versioned::diff($this->_original[$field], $this->_changed[$field]); $diff = Versioned::clean_array($diff); $diff = serialize($diff); } $this->version++; $revision = Sprig::factory($this->_model . '_revision'); $revision->values(array('entry' => $this->id, 'version' => $this->version, 'editor' => $this->editor, 'diff' => $diff)); $revision->comments = $this->comments; $revision->create(); $updated = TRUE; $this->comments = array(); } } if (!$updated and count($this->comments) > 0) { $revision = Sprig::factory($this->_model . '_revision'); $revision->entry = $this->id; $revision->version = $this->version; $revision->load(); $revision->comments = array_merge($revision->comments, $this->comments); $revision->update(); } return parent::update(); }
/** * Test diff by word */ public function testDiffByWord() { $diff = Versioned::diff($this->text1, $this->text2); $this->assertEquals('An', $diff[1]); $this->assertEquals('original', $diff[2]['d'][0]); $this->assertEquals('unoriginal', $diff[2]['i'][0]); $this->assertEquals('an', $diff[4]['d'][0]); $this->assertEquals('extra', $diff[4]['d'][1]); }
/** * Populate table with versions */ private function populate($id) { $text1 = "This is my string"; $text2 = "This is my first string"; // inserted "first" $text3 = "This is our first string"; // changed "my" to "our" $text4 = "This is our first"; // dropped "string" $diff2 = serialize(Versioned::clean_array(Versioned::diff($text1, $text2))); $diff3 = serialize(Versioned::clean_array(Versioned::diff($text2, $text3))); $diff4 = serialize(Versioned::clean_array(Versioned::diff($text3, $text4))); try { DB::insert('entry_revisions', array('entry_id', 'version', 'diff'))->values(array($id, 1, ''))->execute(); DB::insert('entry_revisions', array('entry_id', 'version', 'diff'))->values(array($id, 2, $diff2))->execute(); DB::insert('entry_revisions', array('entry_id', 'version', 'diff'))->values(array($id, 3, $diff3))->execute(); DB::insert('entry_revisions', array('entry_id', 'version', 'diff'))->values(array($id, 4, $diff4))->execute(); DB::insert('entries', array('id', 'version', 'text'))->values(array($id, 4, $text4))->execute(); } catch (Database_Exception $e) { echo $e->getMessage(); } }