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