[Erp5-report] r6612 - /erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Apr 13 16:38:49 CEST 2006
Author: chris
Date: Thu Apr 13 16:38:48 2006
New Revision: 6612
URL: http://svn.erp5.org?rev=6612&view=rev
Log:
- removed all system commands using shutils, os.walk and sets
Modified:
erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py
Modified: erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py?rev=6612&r1=6611&r2=6612&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py (original)
+++ erp5/trunk/products/ERP5Subversion/Tool/SubversionTool.py Thu Apr 13 16:38:48 2006
@@ -34,7 +34,7 @@
from Products.ERP5Type import Permissions
from Products.ERP5Subversion import _dtmldir
from Products.ERP5Subversion.SubversionClient import newSubversionClient
-import os, re, commands, time
+import os, re, commands, time, exceptions
from DateTime import DateTime
from cPickle import dumps, loads
from App.config import getConfiguration
@@ -42,12 +42,16 @@
from OFS.Image import manage_addFile
from cStringIO import StringIO
from tempfile import mktemp
+from shutil import copy2
try:
from base64 import b64encode, b64decode
except ImportError:
from base64 import encodestring as b64encode, decodestring as b64decode
-
+
+class Error(exceptions.EnvironmentError):
+ pass
+
def removeAll(entry):
'''
Remove all files and directories under 'entry'.
@@ -68,6 +72,41 @@
os.remove(entry)
except OSError:
pass
+
+def copytree(src, dst, symlinks=False):
+ """Recursively copy a directory tree using copy2().
+
+ The destination directory must not already exist.
+ If exception(s) occur, an Error is raised with a list of reasons.
+
+ If the optional symlinks flag is true, symbolic links in the
+ source tree result in symbolic links in the destination tree; if
+ it is false, the contents of the files pointed to by symbolic
+ links are copied.
+
+ XXX Consider this example code rather than the ultimate tool.
+
+ """
+ if not os.path.exists(dst):
+ os.mkdir(dst)
+ names = os.listdir(src)
+ errors = []
+ for name in names:
+ srcname = os.path.join(src, name)
+ dstname = os.path.join(dst, name)
+ try:
+ if symlinks and os.path.islink(srcname):
+ linkto = os.readlink(srcname)
+ os.symlink(linkto, dstname)
+ elif os.path.isdir(srcname):
+ copytree(srcname, dstname, symlinks)
+ else:
+ copy2(srcname, dstname)
+ # XXX What about devices, sockets etc.?
+ except (IOError, os.error), why:
+ errors.append((srcname, dstname, why))
+ if errors:
+ raise Error, errors
class File :
@@ -691,38 +730,61 @@
svn_path = self.getPortalObject().portal_preferences.getPreference('subversion_working_copy')
if not svn_path :
raise "Error: Please set Subversion working path in preferences"
- if svn_path[-1]!='/':
- svn_path+='/'
- svn_path += bt.getTitle()+'/'
- if path[-1]!='/':
- path+='/'
+ svn_path=os.path.join(svn_path,bt.getTitle())+'/'
+ path+='/'
# svn del deleted files
- self.deleteOldFiles(svn_path, path)
+ self.deleteOldFiles(svn_path, path, bt)
# add new files and copy
- self.addNewFiles(svn_path, path)
+ self.addNewFiles(svn_path, path, bt)
# Clean up
removeAll(path)
-
+
+ # return a set with dirs & files present in the directory
+ def getSetForDir(self, directory):
+ dir_set = set()
+ for root, dirs, files in os.walk(directory):
+ # don't visit SVN directories
+ if '.svn' in dirs:
+ dirs.remove('.svn')
+ # get Directories
+ for name in dirs:
+ f = os.path.join(root, name)
+ dir_set.add(f.replace(directory,''))
+ # get Files
+ for name in files:
+ f = os.path.join(root, name)
+ dir_set.add(f.replace(directory,''))
+ return dir_set
+
+ # return files/dirs present in new_dir but not in old_dir
+ # return a set of relative paths
+ def getNewFiles(self, old_dir, new_dir):
+ if old_dir[-1] != '/':
+ old_dir += '/'
+ if new_dir[-1] != '/':
+ new_dir += '/'
+ old_set = self.getSetForDir(old_dir)
+ new_set = self.getSetForDir(new_dir)
+ return new_set.difference(old_set)
+
# svn del files that have been removed in new dir
- def deleteOldFiles(self, old_dir, new_dir):
+ def deleteOldFiles(self, old_dir, new_dir, bt):
# detect removed files
- output = commands.getoutput('export LC_ALL=c;diff -rq %s %s --exclude .svn | grep "Only in " | grep -v "svn-commit." | grep %s | cut -d" " -f3,4'%(new_dir, old_dir, old_dir)).replace(': ', '/')
- files_list = output.split('\n')
+ files_set = self.getNewFiles(new_dir, old_dir)
# svn del
- for file in files_list:
- if file:
- self.remove(file)
-
- def addNewFiles(self, old_dir, new_dir):
+ for file in files_set:
+ self.remove(os.path.join(old_dir, file))
+
+ # copy files and add new files
+ def addNewFiles(self, old_dir, new_dir, bt):
# detect created files
- output = commands.getoutput('LC_ALL=C diff -rq %s %s --exclude .svn | grep "Only in " | grep -v "svn-commit." | grep %s | cut -d" " -f3,4'%(new_dir, old_dir, new_dir)).replace(': ', '/')
- files_list = output.split('\n')
+ files_set = self.getNewFiles(old_dir, new_dir)
# Copy files
- os.system('cp -af %s/* %s'%(new_dir, old_dir))
+ #os.system('cp -af %s/* %s'%(new_dir, old_dir))
+ copytree(new_dir, old_dir)
# svn add
- for file in files_list:
- if file:
- self.add(file.replace(new_dir, old_dir))
+ for file in files_set:
+ self.add(os.path.join(old_dir, file))
def treeToXML(self, item) :
output = "<?xml version='1.0' encoding='iso-8859-1'?>"+ os.linesep
More information about the Erp5-report
mailing list