# -*- mode: python; indent-tabs-mode: t, tab-width: 4 -*- """ This allows the user to create a file "timestamps" in their datadir, that will override the timestamp of any given blog entry. Each line in this file should be of the form "YYYY-MM-DD-hh-mm file-name". Then for any entry that one of these lines exist the system will use that timestamp instead of the actual files modification time. Note: the filename is relative to your data-dir. Example of a line for the file /var/data-dir/school/abc.txt where the datadir is "/var/data-dir/" and the date is Aug 9, 2004. 2004-08-09-00-00 school/abc.txt """ __author__ = 'Nathan Kent Bullock, Ryan Barrett' __homepage__ = 'http://snarfed.org/space/hardcodedates' __email__ = 'nathan_kent_bullock -at- yahoo.ca, hardcodedates -at- ryanb.org' __version__ = '1.4' from Pyblosxom import tools import os, os.path, posix, re, stat, time FILETIME = re.compile('^([0-9]{4})-([0-1][0-9])-([0-3][0-9])-([0-2][0-9])-([0-5][0-9]) +(.*)$') all_timestamps = {} extensions = [] timestamps_to_save = {} def init(request): if all_timestamps: return # already initialized datadir = request.getConfiguration()['datadir'] timestamp_file = os.path.join(datadir, 'timestamps') if os.path.isfile(timestamp_file): f = file(timestamp_file) for str in f.readlines(): m = FILETIME.search(str.strip()) if m: year = int(m.group(1)) mo = int(m.group(2)) day = int(m.group(3)) hr = int(m.group(4)) minute = int(m.group(5)) mtime = time.mktime((year,mo,day,hr,minute,0,0,0,-1)) filename = os.path.join(datadir, m.group(6)) all_timestamps[filename] = mtime f.close() extensions.extend(request.getData()['extensions'].keys()) extensions.append(request.getConfiguration().get('comment_ext', 'cmt')) def cb_filestat(args): request = args['request'] init(request) filename = args['filename'] extension = os.path.splitext(filename)[1][1:] datadir = request.getConfiguration()['datadir'] if all_timestamps.has_key(filename): # we know this file's timestamp mtime = args['mtime'] assert isinstance(mtime, (tuple, posix.stat_result)) args['mtime'] = (mtime[0:stat.ST_MTIME] + (all_timestamps[filename],) + mtime[stat.ST_MTIME + 1:]) elif extension in extensions and filename.startswith(datadir): # we don't know it, but we should. ask the os for it, and remember it. args['mtime'] = os.stat(filename) all_timestamps[filename] = args['mtime'][stat.ST_MTIME] timestamps_to_save[filename] = args['mtime'][stat.ST_MTIME] return args def cb_end(args): if timestamps_to_save: datadir = args['request'].getConfiguration()['datadir'] datadir = os.path.normpath(datadir) tsfile = file(os.path.join(datadir, 'timestamps'), 'a') for filename, mtime in timestamps_to_save.items(): time_str = time.strftime('%Y-%m-%d-%H-%M', time.localtime(mtime)) # strip the datadir prefix and directory separator slash filename = filename[len(datadir) + 1:] tsfile.write('%s %s\n' % (time_str, filename)) tools.getLogger().info('Saved mtime %s for %s' % (time_str, filename)) tsfile.close() timestamps_to_save.clear()