1.4.7 にしてからページ名の変更*1を行うと、最新の~件の欄に変更前のページ名と変更後のページ名の両方があらわれます。 変更前のページ名のほうは当然存在しないのでクリックすると新規ページの編集画面になってしまいます。
1.4.6 では発生していませんでした。 おそらく 1.4.7 で recent.dat まわりの変更をした影響だと思います。
if (($update == '' || check_non_list($update)) && $remove == '') return; // No needcheck_non_list($update)) の $update が ':RenameLog' のため true が返り、以降の put_lastmodified() が実行されず結果 recent.dat に反映されないように思われます。pukiwikiにあまり詳しくないためこれが仕様なのか、また私の設定不足なのかわかりませんが、少なくとも1.4.5_1では recent.dat に反映されていました。宜しくお願いいたします。 -- skydog 2007-01-28 (日) 16:36:03
page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata)); + put_lastmodified();こうすれば全てのページ名を置換えてログをとった後に必ずput_lastmodified() を実行するという昔の動作にすることはできます。
// Phase four: Rename them, Log them, Redirect function plugin_rename_phase4($pages, $files, $exists) { global $now, $_rename_messages; - if (plugin_rename_getvar('exist') == '') - foreach ($exists as $key=>$arr) + if (plugin_rename_getvar('exist') != '1') { + foreach ($exists as $key=>$arr) { unset($files[$key]); + unset($pages[$key]); + } + } set_time_limit(0); foreach ($files as $page=>$arr) { foreach ($arr as $old=>$new) { if (isset($exists[$page][$old]) && $exists[$page][$old]) unlink($new); rename($old, $new); - - // Update link database (BugTrack/327) arino - links_update($old); - links_update($new); } } (中略) if (! empty($exists)) { + if (plugin_rename_getvar('exist') != '1') { $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n"; foreach ($exists as $page=>$arr) { $postdata[] = '-' . decode($page) . $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n"; foreach ($arr as $ofile=>$nfile) $postdata[] = '--' . $ofile . $_rename_messages['msg_arrow'] . $nfile . "\n"; } $postdata[] = '----' . "\n"; + } else { + (上書きしなかった時のメッセージ(検討課題)) + } } - foreach ($pages as $old=>$new) - $postdata[] = '-' . decode($old) . - $_rename_messages['msg_arrow'] . decode($new) . "\n"; + foreach ($pages as $old=>$new) { + $old_page = decode($old); + $new_page = decode($new) + + $postdata[] = '-' . $old_page . + $_rename_messages['msg_arrow'] . $new_page . "\n"; + + lastmodified_add('', $old_page); + + links_update($old_page); + links_update($new_page); + } // At this time, collision detection is not implemented page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata)); $page = plugin_rename_getvar('page'); if ($page == '') $page = PLUGIN_RENAME_LOGPAGE; // Redirection pkwk_headers_sent(); header('Location: ' . get_script_uri() . '?' . rawurlencode($page)); exit; }まず最初のif文の条件変更ですが、「パスワード入力時点ではリネーム後のページがなかったが、置換え処理の直前には存在していた」という時は考慮しているのですが、
function lastmodified_add($update = '', $remove = '') { (中略) // Read (keep the order of the lines) $recent_pages = $matches = array(); foreach(file_head($file, $maxshow + PKWK_MAXSHOW_ALLOWANCE, FALSE) as $line) if (preg_match('/^([0-9]+)\t(.+)/', $line, $matches)) $recent_pages[$matches[2]] = $matches[1]; // Remove if it exists inside if (isset($recent_pages[$update])) unset($recent_pages[$update]); if (isset($recent_pages[$remove])) unset($recent_pages[$remove]); // Add to the top: like array_unshift() if ($update != '') $recent_pages = array($update => get_filetime($update)) + $recent_pages; // Check $abort = count($recent_pages) < $maxshow; if (! $abort) { // Write ftruncate($fp, 0); rewind($fp); foreach ($recent_pages as $_page=>$time) fputs($fp, $time . "\t" . $_page . "\n"); } flock($fp, LOCK_UN); fclose($fp); if ($abort) { put_lastmodified(); // Try to (re)create ALL return; }'recent.dat' を修正するときに、更新や削除したページの過去データを削除するまではいいんですが、
// Output to a file function file_write($dir, $page, $str, $notimestamp = FALSE) { (中略) // ---- // Delete? if ($dir == DATA_DIR && $str === '') { // Page deletion if (! $file_exists) return; // Ignore null posting for DATA_DIR // Update RecentDeleted (Add the $page) add_recent($page, $whatsdeleted, '', $maxshow_deleted); // Remove the page unlink($file); // Update RecentDeleted, and remove the page from RecentChanges lastmodified_add($whatsdeleted, $page); // Clear is_page() cache is_page($page, TRUE); return; } else if ($dir == DIFF_DIR && $str === " \n") {上でlastmodified_add() を呼ぶところは、どんな時でも$whatsdeleted を更新、$page の削除をした、として呼び出していますが、