# HG changeset patch
# User ReimarBauer <R.Bauer@fz-juelich.de>
# Node ID 1fbf6795947a2497ca90a2bcfa7c8550e994a329
# Parent  9dcfb8f3652473459b7a2e5f727718666ae99b37
added funtionality of AddAtachment, DelAttachment, RenamePage and comments for 
Addrevision and ignoring of empty lines by len(line) == 0 may be it would be better here to check if there are the wanted colums.

diff -r 9dcfb8f36524 -r 1fbf6795947a MoinMoin/packages.py
--- a/MoinMoin/packages.py	Sun Jul 09 10:55:43 2006 +0200
+++ b/MoinMoin/packages.py	Sun Jul 09 22:21:51 2006 +0200
@@ -6,16 +6,19 @@
     @license: GNU GPL, see COPYING for details.
 """
 
-import os
+import os, codecs
 import sys
 import zipfile
 
-from MoinMoin import config, wikiutil, caching
+from MoinMoin import config, wikiutil, caching, user, storage
 from MoinMoin.Page import Page
 from MoinMoin.PageEditor import PageEditor
+from MoinMoin.util import filesys
+from MoinMoin.logfile import editlog, eventlog
 
 MOIN_PACKAGE_FILE = 'MOIN_PACKAGE'
 MAX_VERSION = 1
+
 
 # Exceptions
 class PackageException(Exception):
@@ -37,6 +40,26 @@ class RuntimeScriptException(ScriptExcep
 
 class ScriptExit(Exception):
     """ Raised by the script commands when the script should quit. """
+
+def event_logfile(self, pagename, pagefile):
+    # add event log entry
+    filename = self.request.rootpage.getPagePath('event-log', isfile=1)
+    eventtype = 'SAVENEW'
+    mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile))
+    elog = eventlog.EventLog(self.request)
+    elog.add(self.request, eventtype, {'pagename': pagename}, 1, mtime_usecs)
+
+def edit_logfile_append(self, pagename, pagefile, rev, action, logname='edit-log', comment=u'', author=u"Scripting Subsystem"):
+    glog = editlog.EditLog(self.request, uid_override=author)
+    pagelog = Page(self.request, pagename).getPagePath(logname, use_underlay=0, isfile=1)
+    llog = editlog.EditLog(self.request, filename=pagelog,
+                               uid_override=author)
+    mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile))
+    host = '::1'
+    extra = u''
+    glog.add(self.request, mtime_usecs, rev, action, pagename, host, comment)
+    llog.add(self.request, mtime_usecs, rev, action, pagename, host, extra, comment)
+    event_logfile(self, pagename, pagefile)
 
 # Parsing and (un)quoting for script files
 def packLine(list, separator="|"):
@@ -95,6 +118,55 @@ class ScriptEngine:
         #Satisfy pylint
         self.msg = getattr(self, "msg", "")
         self.request = getattr(self, "request", None)
+    def do_addattachment(self, filename, pagename, author=u"Scripting Subsystem", comment=u""):
+        """
+        Installs an attachment
+
+        @param pagename: Page where the file is attached. Or in 2.0, the file itself.
+        @param filename: Filename of the attachment (just applicable for MoinMoin < 2.0)
+        """
+        _ = self.request.getText
+
+        attachments = Page(self.request, pagename).getPagePath("attachments", check_create=1)
+        filename = wikiutil.taintfilename(filename)
+        target = os.path.join(attachments, filename)
+        page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
+        rev = page.current_rev()
+        path = page.getPagePath(check_create=0)
+        if not os.path.exists(target):
+           self._extractToFile(filename, target)
+           if os.path.exists(target):
+              os.chmod(target, config.umask )
+              action = 'ATTNEW'
+              edit_logfile_append(self, pagename, path, rev, action, logname='edit-log',
+                      comment=u'%(filename)s' % {"filename":filename}, author=author)
+              self.msg += u"%(filename)s attached \n" % {"filename": filename}
+        else:
+           self.msg += u"%(filename)s not attached \n" % {"filename":filename}
+
+    def do_delattachment(self, filename, pagename, author=u"Scripting Subsystem", comment=u""):
+        """
+        Removes an attachment
+
+        @param pagename: Page where the file is attached. Or in 2.0, the file itself.
+        @param filename: Filename of the attachment (just applicable for MoinMoin < 2.0)
+        """
+        _ = self.request.getText
+
+        attachments = Page(self.request, pagename).getPagePath("attachments", check_create=1)
+        filename = wikiutil.taintfilename(filename)
+        target = os.path.join(attachments, filename)
+        page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
+        rev = page.current_rev()
+        path = page.getPagePath(check_create=0)
+        if os.path.exists(target):
+              os.remove(target)
+              action = 'ATTDEL'
+              edit_logfile_append(self, pagename, path, rev, action, logname='edit-log',
+                      comment=u'%(filename)s' % {"filename":filename}, author=author)
+              self.msg += u"%(filename)s removed \n" % {"filename":filename}
+        else:
+           self.msg += u"%(filename)s not exists \n" % {"filename":filename}
 
     def do_print(self, *param):
         """ Prints the parameters into output of the script. """
@@ -215,14 +287,40 @@ class ScriptEngine:
         """
         _ = self.request.getText
         trivial = str2boolean(trivial)
