public function patchString($string, $patch, $reverse = false) { if (!ereg("\n\$", $string)) { $string .= "\n"; } if (!ereg("\n\$", $patch)) { $patch .= "\n"; } if ($reverse == false) { return xdiff_string_patch($string, $patch); } else { return xdiff_string_patch($string, $patch, XDIFF_PATCH_REVERSE); } }
function devices_view_history($id, $ts) { global $db; /* Device information */ $r = $db->get_row("SELECT devicename,description,filename,password FROM devices WHERE id='{$id}'"); ?> <p><a href="<?php echo $_SERVER['PHP_SELF']; ?> ">« List Devices</a> <a href="<?php echo $_SERVER['PHP_SELF']; ?> ?action=view&id=<?php echo $id; ?> ">« Configuration</a> <a href="<?php echo $_SERVER['PHP_SELF']; ?> ?action=patches&id=<?php echo $id; ?> ">« History</a> <p><strong>Device Name:</strong> <?php echo $r['devicename']; ?> <br><strong>File Name:</strong> <?php echo $r['filename']; ?> <p><strong>Historic Configuration:</strong> <p> <?php /* Get current config */ $r = $db->get_row("SELECT content FROM configurations WHERE device='{$id}'"); $config = $r['content']; echo "-> retrieving current configuration<br>\n"; /* Apply patches */ $rows = $db->get_rows("SELECT ts,content FROM patches WHERE device='{$id}' ORDER BY ts ASC"); $rev = count($rows) - 1; for ($rev; $rev >= 0; $rev--) { $row = $rows[$rev]; /* Only apply patches that are newer then the requested date */ if ($row['ts'] >= $ts) { echo "-> applying patch revision " . $rev . ", date " . devices_ts_to_date($row['ts']) . "<br>\n"; $config = xdiff_string_patch($config, $row['content']); } } ?> <pre> <?php echo $config; ?> </pre> <p><a href="<?php echo $_SERVER['PHP_SELF']; ?> ">« List Devices</a> <a href="<?php echo $_SERVER['PHP_SELF']; ?> ?action=view&id=<?php echo $id; ?> ">« Configuration</a> <a href="<?php echo $_SERVER['PHP_SELF']; ?> ?action=patches&id=<?php echo $id; ?> ">« History</a> <?php }
/** * Patches (or reverse-patches) string with a diff. * * @param string $string * @param string $patch * @param bool $reverse * @return string */ public static function patchString($string, $patch, $reverse = false) { // fix "no new line at the end" problem. $string = Wikidot_Util_String::addTrailingNewline($string); $patch = Wikidot_Util_String::addTrailingNewline($patch); if ($reverse == false) { $flags = XDIFF_PATCH_NORMAL; } else { $flags = XDIFF_PATCH_REVERSE; } $errors = array(); $r = xdiff_string_patch($string, $patch, $flags, &$errors); if (count($errors) > 0) { throw new Wikidot_Exception("Error while applying the patch."); } return $r; }