# HG changeset patch
# User ReimarBauer <R.Bauer@fz-juelich.de>
# Node ID 5142cfdccbac1f5ef80d75c97ff5f31964707798
# Parent  b47c307ed9d555d4831b7d1275203795ddf1dfca
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 b47c307ed9d5 -r 5142cfdccbac MoinMoin/packages.py
--- a/MoinMoin/packages.py	Thu Jul 06 15:10:16 2006 +0200
+++ b/MoinMoin/packages.py	Fri Jul 07 00:28:44 2006 +0200
@@ -6,16 +6,106 @@
     @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
 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
+
+def renamepage(self,pagename,newpagename,author=u"Scripting Subsystem", comment=u""):
+
+    _ = self.request.getText  
+    
+    newpage = PageEditor(self.request, newpagename)
+
+    # Check whether a page with the new name already exists
+    if newpage.exists(includeDeleted=0):
+       self.msg = u'Could not rename page because new page %(newpagename)s already exists\n' % {
+                       'newpagename': newpagename}
+       return 
+    
+    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)
+
+        self.newpage = newpage
+        self.msg = u'%(pagename)s renamed to %(newpagename)s\n' % {
+                    "pagename":pagename,
+                    "newpagename":newpagename}
+                    
+        action = 'SAVENEW'
+        
+        revstr = '%08d' % rev
+        newpagedir = Page(self.request, newpagename).getPagePath("", check_create=1)
+        
+        revdir = os.path.join(newpagedir, 'revisions')
+        oldpagefile = os.path.join(revdir, revstr)
+        
+        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)
+        
+        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)
+        
+        return
+       
+    except OSError, err:
+        # Try to understand what happened. Maybe its better to check
+        # the error code, but I just reused the available code above...
+        if newpage.exists(includeDeleted=0):
+           self.msg = u'Could not rename page because new page %(newpagename)s already exists\n' % {
+                        'newpagename': newpagename}
+           return
+        else:
+            self.msg = u'Could not rename page because of file systemerror: %s.' % unicode(err)
+
 
 # Exceptions
 class PackageException(Exception):
@@ -38,11 +128,33 @@ class ScriptExit(Exception):
 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="|"):
     """ Packs a list into a string that is separated by `separator`. """
     return '|'.join([x.replace('\\', '\\\\').replace(separator, '\\' + separator) for x in list])
-
+   
 def unpackLine(string, separator="|"):
     """ Unpacks a string that was packed by packLine. """
     result = []
@@ -95,6 +207,59 @@ 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. """
@@ -216,13 +381,24 @@ 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""):
+        renamepage(self,pagename,newpagename,author=u"Scripting Subsystem", comment=u"")
+
 
     def do_deletepage(self, pagename, comment="Deleted by the scripting subsystem."):
         """ Marks a page as deleted (like the DeletePage action).
@@ -301,7 +477,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()
