1 diff -r 3131859d555c MoinMoin/packages.py 2 --- a/MoinMoin/packages.py Tue Jul 30 17:58:46 2013 +0200 3 +++ b/MoinMoin/packages.py Fri Nov 01 23:52:24 2013 +0100 4 @@ -4,11 +4,13 @@ 5 6 @copyright: 2005 MoinMoin:AlexanderSchremmer, 7 2007-2010 MoinMoin:ReimarBauer 8 + 2013 MoinMoin:PaulBoddie 9 @license: GNU GPL, see COPYING for details. 10 """ 11 12 import os, re, sys 13 import zipfile 14 +import subprocess, time 15 16 from MoinMoin import config, wikiutil, caching, user 17 from MoinMoin.Page import Page 18 @@ -48,12 +50,12 @@ 19 elog = eventlog.EventLog(self.request) 20 elog.add(self.request, eventtype, {'pagename': pagename}, 1, mtime_usecs) 21 22 -def edit_logfile_append(self, pagename, pagefile, rev, action, logname='edit-log', comment=u'', author=u"Scripting Subsystem"): 23 +def edit_logfile_append(self, pagename, pagefile, rev, action, logname='edit-log', comment=u'', author=u"Scripting Subsystem", mtime=None): 24 glog = editlog.EditLog(self.request, uid_override=author) 25 pagelog = Page(self.request, pagename).getPagePath(logname, use_underlay=0, isfile=1) 26 llog = editlog.EditLog(self.request, filename=pagelog, 27 uid_override=author) 28 - mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile)) 29 + mtime_usecs = wikiutil.timestamp2version(mtime and int(mtime) or os.path.getmtime(pagefile)) 30 host = '::1' 31 extra = u'' 32 glog.add(self.request, mtime_usecs, rev, action, pagename, host, comment) 33 @@ -96,18 +98,24 @@ 34 """ 35 return (string.lower() in ('yes', 'true', '1')) 36 37 +class IAmRoot(object): 38 + def __getattr__(self, name): 39 + return lambda *args, **kwargs: True 40 + 41 class ScriptEngine: 42 """ 43 The script engine supplies the needed commands to execute the installation 44 script. 45 """ 46 47 - def _extractToFile(self, source, target): 48 + def _extractToFile(self, source, target, mtime=None): 49 """ Extracts source and writes the contents into target. """ 50 - # TODO, add file dates 51 + # TODO, add file dates using some kind of native Python library supporting fdutimensat or equivalent 52 target_file = open(target, "wb") 53 target_file.write(self.extract_file(source)) 54 target_file.close() 55 + if mtime is not None: 56 + subprocess.call(["touch", "-m", "-d", time.strftime("%Y-%m-%d %H:%M:%S +0000", time.gmtime(int(mtime))), target]) 57 58 def __init__(self): 59 self.themename = None 60 @@ -118,7 +126,7 @@ 61 self.msg = getattr(self, "msg", "") 62 self.request = getattr(self, "request", None) 63 64 - def do_addattachment(self, zipname, filename, pagename, author=u"Scripting Subsystem", comment=u""): 65 + def do_addattachment(self, zipname, filename, pagename, author=u"Scripting Subsystem", comment=u"", mtime=None): 66 """ 67 Installs an attachment 68 69 @@ -137,12 +145,12 @@ 70 rev = page.current_rev() 71 path = page.getPagePath(check_create=0) 72 if not os.path.exists(target): 73 - self._extractToFile(zipname, target) 74 + self._extractToFile(zipname, target, mtime) 75 if os.path.exists(target): 76 filesys.chmod(target, 0666 & config.umask) 77 action = 'ATTNEW' 78 edit_logfile_append(self, pagename, path, rev, action, logname='edit-log', 79 - comment=u'%(filename)s' % {"filename": filename}, author=author) 80 + comment=u'%(filename)s' % {"filename": filename}, author=author, mtime=mtime) 81 self.msg += u"%(filename)s attached \n" % {"filename": filename} 82 else: 83 self.msg += u"%(filename)s not attached \n" % {"filename": filename} 84 @@ -286,7 +294,7 @@ 85 86 self.msg += package.msg 87 88 - def do_addrevision(self, filename, pagename, author=u"Scripting Subsystem", comment=u"", trivial=u"No"): 89 + def do_addrevision(self, filename, pagename, author=u"Scripting Subsystem", comment=u"", mtime=None, trivial=u"No"): 90 """ Adds a revision to a page. 91 92 @param filename: name of the file in this package 93 @@ -298,7 +306,7 @@ 94 _ = self.request.getText 95 trivial = str2boolean(trivial) 96 if self.request.user.may.write(pagename): 97 - page = PageEditor(self.request, pagename, do_editor_backup=0) 98 + page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author, mtime=mtime and int(mtime)) 99 try: 100 page.saveText(self.extract_file(filename).decode("utf-8"), 0, trivial=trivial, comment=comment) 101 except PageEditor.Unchanged: 102 @@ -555,6 +563,7 @@ 103 # Setup MoinMoin environment 104 from MoinMoin.web.contexts import ScriptContext 105 request = ScriptContext(url=request_url) 106 + request.user.may = IAmRoot() 107 108 package = ZipPackage(request, packagefile) 109 if not package.isPackage():