-
+        uid = user.getUserId(self.request, author)
+        theuser = user.User(self.request, uid)
+        self.request.user = theuser
         page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
         try:
             page.saveText(self.extract_file(filename).decode("utf-8"), 0, trivial=trivial, comment=comment)
+            self.msg += u"%(pagename)s added \n" % {"pagename": pagename}
         except PageEditor.Unchanged:
             pass
-
         page.clean_acl_cache()
+
+    def do_renamepage(self, pagename, newpagename, author=u"Scripting Subsystem", comment=u""):
+        page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
+        newpage = PageEditor(self.request, newpagename)
+        newpagedir = Page(self.request, newpagename).getPagePath("", check_create=1)
+        newpath = newpage.getPagePath(check_create=0)
+        if newpage.exists(includeDeleted=0):
+             self.msg = u'Could not rename page because new page %(newpagename)s already exists\n' % {
+                            'newpagename': newpagename}
+             return
+        rev, err = storage.renamepage(self, pagename, newpagename, author=u"Scripting Subsystem", comment=u"")
+        revstr = '%08d' % rev
+        revdir = os.path.join(newpagedir, 'revisions')
+        newpagefile = os.path.join(revdir, revstr)
+        if rev < 0:
+            self.msg = u'Could not rename page because of file systemerror: %s.' % unicode(err)
+            return
+        action = 'SAVENEW'
+        edit_logfile_append(self, newpagename, newpath, rev, action, logname='edit-log',
+                  comment=u'Renamed from %(pagename)s' % {"pagename": pagename}, author=author)
+        event_logfile(self, newpagename, newpagefile)
+        self.msg = u'%(pagename)s renamed to %(newpagename)s\n' % {
+                    "pagename":pagename,
+                    "newpagename":newpagename}
 
     def do_deletepage(self, pagename, comment="Deleted by the scripting subsystem."):
         """ Marks a page as deleted (like the DeletePage action).
@@ -301,7 +399,7 @@ class ScriptEngine:
                 self.goto -= 1
                 continue
 
-            if line.startswith("#"):
+            if line.startswith("#") or len(line) == 0:
                 continue
             elements = unpackLine(line)
             fnname = elements[0].strip().lower()
@@ -448,4 +546,3 @@ Example:
 
 if __name__ == '__main__':
     main()
-
diff -r 9dcfb8f36524 -r 1fbf6795947a MoinMoin/storage.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MoinMoin/storage.py	Sun Jul 09 22:21:51 2006 +0200
@@ -0,0 +1,64 @@
+"""
+rename page called from packages
+
+copyright Reimar Bauer, 2006-07-08
+
+License GPL
+"""
+import os
+
+from MoinMoin import config
+from MoinMoin.Page import Page
+from MoinMoin.PageEditor import PageEditor
+
+def renamepage(self, pagename, newpagename, author=u"Scripting Subsystem", comment=u""):
+
+    _ = self.request.getText
+    err = 0
+    newpage = PageEditor(self.request, newpagename)
+
+    # Check whether a page with the new name already exists
+    page = PageEditor(self.request, pagename, do_editor_backup=0, uid_override=author)
+    path = page.getPagePath(check_create=0)
+    rev = page.current_rev()
+    # Get old page text
+    savetext = page.get_raw_body()
+    # add comment
+    savetext = u"## page was renamed from %s\n%s" % (pagename, savetext)
+    oldpath = page.getPagePath(check_create=0)
+    newpath = newpage.getPagePath(check_create=0)
+    # Rename page
+
+    # NOTE: might fail if another process created newpagename just
+    # NOW, while you read this comment. Rename is atomic for files -
+    # but for directories, rename will fail if the directory
+    # exists. We should have global edit-lock to avoid this.
+    # See http://docs.python.org/lib/os-file-dir.html
+    try:
+        os.rename(oldpath, newpath)
+        revstr = '%08d' % rev
+        newpagedir = Page(self.request, newpagename).getPagePath("", check_create=1)
+        revdir = os.path.join(newpagedir, 'revisions')
+        rev += 1
+        revstr = '%08d' % rev
+        newpagedir = Page(self.request, newpagename).getPagePath("", check_create=1)
+        revdir = os.path.join(newpagedir, 'revisions')
+        newpagefile = os.path.join(revdir, revstr)
+
+        f = open(newpagefile, 'w'
+        f.write(savetext)
+        f.close()
+        os.chmod(newpagefile, 0666 & config.umask)
+        cfn = os.path.join(newpagedir, 'current')
+        f = open(cfn, 'w')
+        f.write('%08d\n' % rev)
+        f.close()
+        os.chmod(cfn, 0666 & config.umask)
+        clfn = os.path.join(newpagedir, 'current-locked')
+        f = open(clfn, 'w')
+        f.write(revstr+'\n')
+        f.close()
+        os.chmod(clfn, 0666 & config.umask)
+        return rev, err
+    except OSError, err:
+        return rev * (-1), err
