diff --git a/product/ERP5Subversion/Tool/SubversionTool.py b/product/ERP5Subversion/Tool/SubversionTool.py index da015a57f42505d5185ebdd7d656e9e4e358c27f..ba773425a4fb8aeff7065c2ad8cff7cc667abf1f 100644 --- a/product/ERP5Subversion/Tool/SubversionTool.py +++ b/product/ERP5Subversion/Tool/SubversionTool.py @@ -46,8 +46,6 @@ import shutil from xml.sax.saxutils import escape from dircache import listdir from OFS.Traversable import NotFound -from Products.ERP5Type.patches.copyTree import copytree, Error -from Products.ERP5Type.patches.cacheWalk import cacheWalk import transaction try: @@ -892,20 +890,19 @@ class SubversionTool(BaseTool): business_template.build() svn_path = self._getWorkingPath(self.getSubversionPath(business_template) \ + os.sep) + old_cwd = os.getcwd() path = mkdtemp() try: # XXX: Big hack to make export work as expected. transaction.commit() business_template.export(path=path, local=1) - # svn del deleted files - self.deleteOldFiles(svn_path, path) - # add new files and copy - self.addNewFiles(svn_path, path) self.goToWorkingCopy(business_template) + self._reimportTree(path) finally: # Clean up shutil.rmtree(path) - + os.chdir(old_cwd) + def importBT(self, business_template): """ Import business template from local @@ -927,88 +924,93 @@ class SubversionTool(BaseTool): res = [x for x in res if not x.startswith(path)] return res - # return a set with directories present in the directory - def getSetDirsForDir(self, directory): - dir_set = set() - for root, dirs, _ in cacheWalk(directory): - # don't visit SVN directories - if '.svn' in dirs: - dirs.remove('.svn') - # get Directories - for name in dirs: - i = root.replace(directory, '').count(os.sep) - path = os.path.join(root, name) - dir_set.add((i, path.replace(directory,''))) - return dir_set - - # return a set with files present in the directory - def getSetFilesForDir(self, directory): - dir_set = set() - for root, dirs, files in cacheWalk(directory): - # don't visit SVN directories - if '.svn' in dirs: - dirs.remove('.svn') - # get Files - for name in files: - i = root.replace(directory, '').count(os.sep) - path = os.path.join(root, name) - dir_set.add((i, path.replace(directory,''))) - return dir_set - - # return files 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] != os.sep: - old_dir += os.sep - if new_dir[-1] != os.sep: - new_dir += os.sep - old_set = self.getSetFilesForDir(old_dir) - new_set = self.getSetFilesForDir(new_dir) - return new_set.difference(old_set) + def _reimportTree(self, path): + """Overwrite working copy with the tree pointed to by 'path' - # return dirs present in new_dir but not in old_dir - # return a set of relative paths - def getNewDirs(self, old_dir, new_dir): - if old_dir[-1] != os.sep: - old_dir += os.sep - if new_dir[-1] != os.sep: - new_dir += os.sep - old_set = self.getSetDirsForDir(old_dir) - new_set = self.getSetDirsForDir(new_dir) - return new_set.difference(old_set) - - def deleteOldFiles(self, old_dir, new_dir): - """ svn del files that have been removed in new dir + Current directory must be the destination working copy """ - # detect removed files - files_set = self.getNewFiles(new_dir, old_dir) - # detect removed directories - dirs_set = self.getNewDirs(new_dir, old_dir) - # svn del - path_list = [x for x in files_set] - path_list.sort() - self.remove([os.path.join(old_dir, x[1]) for x in path_list]) - path_list = [x for x in dirs_set] - path_list.sort() - self.remove([os.path.join(old_dir, x[1]) for x in path_list]) - - def addNewFiles(self, old_dir, new_dir): - """ copy files and add new files - """ - # detect created files - files_set = self.getNewFiles(old_dir, new_dir) - # detect created directories - dirs_set = self.getNewDirs(old_dir, new_dir) - # Copy files - copytree(new_dir, old_dir) - # svn add - path_list = [x for x in dirs_set] - path_list.sort() - self.add([os.path.join(old_dir, x[1]) for x in path_list]) - path_list = [x for x in files_set] - path_list.sort() - self.add([os.path.join(old_dir, x[1]) for x in path_list]) - + # Sets to track svn status in case it is not consistent with existing + # files and directories + versioned_set = set(x.getPath() for x in self._getClient().status('.') + if x.getIsVersioned()) + versioned_set.remove('.') + added_set = set() + + # Walk current tree + svn_file_set = set() + svn_dir_set = set() + prefix_length = len(os.path.join('.', '')) + for dirpath, dirnames, filenames in os.walk('.'): + dirpath = dirpath[prefix_length:] + for i in xrange(len(dirnames) - 1, -1, -1): + d = dirnames[i] + if d[0] == '.': + # Ignore hidden directories (in particular '.svn') + del dirnames[i] + else: + svn_dir_set.add(os.path.join(dirpath, d)) + for f in filenames: + svn_file_set.add(os.path.join(dirpath, f)) + + # Copy new files/dirs from 'path' to working copy + # Note: we don't use 'copytree' to avoid excessive disk writes + prefix_length = len(os.path.join(path, '')) + for dirpath, dirnames, filenames in os.walk(path): + dirpath = dirpath[prefix_length:] + for d in dirnames: + d = os.path.join(dirpath, d) + if d in versioned_set: + versioned_set.remove(d) + else: + added_set.add(d) + if d in svn_dir_set: + svn_dir_set.remove(d) + else: + os.mkdir(d) + for f in filenames: + f = os.path.join(dirpath, f) + if f in versioned_set: + versioned_set.remove(f) + else: + added_set.add(f) + # copy file unless unchanged + file = open(os.path.join(path, f), 'rb') + try: + text = file.read() + finally: + file.close() + try: + if f in svn_file_set: + svn_file_set.remove(f) + file = open(f, 'r+b') + old_size = os.fstat(file.fileno()).st_size + if len(text) == old_size and text == file.read(): + continue + file.seek(0) + else: + file = open(f, 'wb') + file.write(text) + file.truncate() + finally: + file.close() + + # Remove dangling files/dirs + svn_file_set -= versioned_set # what is in versioned_set + svn_dir_set -= versioned_set # is removed after + for x in svn_file_set: + if os.path.dirname(x) not in svn_dir_set: + os.remove(x) + for x in svn_dir_set: + if os.path.dirname(x) not in svn_dir_set: + shutil.rmtree(x) + + # Remove deleted files/dirs + self.remove([x for x in versioned_set + if os.path.dirname(x) not in versioned_set]) + # Add new files/dirs + self.add([x for x in added_set + if os.path.dirname(x) not in added_set]) + def treeToXML(self, item, business_template) : """ Convert tree in memory to XML """ diff --git a/product/ERP5Type/patches/cacheWalk.py b/product/ERP5Type/patches/cacheWalk.py deleted file mode 100644 index 869167f04fe7bfa9ac604f509a830bf92bf4c649..0000000000000000000000000000000000000000 --- a/product/ERP5Type/patches/cacheWalk.py +++ /dev/null @@ -1,305 +0,0 @@ -#A. HISTORY OF THE SOFTWARE -#========================== - -#Python was created in the early 1990s by Guido van Rossum at Stichting -#Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands -#as a successor of a language called ABC. Guido remains Python's -#principal author, although it includes many contributions from others. - -#In 1995, Guido continued his work on Python at the Corporation for -#National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) -#in Reston, Virginia where he released several versions of the -#software. - -#In May 2000, Guido and the Python core development team moved to -#BeOpen.com to form the BeOpen PythonLabs team. In October of the same -#year, the PythonLabs team moved to Digital Creations (now Zope -#Corporation, see http://www.zope.com). In 2001, the Python Software -#Foundation (PSF, see http://www.python.org/psf/) was formed, a -#non-profit organization created specifically to own Python-related -#Intellectual Property. Zope Corporation is a sponsoring member of -#the PSF. - -#All Python releases are Open Source (see http://www.opensource.org for -#the Open Source Definition). Historically, most, but not all, Python -#releases have also been GPL-compatible; the table below summarizes -#the various releases. - - #Release Derived Year Owner GPL- - #from compatible? (1) - - #0.9.0 thru 1.2 1991-1995 CWI yes - #1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - #1.6 1.5.2 2000 CNRI no - #2.0 1.6 2000 BeOpen.com no - #1.6.1 1.6 2001 CNRI yes (2) - #2.1 2.0+1.6.1 2001 PSF no - #2.0.1 2.0+1.6.1 2001 PSF yes - #2.1.1 2.1+2.0.1 2001 PSF yes - #2.2 2.1.1 2001 PSF yes - #2.1.2 2.1.1 2002 PSF yes - #2.1.3 2.1.2 2002 PSF yes - #2.2.1 2.2 2002 PSF yes - #2.2.2 2.2.1 2002 PSF yes - #2.2.3 2.2.2 2003 PSF yes - #2.3 2.2.2 2002-2003 PSF yes - #2.3.1 2.3 2002-2003 PSF yes - #2.3.2 2.3.1 2002-2003 PSF yes - #2.3.3 2.3.2 2002-2003 PSF yes - #2.3.4 2.3.3 2004 PSF yes - #2.3.5 2.3.4 2005 PSF yes - #2.4 2.3 2004 PSF yes - #2.4.1 2.4 2005 PSF yes - #2.4.2 2.4.1 2005 PSF yes - -#Footnotes: - -#(1) GPL-compatible doesn't mean that we're distributing Python under - #the GPL. All Python licenses, unlike the GPL, let you distribute - #a modified version without making your changes open source. The - #GPL-compatible licenses make it possible to combine Python with - #other software that is released under the GPL; the others don't. - -#(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - #because its license has a choice of law clause. According to - #CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - #is "not incompatible" with the GPL. - -#Thanks to the many outside volunteers who have worked under Guido's -#direction to make these releases possible. - - -#B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -#=============================================================== - -#PSF LICENSE AGREEMENT FOR PYTHON 2.4 -#------------------------------------ - -#1. This LICENSE AGREEMENT is between the Python Software Foundation -#("PSF"), and the Individual or Organization ("Licensee") accessing and -#otherwise using Python 2.4 software in source or binary form and its -#associated documentation. - -#2. Subject to the terms and conditions of this License Agreement, PSF -#hereby grants Licensee a nonexclusive, royalty-free, world-wide -#license to reproduce, analyze, test, perform and/or display publicly, -#prepare derivative works, distribute, and otherwise use Python 2.4 -#alone or in any derivative version, provided, however, that PSF's -#License Agreement and PSF's notice of copyright, i.e., "Copyright (c) -#2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved" -#are retained in Python 2.4 alone or in any derivative version prepared -#by Licensee. - -#3. In the event Licensee prepares a derivative work that is based on -#or incorporates Python 2.4 or any part thereof, and wants to make -#the derivative work available to others as provided herein, then -#Licensee hereby agrees to include in any such work a brief summary of -#the changes made to Python 2.4. - -#4. PSF is making Python 2.4 available to Licensee on an "AS IS" -#basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4 WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -#2.4 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -#A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4, -#OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#6. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#7. Nothing in this License Agreement shall be deemed to create any -#relationship of agency, partnership, or joint venture between PSF and -#Licensee. This License Agreement does not grant permission to use PSF -#trademarks or trade name in a trademark sense to endorse or promote -#products or services of Licensee, or any third party. - -#8. By copying, installing or otherwise using Python 2.4, Licensee -#agrees to be bound by the terms and conditions of this License -#Agreement. - - -#BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -#------------------------------------------- - -#BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -#1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -#office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -#Individual or Organization ("Licensee") accessing and otherwise using -#this software in source or binary form and its associated -#documentation ("the Software"). - -#2. Subject to the terms and conditions of this BeOpen Python License -#Agreement, BeOpen hereby grants Licensee a non-exclusive, -#royalty-free, world-wide license to reproduce, analyze, test, perform -#and/or display publicly, prepare derivative works, distribute, and -#otherwise use the Software alone or in any derivative version, -#provided, however, that the BeOpen Python License is retained in the -#Software, alone or in any derivative version prepared by Licensee. - -#3. BeOpen is making the Software available to Licensee on an "AS IS" -#basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -#SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -#AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -#DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#5. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#6. This License Agreement shall be governed by and interpreted in all -#respects by the law of the State of California, excluding conflict of -#law provisions. Nothing in this License Agreement shall be deemed to -#create any relationship of agency, partnership, or joint venture -#between BeOpen and Licensee. This License Agreement does not grant -#permission to use BeOpen trademarks or trade names in a trademark -#sense to endorse or promote products or services of Licensee, or any -#third party. As an exception, the "BeOpen Python" logos available at -#http://www.pythonlabs.com/logos.html may be used according to the -#permissions granted on that web page. - -#7. By copying, installing or otherwise using the software, Licensee -#agrees to be bound by the terms and conditions of this License -#Agreement. - - -#CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 -#--------------------------------------- - -#1. This LICENSE AGREEMENT is between the Corporation for National -#Research Initiatives, having an office at 1895 Preston White Drive, -#Reston, VA 20191 ("CNRI"), and the Individual or Organization -#("Licensee") accessing and otherwise using Python 1.6.1 software in -#source or binary form and its associated documentation. - -#2. Subject to the terms and conditions of this License Agreement, CNRI -#hereby grants Licensee a nonexclusive, royalty-free, world-wide -#license to reproduce, analyze, test, perform and/or display publicly, -#prepare derivative works, distribute, and otherwise use Python 1.6.1 -#alone or in any derivative version, provided, however, that CNRI's -#License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -#1995-2001 Corporation for National Research Initiatives; All Rights -#Reserved" are retained in Python 1.6.1 alone or in any derivative -#version prepared by Licensee. Alternately, in lieu of CNRI's License -#Agreement, Licensee may substitute the following text (omitting the -#quotes): "Python 1.6.1 is made available subject to the terms and -#conditions in CNRI's License Agreement. This Agreement together with -#Python 1.6.1 may be located on the Internet using the following -#unique, persistent identifier (known as a handle): 1895.22/1013. This -#Agreement may also be obtained from a proxy server on the Internet -#using the following URL: http://hdl.handle.net/1895.22/1013". - -#3. In the event Licensee prepares a derivative work that is based on -#or incorporates Python 1.6.1 or any part thereof, and wants to make -#the derivative work available to others as provided herein, then -#Licensee hereby agrees to include in any such work a brief summary of -#the changes made to Python 1.6.1. - -#4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -#basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -#1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -#A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -#OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#6. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#7. This License Agreement shall be governed by the federal -#intellectual property law of the United States, including without -#limitation the federal copyright law, and, to the extent such -#U.S. federal law does not apply, by the law of the Commonwealth of -#Virginia, excluding Virginia's conflict of law provisions. -#Notwithstanding the foregoing, with regard to derivative works based -#on Python 1.6.1 that incorporate non-separable material that was -#previously distributed under the GNU General Public License (GPL), the -#law of the Commonwealth of Virginia shall govern this License -#Agreement only as to issues arising under or with respect to -#Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -#License Agreement shall be deemed to create any relationship of -#agency, partnership, or joint venture between CNRI and Licensee. This -#License Agreement does not grant permission to use CNRI trademarks or -#trade name in a trademark sense to endorse or promote products or -#services of Licensee, or any third party. - -#8. By clicking on the "ACCEPT" button where indicated, or by copying, -#installing or otherwise using Python 1.6.1, Licensee agrees to be -#bound by the terms and conditions of this License Agreement. - - #ACCEPT - - -#CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 -#-------------------------------------------------- - -#Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -#The Netherlands. All rights reserved. - -#Permission to use, copy, modify, and distribute this software and its -#documentation for any purpose and without fee is hereby granted, -#provided that the above copyright notice appear in all copies and that -#both that copyright notice and this permission notice appear in -#supporting documentation, and that the name of Stichting Mathematisch -#Centrum or CWI not be used in advertising or publicity pertaining to -#distribution of the software without specific, written prior -#permission. - -#STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -#THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -#FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -#FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -#WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -#ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -#OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -# Copyright (c) 2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved -# Copyright (c) 2005 Nexedi SARL and Contributors. All Rights Reserved. - -from dircache import listdir -import os - -def cacheWalk(top, topdown=True, onerror=None): - """Directory tree generator. - - modification of os.path.walk to use dircache.listdir - instead of os.path.listdir - """ - try: - # Note that listdir and error are globals in this module due - # to earlier import-*. - names = listdir(top) - except os.error, err: - if onerror is not None: - onerror(err) - return - - dirs, nondirs = [], [] - for name in names: - if os.path.isdir(os.path.join(top, name)): - dirs.append(name) - else: - nondirs.append(name) - - if topdown: - yield top, dirs, nondirs - for name in dirs: - path = os.path.join(top, name) - if not os.path.islink(path): - for elem in cacheWalk(path, topdown, onerror): - yield elem - if not topdown: - yield top, dirs, nondirs diff --git a/product/ERP5Type/patches/copyTree.py b/product/ERP5Type/patches/copyTree.py deleted file mode 100644 index 5295e4aadd03fe97ad61f2db728ffc1987b45269..0000000000000000000000000000000000000000 --- a/product/ERP5Type/patches/copyTree.py +++ /dev/null @@ -1,313 +0,0 @@ -#A. HISTORY OF THE SOFTWARE -#========================== - -#Python was created in the early 1990s by Guido van Rossum at Stichting -#Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands -#as a successor of a language called ABC. Guido remains Python's -#principal author, although it includes many contributions from others. - -#In 1995, Guido continued his work on Python at the Corporation for -#National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) -#in Reston, Virginia where he released several versions of the -#software. - -#In May 2000, Guido and the Python core development team moved to -#BeOpen.com to form the BeOpen PythonLabs team. In October of the same -#year, the PythonLabs team moved to Digital Creations (now Zope -#Corporation, see http://www.zope.com). In 2001, the Python Software -#Foundation (PSF, see http://www.python.org/psf/) was formed, a -#non-profit organization created specifically to own Python-related -#Intellectual Property. Zope Corporation is a sponsoring member of -#the PSF. - -#All Python releases are Open Source (see http://www.opensource.org for -#the Open Source Definition). Historically, most, but not all, Python -#releases have also been GPL-compatible; the table below summarizes -#the various releases. - - #Release Derived Year Owner GPL- - #from compatible? (1) - - #0.9.0 thru 1.2 1991-1995 CWI yes - #1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - #1.6 1.5.2 2000 CNRI no - #2.0 1.6 2000 BeOpen.com no - #1.6.1 1.6 2001 CNRI yes (2) - #2.1 2.0+1.6.1 2001 PSF no - #2.0.1 2.0+1.6.1 2001 PSF yes - #2.1.1 2.1+2.0.1 2001 PSF yes - #2.2 2.1.1 2001 PSF yes - #2.1.2 2.1.1 2002 PSF yes - #2.1.3 2.1.2 2002 PSF yes - #2.2.1 2.2 2002 PSF yes - #2.2.2 2.2.1 2002 PSF yes - #2.2.3 2.2.2 2003 PSF yes - #2.3 2.2.2 2002-2003 PSF yes - #2.3.1 2.3 2002-2003 PSF yes - #2.3.2 2.3.1 2002-2003 PSF yes - #2.3.3 2.3.2 2002-2003 PSF yes - #2.3.4 2.3.3 2004 PSF yes - #2.3.5 2.3.4 2005 PSF yes - #2.4 2.3 2004 PSF yes - #2.4.1 2.4 2005 PSF yes - #2.4.2 2.4.1 2005 PSF yes - -#Footnotes: - -#(1) GPL-compatible doesn't mean that we're distributing Python under - #the GPL. All Python licenses, unlike the GPL, let you distribute - #a modified version without making your changes open source. The - #GPL-compatible licenses make it possible to combine Python with - #other software that is released under the GPL; the others don't. - -#(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - #because its license has a choice of law clause. According to - #CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - #is "not incompatible" with the GPL. - -#Thanks to the many outside volunteers who have worked under Guido's -#direction to make these releases possible. - - -#B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -#=============================================================== - -#PSF LICENSE AGREEMENT FOR PYTHON 2.4 -#------------------------------------ - -#1. This LICENSE AGREEMENT is between the Python Software Foundation -#("PSF"), and the Individual or Organization ("Licensee") accessing and -#otherwise using Python 2.4 software in source or binary form and its -#associated documentation. - -#2. Subject to the terms and conditions of this License Agreement, PSF -#hereby grants Licensee a nonexclusive, royalty-free, world-wide -#license to reproduce, analyze, test, perform and/or display publicly, -#prepare derivative works, distribute, and otherwise use Python 2.4 -#alone or in any derivative version, provided, however, that PSF's -#License Agreement and PSF's notice of copyright, i.e., "Copyright (c) -#2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved" -#are retained in Python 2.4 alone or in any derivative version prepared -#by Licensee. - -#3. In the event Licensee prepares a derivative work that is based on -#or incorporates Python 2.4 or any part thereof, and wants to make -#the derivative work available to others as provided herein, then -#Licensee hereby agrees to include in any such work a brief summary of -#the changes made to Python 2.4. - -#4. PSF is making Python 2.4 available to Licensee on an "AS IS" -#basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4 WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -#2.4 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -#A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4, -#OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#6. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#7. Nothing in this License Agreement shall be deemed to create any -#relationship of agency, partnership, or joint venture between PSF and -#Licensee. This License Agreement does not grant permission to use PSF -#trademarks or trade name in a trademark sense to endorse or promote -#products or services of Licensee, or any third party. - -#8. By copying, installing or otherwise using Python 2.4, Licensee -#agrees to be bound by the terms and conditions of this License -#Agreement. - - -#BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -#------------------------------------------- - -#BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -#1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -#office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -#Individual or Organization ("Licensee") accessing and otherwise using -#this software in source or binary form and its associated -#documentation ("the Software"). - -#2. Subject to the terms and conditions of this BeOpen Python License -#Agreement, BeOpen hereby grants Licensee a non-exclusive, -#royalty-free, world-wide license to reproduce, analyze, test, perform -#and/or display publicly, prepare derivative works, distribute, and -#otherwise use the Software alone or in any derivative version, -#provided, however, that the BeOpen Python License is retained in the -#Software, alone or in any derivative version prepared by Licensee. - -#3. BeOpen is making the Software available to Licensee on an "AS IS" -#basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -#SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -#AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -#DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#5. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#6. This License Agreement shall be governed by and interpreted in all -#respects by the law of the State of California, excluding conflict of -#law provisions. Nothing in this License Agreement shall be deemed to -#create any relationship of agency, partnership, or joint venture -#between BeOpen and Licensee. This License Agreement does not grant -#permission to use BeOpen trademarks or trade names in a trademark -#sense to endorse or promote products or services of Licensee, or any -#third party. As an exception, the "BeOpen Python" logos available at -#http://www.pythonlabs.com/logos.html may be used according to the -#permissions granted on that web page. - -#7. By copying, installing or otherwise using the software, Licensee -#agrees to be bound by the terms and conditions of this License -#Agreement. - - -#CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 -#--------------------------------------- - -#1. This LICENSE AGREEMENT is between the Corporation for National -#Research Initiatives, having an office at 1895 Preston White Drive, -#Reston, VA 20191 ("CNRI"), and the Individual or Organization -#("Licensee") accessing and otherwise using Python 1.6.1 software in -#source or binary form and its associated documentation. - -#2. Subject to the terms and conditions of this License Agreement, CNRI -#hereby grants Licensee a nonexclusive, royalty-free, world-wide -#license to reproduce, analyze, test, perform and/or display publicly, -#prepare derivative works, distribute, and otherwise use Python 1.6.1 -#alone or in any derivative version, provided, however, that CNRI's -#License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -#1995-2001 Corporation for National Research Initiatives; All Rights -#Reserved" are retained in Python 1.6.1 alone or in any derivative -#version prepared by Licensee. Alternately, in lieu of CNRI's License -#Agreement, Licensee may substitute the following text (omitting the -#quotes): "Python 1.6.1 is made available subject to the terms and -#conditions in CNRI's License Agreement. This Agreement together with -#Python 1.6.1 may be located on the Internet using the following -#unique, persistent identifier (known as a handle): 1895.22/1013. This -#Agreement may also be obtained from a proxy server on the Internet -#using the following URL: http://hdl.handle.net/1895.22/1013". - -#3. In the event Licensee prepares a derivative work that is based on -#or incorporates Python 1.6.1 or any part thereof, and wants to make -#the derivative work available to others as provided herein, then -#Licensee hereby agrees to include in any such work a brief summary of -#the changes made to Python 1.6.1. - -#4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -#basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -#IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -#DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -#FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -#INFRINGE ANY THIRD PARTY RIGHTS. - -#5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -#1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -#A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -#OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -#6. This License Agreement will automatically terminate upon a material -#breach of its terms and conditions. - -#7. This License Agreement shall be governed by the federal -#intellectual property law of the United States, including without -#limitation the federal copyright law, and, to the extent such -#U.S. federal law does not apply, by the law of the Commonwealth of -#Virginia, excluding Virginia's conflict of law provisions. -#Notwithstanding the foregoing, with regard to derivative works based -#on Python 1.6.1 that incorporate non-separable material that was -#previously distributed under the GNU General Public License (GPL), the -#law of the Commonwealth of Virginia shall govern this License -#Agreement only as to issues arising under or with respect to -#Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -#License Agreement shall be deemed to create any relationship of -#agency, partnership, or joint venture between CNRI and Licensee. This -#License Agreement does not grant permission to use CNRI trademarks or -#trade name in a trademark sense to endorse or promote products or -#services of Licensee, or any third party. - -#8. By clicking on the "ACCEPT" button where indicated, or by copying, -#installing or otherwise using Python 1.6.1, Licensee agrees to be -#bound by the terms and conditions of this License Agreement. - - #ACCEPT - - -#CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 -#-------------------------------------------------- - -#Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -#The Netherlands. All rights reserved. - -#Permission to use, copy, modify, and distribute this software and its -#documentation for any purpose and without fee is hereby granted, -#provided that the above copyright notice appear in all copies and that -#both that copyright notice and this permission notice appear in -#supporting documentation, and that the name of Stichting Mathematisch -#Centrum or CWI not be used in advertising or publicity pertaining to -#distribution of the software without specific, written prior -#permission. - -#STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -#THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -#FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -#FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -#WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -#ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -#OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -# Copyright (c) 2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved -# Copyright (c) 2005 Nexedi SARL and Contributors. All Rights Reserved. - -from dircache import listdir -from shutil import copy -import os, exceptions - -class Error(exceptions.EnvironmentError): - """ Simple Exception - """ - pass - -def copytree(src, dst, symlinks=False): - """Recursively copy a directory tree using copy(). - - If exception(s) occur, an Error is raised with a list of reasons. - dst dir must exist - - 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. - - Modified version of shutil.copytree that do not require - destination folder to exist. - """ - names = 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): - if not os.path.exists(dstname): - os.makedirs(dstname) - copytree(srcname, dstname, symlinks) - else: - copy(srcname, dstname) - except (IOError, os.error), why: - errors.append((srcname, dstname, str(why))) - if errors: - raise Error, errors