ru:tips:fixmtime
Исправление времени правок по временным кодам
Если вы решили передвинуть сайт на другой хост, используя FTP
и tar
-архивацию, время создания файлов изменится и перестанет совпадать с временными кодами в мета-информации. Характерный симптом - вместо автора актуальной правки в списке правок страниц появляется строчка внешнее изменение
. Нижеследующие скрипты восстанавливают эти несоответствия.
Вариант на Python
Этот скрипт запускать из папки data/pages
.
import os path = os.path os.stat_float_times(False) meta = path.join(os.pardir, 'meta') assert path.isdir(meta) for root, dirs, filenames in os.walk(os.curdir): for filename in filenames: base, ext = path.splitext(filename) changelog = path.join(meta, root, base + ".changes") if not path.isfile(changelog): print "Changelog not found: %s" % changelog continue timestamp = 0 for line in open(changelog): timestamp = int(line.split()[0]) file = path.join(root, filename) print "updating %s" % file print " timestamp: %s" % timestamp print " old modification time: %s" % path.getmtime(file) os.utime(file, (timestamp, timestamp)) print " new modification time: %s" % path.getmtime(file)
Вариант на PHP
Этот скрипт запускать из установочной папки Dokuwiki.
<?php /** * Fix modification times based on timestamps. Run from within DokuWiki installation directory. * @Author: dreamlusion <http://dreamlusion.eucoding.com> * last modified: 2008-09-05 4:15:00 */ function WalkDirectory($parentDirectory) { global $_weeds; foreach(array_diff(scandir($parentDirectory), $_weeds) as $directory) { $path = $parentDirectory . '/'. $directory; if(is_dir($path)) { WalkDirectory($path); } else { // Calculate changes file path. $path_parts = pathinfo($path); // Remove pages path. global $_pagesPath; $relativePath = substr($path_parts['dirname'], strlen($_pagesPath), strlen($path_parts['dirname'])); // Add <filename>.changes $filename = $path_parts['filename']; // Requires PHP 5.2.0 (http://gr2.php.net/manual/en/function.pathinfo.php) $relativePath .= '/' . $filename . '.' . 'changes'; global $_metaPath; $changelog = $_metaPath . '/' . $relativePath; if (is_file($changelog)) { $handle = @fopen($changelog, "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle); preg_match('/(?<timestamp>\d+)/', $buffer, $matches); if ($matches['timestamp'] != '') $timestamp = $matches['timestamp']; } fclose($handle); } // At this point we have our timestamp. echo 'Updating ' . $path . '<br />'; echo ' Timestamp in changelog: ' . $timestamp . '<br />'; echo ' Old modification time: ' . filemtime($path) . '<br />'; if (touch($path, $timestamp)) { // In my host, although the timestamp had changed successfully (checked manually), running filemtime($path) at this point // did not return the correct timestamp, so use I use $timestamp instead of filemtime($path) to avoid confusing the user. echo ' New modification time: ' . $timestamp . '<br />'; } else { echo ' Could not change modification time for page ' . $filename; } } else { echo 'Changelog not found: ' . $changelog . '<br />'; } } } } $_weeds = array('.', '..'); $_pagesPath = getcwd() . '/data/pages'; $_metaPath = getcwd() . '/data/meta'; WalkDirectory($_pagesPath); ?>
ru/tips/fixmtime.txt · Последнее изменение: 2013-08-28 13:41 — 217.150.76.2