cedar-backup-svn Mailing List for Cedar Backup (Page 8)
Brought to you by:
pronovic
You can subscribe to this list here.
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(5) |
Dec
(50) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2008 |
Jan
|
Feb
(5) |
Mar
(55) |
Apr
(13) |
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(5) |
Nov
(3) |
Dec
(3) |
| 2009 |
Jan
|
Feb
|
Mar
(11) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(7) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2010 |
Jan
(14) |
Feb
(2) |
Mar
|
Apr
|
May
(7) |
Jun
(8) |
Jul
(30) |
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(9) |
Nov
|
Dec
|
| 2013 |
Jan
|
Feb
|
Mar
(3) |
Apr
(10) |
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(48) |
Nov
(1) |
Dec
|
| 2015 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <pro...@us...> - 2008-10-06 02:39:47
|
Revision: 927
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=927&view=rev
Author: pronovic
Date: 2008-10-06 02:39:43 +0000 (Mon, 06 Oct 2008)
Log Message:
-----------
Tagging the 2.19.0 release of Cedar Backup.
Added Paths:
-----------
cedar-backup2/tags/CEDAR_BACKUP2_V2.19.0/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-10-06 02:39:41
|
Revision: 926
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=926&view=rev
Author: pronovic
Date: 2008-10-06 02:39:19 +0000 (Mon, 06 Oct 2008)
Log Message:
-----------
Releasing 2.19.0
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/release.py
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/CedarBackup2/release.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/release.py 2008-10-06 02:38:13 UTC (rev 925)
+++ cedar-backup2/trunk/CedarBackup2/release.py 2008-10-06 02:39:19 UTC (rev 926)
@@ -34,7 +34,7 @@
AUTHOR = "Kenneth J. Pronovici"
EMAIL = "pro...@ie..."
COPYRIGHT = "2004-2008"
-VERSION = "2.18.0"
-DATE = "05 May 2008"
+VERSION = "2.19.0"
+DATE = "05 Oct 2008"
URL = "http://cedar-backup.sourceforge.net/"
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-10-06 02:38:13 UTC (rev 925)
+++ cedar-backup2/trunk/Changelog 2008-10-06 02:39:19 UTC (rev 926)
@@ -1,4 +1,4 @@
-Version 2.18.1 unreleased
+Version 2.19.0 05 Oct 2008
* Fix a few typos in the CREDITS file.
* Update README to properly reference SourceForge site.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-10-06 02:38:40
|
Revision: 925
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=925&view=rev
Author: pronovic
Date: 2008-10-06 02:38:13 +0000 (Mon, 06 Oct 2008)
Log Message:
-----------
Add <ignore_failures> option to peer configuration.
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/stage.py
Modified: cedar-backup2/trunk/CedarBackup2/actions/stage.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-10-06 02:29:46 UTC (rev 924)
+++ cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-10-06 02:38:13 UTC (rev 925)
@@ -54,7 +54,7 @@
# Cedar Backup modules
from CedarBackup2.peer import RemotePeer, LocalPeer
-from CedarBackup2.util import getUidGid, changeOwnership
+from CedarBackup2.util import getUidGid, changeOwnership, isStartOfWeek
from CedarBackup2.actions.constants import DIR_TIME_FORMAT, STAGE_INDICATOR
from CedarBackup2.actions.util import writeIndicatorFile
@@ -111,7 +111,7 @@
stagingDirs = _createStagingDirs(config, dailyDir, allPeers)
for peer in allPeers:
logger.info("Staging peer [%s]." % peer.name)
- ignoreFailures = _getIgnoreFailuresFlag(options, peer)
+ ignoreFailures = _getIgnoreFailuresFlag(options, config, peer)
if not peer.checkCollectIndicator():
if not ignoreFailures:
logger.error("Peer [%s] was not ready to be staged." % peer.name)
@@ -194,13 +194,15 @@
# _getIgnoreFailuresFlag() function
####################################
-def _getIgnoreFailuresFlag(options, peer):
+def _getIgnoreFailuresFlag(options, config, peer):
"""
- Gets the ignore failures flag based on options and peer configuration.
+ Gets the ignore failures flag based on options, configuration, and peer.
@param options: Options object
- @param peer: Peer configuration to check
+ @param config: Configuration object
+ @param peer: Peer to check
@return: Whether to ignore stage failures for this peer
"""
+ logger.debug("Ignore failure mode for this peer: %s" % peer.ignoreFailureMode)
if peer.ignoreFailureMode is None or peer.ignoreFailureMode == "none":
return False
elif peer.ignoreFailureMode == "all":
@@ -283,7 +285,8 @@
localUser = _getLocalUser(config)
rcpCommand = _getRcpCommand(config, peer)
remotePeer = RemotePeer(peer.name, peer.collectDir, config.options.workingDir,
- remoteUser, rcpCommand, localUser, peer.ignoreFailureMode)
+ remoteUser, rcpCommand, localUser,
+ ignoreFailureMode=peer.ignoreFailureMode)
remotePeers.append(remotePeer)
logger.debug("Found remote peer: [%s]" % remotePeer.name)
return remotePeers
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-10-06 02:29:57
|
Revision: 924
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=924&view=rev
Author: pronovic
Date: 2008-10-06 02:29:46 +0000 (Mon, 06 Oct 2008)
Log Message:
-----------
Add <ignore_failures> option to peer configuration.
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/stage.py
cedar-backup2/trunk/CedarBackup2/peer.py
cedar-backup2/trunk/test/peertests.py
Modified: cedar-backup2/trunk/CedarBackup2/actions/stage.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-10-06 02:11:17 UTC (rev 923)
+++ cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-10-06 02:29:46 UTC (rev 924)
@@ -253,7 +253,7 @@
configPeers = config.peers.localPeers
if configPeers is not None:
for peer in configPeers:
- localPeer = LocalPeer(peer.name, peer.collectDir)
+ localPeer = LocalPeer(peer.name, peer.collectDir, peer.ignoreFailureMode)
localPeers.append(localPeer)
logger.debug("Found local peer: [%s]" % localPeer.name)
return localPeers
@@ -283,7 +283,7 @@
localUser = _getLocalUser(config)
rcpCommand = _getRcpCommand(config, peer)
remotePeer = RemotePeer(peer.name, peer.collectDir, config.options.workingDir,
- remoteUser, rcpCommand, localUser)
+ remoteUser, rcpCommand, localUser, peer.ignoreFailureMode)
remotePeers.append(remotePeer)
logger.debug("Found remote peer: [%s]" % remotePeer.name)
return remotePeers
Modified: cedar-backup2/trunk/CedarBackup2/peer.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/peer.py 2008-10-06 02:11:17 UTC (rev 923)
+++ cedar-backup2/trunk/CedarBackup2/peer.py 2008-10-06 02:29:46 UTC (rev 924)
@@ -63,6 +63,7 @@
from CedarBackup2.filesystem import FilesystemList
from CedarBackup2.util import resolveCommand, executeCommand
from CedarBackup2.util import splitCommandLine, encodePath
+from CedarBackup2.config import VALID_FAILURE_MODES
########################################################################
@@ -110,7 +111,7 @@
# Constructor
##############
- def __init__(self, name, collectDir):
+ def __init__(self, name, collectDir, ignoreFailureMode=None):
"""
Initializes a local backup peer.
@@ -125,13 +126,18 @@
@param collectDir: Path to the peer's collect directory
@type collectDir: String representing an absolute local path on disk
+ @param ignoreFailureMode: Ignore failure mode for this peer
+ @type ignoreFailureMode: One of VALID_FAILURE_MODES
+
@raise ValueError: If the name is empty.
@raise ValueError: If collect directory is not an absolute path.
"""
self._name = None
self._collectDir = None
+ self._ignoreFailureMode = None
self.name = name
self.collectDir = collectDir
+ self.ignoreFailureMode = ignoreFailureMode
#############
@@ -172,8 +178,26 @@
"""
return self._collectDir
+ def _setIgnoreFailureMode(self, value):
+ """
+ Property target used to set the ignoreFailure mode.
+ If not C{None}, the mode must be one of the values in L{VALID_FAILURE_MODES}.
+ @raise ValueError: If the value is not valid.
+ """
+ if value is not None:
+ if value not in VALID_FAILURE_MODES:
+ raise ValueError("Ignore failure mode must be one of %s." % VALID_FAILURE_MODES)
+ self._ignoreFailureMode = value
+
+ def _getIgnoreFailureMode(self):
+ """
+ Property target used to get the ignoreFailure mode.
+ """
+ return self._ignoreFailureMode
+
name = property(_getName, _setName, None, "Name of the peer.")
collectDir = property(_getCollectDir, _setCollectDir, None, "Path to the peer's collect directory (an absolute local path).")
+ ignoreFailureMode = property(_getIgnoreFailureMode, _setIgnoreFailureMode, None, "Ignore failure mode for peer.")
#################
@@ -437,7 +461,8 @@
##############
def __init__(self, name=None, collectDir=None, workingDir=None, remoteUser=None,
- rcpCommand=None, localUser=None, rshCommand=None, cbackCommand=None):
+ rcpCommand=None, localUser=None, rshCommand=None, cbackCommand=None,
+ ignoreFailureMode=None):
"""
Initializes a remote backup peer.
@@ -471,6 +496,9 @@
@param cbackCommand: A chack-compatible command to use for executing managed actions
@type cbackCommand: String representing a system command including required arguments
+ @param ignoreFailureMode: Ignore failure mode for this peer
+ @type ignoreFailureMode: One of VALID_FAILURE_MODES
+
@raise ValueError: If collect directory is not an absolute path
"""
self._name = None
@@ -483,6 +511,7 @@
self._rshCommand = None
self._rshCommandList = None
self._cbackCommand = None
+ self._ignoreFailureMode = None
self.name = name
self.collectDir = collectDir
self.workingDir = workingDir
@@ -491,6 +520,7 @@
self.rcpCommand = rcpCommand
self.rshCommand = rshCommand
self.cbackCommand = cbackCommand
+ self.ignoreFailureMode = ignoreFailureMode
#############
@@ -671,6 +701,23 @@
"""
return self._cbackCommand
+ def _setIgnoreFailureMode(self, value):
+ """
+ Property target used to set the ignoreFailure mode.
+ If not C{None}, the mode must be one of the values in L{VALID_FAILURE_MODES}.
+ @raise ValueError: If the value is not valid.
+ """
+ if value is not None:
+ if value not in VALID_FAILURE_MODES:
+ raise ValueError("Ignore failure mode must be one of %s." % VALID_FAILURE_MODES)
+ self._ignoreFailureMode = value
+
+ def _getIgnoreFailureMode(self):
+ """
+ Property target used to get the ignoreFailure mode.
+ """
+ return self._ignoreFailureMode
+
name = property(_getName, _setName, None, "Name of the peer (a valid DNS hostname).")
collectDir = property(_getCollectDir, _setCollectDir, None, "Path to the peer's collect directory (an absolute local path).")
workingDir = property(_getWorkingDir, _setWorkingDir, None, "Path to the peer's working directory (an absolute local path).")
@@ -679,6 +726,7 @@
rcpCommand = property(_getRcpCommand, _setRcpCommand, None, "An rcp-compatible copy command to use for copying files.")
rshCommand = property(_getRshCommand, _setRshCommand, None, "An rsh-compatible command to use for remote shells to the peer.")
cbackCommand = property(_getCbackCommand, _setCbackCommand, None, "A chack-compatible command to use for executing managed actions.")
+ ignoreFailureMode = property(_getIgnoreFailureMode, _setIgnoreFailureMode, None, "Ignore failure mode for peer.")
#################
Modified: cedar-backup2/trunk/test/peertests.py
===================================================================
--- cedar-backup2/trunk/test/peertests.py 2008-10-06 02:11:17 UTC (rev 923)
+++ cedar-backup2/trunk/test/peertests.py 2008-10-06 02:29:46 UTC (rev 924)
@@ -99,7 +99,7 @@
import tarfile
import getpass
from CedarBackup2.testutil import findResources, buildPath, removedir, extractTar
-from CedarBackup2.testutil import getMaskAsMode, getLogin, runningAsRoot
+from CedarBackup2.testutil import getMaskAsMode, getLogin, runningAsRoot, failUnlessAssignRaises
from CedarBackup2.testutil import platformSupportsPermissions, platformWindows
from CedarBackup2.peer import LocalPeer, RemotePeer
from CedarBackup2.peer import DEF_RCP_COMMAND, DEF_RSH_COMMAND
@@ -178,7 +178,11 @@
"""Calls buildPath on components and then returns file mode for the file."""
return stat.S_IMODE(os.stat(self.buildPath(components)).st_mode)
+ def failUnlessAssignRaises(self, exception, object, property, value):
+ """Equivalent of L{failUnlessRaises}, but used for property assignments instead."""
+ failUnlessAssignRaises(self, exception, object, property, value)
+
###########################
# Test basic functionality
###########################
@@ -197,9 +201,11 @@
"""
name = "peer1"
collectDir = "/absolute/path/name"
- peer = LocalPeer(name, collectDir)
+ ignoreFailureMode = "all"
+ peer = LocalPeer(name, collectDir, ignoreFailureMode)
self.failUnlessEqual(name, peer.name)
self.failUnlessEqual(collectDir, peer.collectDir)
+ self.failUnlessEqual(ignoreFailureMode, peer.ignoreFailureMode)
def testBasic_003(self):
"""
@@ -212,7 +218,24 @@
self.failUnlessEqual(name, peer.name)
self.failUnlessEqual(collectDir, peer.collectDir)
+ def testBasic_004(self):
+ """
+ Make sure assignment works for all valid failure modes.
+ """
+ name = "peer1"
+ collectDir = "/absolute/path/name"
+ ignoreFailureMode = "all"
+ peer = LocalPeer(name, collectDir, ignoreFailureMode)
+ self.failUnlessEqual("all", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "none"
+ self.failUnlessEqual("none", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "daily"
+ self.failUnlessEqual("daily", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "weekly"
+ self.failUnlessEqual("weekly", peer.ignoreFailureMode)
+ self.failUnlessAssignRaises(ValueError, peer, "ignoreFailureMode", "bogus")
+
###############################
# Test checkCollectIndicator()
###############################
@@ -694,7 +717,11 @@
"""Calls buildPath on components and then returns file mode for the file."""
return stat.S_IMODE(os.stat(self.buildPath(components)).st_mode)
+ def failUnlessAssignRaises(self, exception, object, property, value):
+ """Equivalent of L{failUnlessRaises}, but used for property assignments instead."""
+ failUnlessAssignRaises(self, exception, object, property, value)
+
############################
# Tests basic functionality
############################
@@ -734,6 +761,7 @@
self.failUnlessEqual(None, peer.cbackCommand)
self.failUnlessEqual(DEF_RCP_COMMAND, peer._rcpCommandList)
self.failUnlessEqual(DEF_RSH_COMMAND, peer._rshCommandList)
+ self.failUnlessEqual(None, peer.ignoreFailureMode)
def testBasic_003(self):
"""
@@ -833,7 +861,21 @@
self.failUnlessEqual(None, peer.rshCommand)
self.failUnlessEqual(cbackCommand, peer.cbackCommand)
+ def testBasic_008(self):
+ """
+ Make sure assignment works for all valid failure modes.
+ """
+ peer = RemotePeer(name="name", remoteUser="user", ignoreFailureMode="all")
+ self.failUnlessEqual("all", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "none"
+ self.failUnlessEqual("none", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "daily"
+ self.failUnlessEqual("daily", peer.ignoreFailureMode)
+ peer.ignoreFailureMode = "weekly"
+ self.failUnlessEqual("weekly", peer.ignoreFailureMode)
+ self.failUnlessAssignRaises(ValueError, peer, "ignoreFailureMode", "bogus")
+
###############################
# Test checkCollectIndicator()
###############################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-10-06 02:11:24
|
Revision: 923
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=923&view=rev
Author: pronovic
Date: 2008-10-06 02:11:17 +0000 (Mon, 06 Oct 2008)
Log Message:
-----------
Add <ignore_failures> option to peer configuration.
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/stage.py
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/manual/src/config.xml
cedar-backup2/trunk/test/configtests.py
cedar-backup2/trunk/test/data/cback.conf.10
cedar-backup2/trunk/test/data/cback.conf.15
cedar-backup2/trunk/test/data/cback.conf.20
cedar-backup2/trunk/test/data/cback.conf.21
cedar-backup2/trunk/test/data/cback.conf.23
Modified: cedar-backup2/trunk/CedarBackup2/actions/stage.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/CedarBackup2/actions/stage.py 2008-10-06 02:11:17 UTC (rev 923)
@@ -111,8 +111,12 @@
stagingDirs = _createStagingDirs(config, dailyDir, allPeers)
for peer in allPeers:
logger.info("Staging peer [%s]." % peer.name)
+ ignoreFailures = _getIgnoreFailuresFlag(options, peer)
if not peer.checkCollectIndicator():
- logger.error("Peer [%s] was not ready to be staged." % peer.name)
+ if not ignoreFailures:
+ logger.error("Peer [%s] was not ready to be staged." % peer.name)
+ else:
+ logger.info("Peer [%s] was not ready to be staged." % peer.name)
continue
logger.debug("Found collect indicator.")
targetDir = stagingDirs[peer.name]
@@ -186,6 +190,28 @@
# Private attribute "getter" functions
########################################################################
+####################################
+# _getIgnoreFailuresFlag() function
+####################################
+
+def _getIgnoreFailuresFlag(options, peer):
+ """
+ Gets the ignore failures flag based on options and peer configuration.
+ @param options: Options object
+ @param peer: Peer configuration to check
+ @return: Whether to ignore stage failures for this peer
+ """
+ if peer.ignoreFailureMode is None or peer.ignoreFailureMode == "none":
+ return False
+ elif peer.ignoreFailureMode == "all":
+ return True
+ else:
+ if options.full or isStartOfWeek(config.options.startingDay):
+ return peer.ignoreFailureMode == "weekly"
+ else:
+ return peer.ignoreFailureMode == "daily"
+
+
##########################
# _getDailyDir() function
##########################
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2008-10-06 02:11:17 UTC (rev 923)
@@ -272,6 +272,7 @@
VALID_ORDER_MODES = [ "index", "dependency", ]
VALID_BLANK_MODES = [ "daily", "weekly", ]
VALID_BYTE_UNITS = [ UNIT_BYTES, UNIT_KBYTES, UNIT_MBYTES, UNIT_GBYTES, ]
+VALID_FAILURE_MODES = [ "none", "all", "daily", "weekly", ]
REWRITABLE_MEDIA_TYPES = [ "cdrw-74", "cdrw-80", "dvd+rw", ]
@@ -1794,29 +1795,33 @@
- The peer name must be a non-empty string.
- The collect directory must be an absolute path.
+ - The ignore failure mode must be one of the values in L{VALID_FAILURE_MODES}.
@sort: __init__, __repr__, __str__, __cmp__, name, collectDir
"""
- def __init__(self, name=None, collectDir=None):
+ def __init__(self, name=None, collectDir=None, ignoreFailureMode=None):
"""
Constructor for the C{LocalPeer} class.
@param name: Name of the peer, typically a valid hostname.
@param collectDir: Collect directory to stage files from on peer.
+ @param ignoreFailureMode: Ignore failure mode for peer.
@raise ValueError: If one of the values is invalid.
"""
self._name = None
self._collectDir = None
+ self._ignoreFailureMode = None
self.name = name
self.collectDir = collectDir
+ self.ignoreFailureMode = ignoreFailureMode
def __repr__(self):
"""
Official string representation for class instance.
"""
- return "LocalPeer(%s, %s)" % (self.name, self.collectDir)
+ return "LocalPeer(%s, %s, %s)" % (self.name, self.collectDir, self.ignoreFailureMode)
def __str__(self):
"""
@@ -1842,6 +1847,11 @@
return -1
else:
return 1
+ if self._ignoreFailureMode != other._ignoreFailureMode:
+ if self._ignoreFailureMode < other._ignoreFailureMode:
+ return -1
+ else:
+ return 1
return 0
def _setName(self, value):
@@ -1880,8 +1890,26 @@
"""
return self._collectDir
+ def _setIgnoreFailureMode(self, value):
+ """
+ Property target used to set the ignoreFailure mode.
+ If not C{None}, the mode must be one of the values in L{VALID_FAILURE_MODES}.
+ @raise ValueError: If the value is not valid.
+ """
+ if value is not None:
+ if value not in VALID_FAILURE_MODES:
+ raise ValueError("Ignore failure mode must be one of %s." % VALID_FAILURE_MODES)
+ self._ignoreFailureMode = value
+
+ def _getIgnoreFailureMode(self):
+ """
+ Property target used to get the ignoreFailure mode.
+ """
+ return self._ignoreFailureMode
+
name = property(_getName, _setName, None, "Name of the peer, typically a valid hostname.")
collectDir = property(_getCollectDir, _setCollectDir, None, "Collect directory to stage files from on peer.")
+ ignoreFailureMode = property(_getIgnoreFailureMode, _setIgnoreFailureMode, None, "Ignore failure mode for peer.")
########################################################################
@@ -1908,13 +1936,14 @@
- The rsh command must be a non-empty string.
- The cback command must be a non-empty string.
- Any managed action name must be a non-empty string matching C{ACTION_NAME_REGEX}
+ - The ignore failure mode must be one of the values in L{VALID_FAILURE_MODES}.
@sort: __init__, __repr__, __str__, __cmp__, name, collectDir, remoteUser, rcpCommand
"""
def __init__(self, name=None, collectDir=None, remoteUser=None,
rcpCommand=None, rshCommand=None, cbackCommand=None,
- managed=False, managedActions=None):
+ managed=False, managedActions=None, ignoreFailureMode=None):
"""
Constructor for the C{RemotePeer} class.
@@ -1926,6 +1955,7 @@
@param cbackCommand: Overridden cback-compatible command to use on remote peer.
@param managed: Indicates whether this is a managed peer.
@param managedActions: Overridden set of actions that are managed on the peer.
+ @param ignoreFailureMode: Ignore failure mode for peer.
@raise ValueError: If one of the values is invalid.
"""
@@ -1937,6 +1967,7 @@
self._cbackCommand = None
self._managed = None
self._managedActions = None
+ self._ignoreFailureMode = None
self.name = name
self.collectDir = collectDir
self.remoteUser = remoteUser
@@ -1945,14 +1976,15 @@
self.cbackCommand = cbackCommand
self.managed = managed
self.managedActions = managedActions
+ self.ignoreFailureMode = ignoreFailureMode
def __repr__(self):
"""
Official string representation for class instance.
"""
- return "RemotePeer(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.name, self.collectDir, self.remoteUser,
- self.rcpCommand, self.rshCommand, self.cbackCommand,
- self.managed, self.managedActions)
+ return "RemotePeer(%s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.name, self.collectDir, self.remoteUser,
+ self.rcpCommand, self.rshCommand, self.cbackCommand,
+ self.managed, self.managedActions, self.ignoreFailureMode)
def __str__(self):
"""
@@ -2008,6 +2040,11 @@
return -1
else:
return 1
+ if self._ignoreFailureMode != other._ignoreFailureMode:
+ if self._ignoreFailureMode < other._ignoreFailureMode:
+ return -1
+ else:
+ return 1
return 0
def _setName(self, value):
@@ -2152,6 +2189,23 @@
"""
return self._managedActions
+ def _setIgnoreFailureMode(self, value):
+ """
+ Property target used to set the ignoreFailure mode.
+ If not C{None}, the mode must be one of the values in L{VALID_FAILURE_MODES}.
+ @raise ValueError: If the value is not valid.
+ """
+ if value is not None:
+ if value not in VALID_FAILURE_MODES:
+ raise ValueError("Ignore failure mode must be one of %s." % VALID_FAILURE_MODES)
+ self._ignoreFailureMode = value
+
+ def _getIgnoreFailureMode(self):
+ """
+ Property target used to get the ignoreFailure mode.
+ """
+ return self._ignoreFailureMode
+
name = property(_getName, _setName, None, "Name of the peer, must be a valid hostname.")
collectDir = property(_getCollectDir, _setCollectDir, None, "Collect directory to stage files from on peer.")
remoteUser = property(_getRemoteUser, _setRemoteUser, None, "Name of backup user on remote peer.")
@@ -2160,6 +2214,7 @@
cbackCommand = property(_getCbackCommand, _setCbackCommand, None, "Overridden cback-compatible command to use on remote peer.")
managed = property(_getManaged, _setManaged, None, "Indicates whether this is a managed peer.")
managedActions = property(_getManagedActions, _setManagedActions, None, "Overridden set of actions that are managed on the peer.")
+ ignoreFailureMode = property(_getIgnoreFailureMode, _setIgnoreFailureMode, None, "Ignore failure mode for peer.")
########################################################################
@@ -4846,6 +4901,7 @@
localPeer = LocalPeer()
localPeer.name = readString(entry, "name")
localPeer.collectDir = readString(entry, "collect_dir")
+ localPeer.ignoreFailureMode = readString(entry, "ignore_failures")
localPeers.append(localPeer)
elif peerType == "remote":
remotePeer = RemotePeer()
@@ -4855,6 +4911,7 @@
remotePeer.rcpCommand = readString(entry, "rcp_command")
remotePeer.rshCommand = readString(entry, "rsh_command")
remotePeer.cbackCommand = readString(entry, "cback_command")
+ remotePeer.ignoreFailureMode = readString(entry, "ignore_failures")
remotePeer.managed = readBoolean(entry, "managed")
managedActions = readString(entry, "managed_actions")
remotePeer.managedActions = Config._parseCommaSeparatedString(managedActions)
@@ -5443,8 +5500,9 @@
We add the following fields to the document::
- name peer/name
- collectDir peer/collect_dir
+ name peer/name
+ collectDir peer/collect_dir
+ ignoreFailureMode peer/ignore_failures
Additionally, C{peer/type} is filled in with C{"local"}, since this is a
local peer.
@@ -5464,6 +5522,7 @@
addStringNode(xmlDom, sectionNode, "name", localPeer.name)
addStringNode(xmlDom, sectionNode, "type", "local")
addStringNode(xmlDom, sectionNode, "collect_dir", localPeer.collectDir)
+ addStringNode(xmlDom, sectionNode, "ignore_failures", localPeer.ignoreFailureMode)
_addLocalPeer = staticmethod(_addLocalPeer)
def _addRemotePeer(xmlDom, parentNode, remotePeer):
@@ -5472,15 +5531,16 @@
We add the following fields to the document::
- name peer/name
- collectDir peer/collect_dir
- remoteUser peer/backup_user
- rcpCommand peer/rcp_command
- rcpCommand peer/rcp_command
- rshCommand peer/rsh_command
- cbackCommand peer/cback_command
- managed peer/managed
- managedActions peer/managed_actions
+ name peer/name
+ collectDir peer/collect_dir
+ remoteUser peer/backup_user
+ rcpCommand peer/rcp_command
+ rcpCommand peer/rcp_command
+ rshCommand peer/rsh_command
+ cbackCommand peer/cback_command
+ ignoreFailureMode peer/ignore_failures
+ managed peer/managed
+ managedActions peer/managed_actions
Additionally, C{peer/type} is filled in with C{"remote"}, since this is a
remote peer.
@@ -5504,6 +5564,7 @@
addStringNode(xmlDom, sectionNode, "rcp_command", remotePeer.rcpCommand)
addStringNode(xmlDom, sectionNode, "rsh_command", remotePeer.rshCommand)
addStringNode(xmlDom, sectionNode, "cback_command", remotePeer.cbackCommand)
+ addStringNode(xmlDom, sectionNode, "ignore_failures", remotePeer.ignoreFailureMode)
addBooleanNode(xmlDom, sectionNode, "managed", remotePeer.managed)
managedActions = Config._buildCommaSeparatedString(remotePeer.managedActions)
addStringNode(xmlDom, sectionNode, "managed_actions", managedActions)
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/Changelog 2008-10-06 02:11:17 UTC (rev 923)
@@ -2,6 +2,7 @@
* Fix a few typos in the CREDITS file.
* Update README to properly reference SourceForge site.
+ * Add <ignore_failures> option to peer configuration.
Version 2.18.0 05 May 2008
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/manual/src/config.xml 2008-10-06 02:11:17 UTC (rev 923)
@@ -775,6 +775,7 @@
<type>remote</type>
<backup_user>backup</backup_user>
<collect_dir>/opt/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
@@ -846,7 +847,6 @@
</listitem>
</varlistentry>
-
<varlistentry>
<term><literal>collect_dir</literal></term>
<listitem>
@@ -864,6 +864,36 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><literal>ignore_failures</literal></term>
+ <listitem>
+ <para>Ignore failure mode for this peer</para>
+ <para>
+ The ignore failure mode indicates whether
+ <quote>not ready to be staged</quote> errors
+ should be ignored for this peer. This option is
+ intended to be used for peers that are up only
+ intermittently, to cut down on the number of
+ error emails received by the Cedar Backup
+ administrator.
+ </para>
+ <para>
+ The "none" mode means that all errors will be
+ reported. This is the default behavior. The
+ "all" mode means to ignore all failures. The
+ "weekly" mode means to ignore failures for a
+ start-of-week or full backup. The "daily" mode
+ means to ignore failures for any backup that is
+ not either a full backup or a start-of-week
+ backup.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> If set, must
+ be one of "none", "all", "daily", or "weekly".
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</listitem>
@@ -958,6 +988,36 @@
</varlistentry>
<varlistentry>
+ <term><literal>ignore_failures</literal></term>
+ <listitem>
+ <para>Ignore failure mode for this peer</para>
+ <para>
+ The ignore failure mode indicates whether
+ <quote>not ready to be staged</quote> errors
+ should be ignored for this peer. This option is
+ intended to be used for peers that are up only
+ intermittently, to cut down on the number of
+ error emails received by the Cedar Backup
+ administrator.
+ </para>
+ <para>
+ The "none" mode means that all errors will be
+ reported. This is the default behavior. The
+ "all" mode means to ignore all failures. The
+ "weekly" mode means to ignore failures for a
+ start-of-week or full backup. The "daily" mode
+ means to ignore failures for any backup that is
+ not either a full backup or a start-of-week
+ backup.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> If set, must
+ be one of "none", "all", "daily", or "weekly".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>backup_user</literal></term>
<listitem>
<para>Name of backup user on the remote peer.</para>
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/configtests.py 2008-10-06 02:11:17 UTC (rev 923)
@@ -3512,14 +3512,16 @@
localPeer = LocalPeer()
self.failUnlessEqual(None, localPeer.name)
self.failUnlessEqual(None, localPeer.collectDir)
+ self.failUnlessEqual(None, localPeer.ignoreFailureMode)
def testConstructor_002(self):
"""
Test constructor with all values filled in, with valid values.
"""
- localPeer = LocalPeer("myname", "/whatever")
+ localPeer = LocalPeer("myname", "/whatever", "all")
self.failUnlessEqual("myname", localPeer.name)
self.failUnlessEqual("/whatever", localPeer.collectDir)
+ self.failUnlessEqual("all", localPeer.ignoreFailureMode)
def testConstructor_003(self):
"""
@@ -3584,7 +3586,39 @@
self.failUnlessAssignRaises(ValueError, localPeer, "collectDir", "bogus")
self.failUnlessEqual(None, localPeer.collectDir)
+ def testConstructor_010(self):
+ """
+ Test assignment of ignoreFailureMode attribute, valid values.
+ """
+ localPeer = LocalPeer()
+ self.failUnlessEqual(None, localPeer.ignoreFailureMode)
+ localPeer.ignoreFailureMode = "none"
+ self.failUnlessEqual("none", localPeer.ignoreFailureMode)
+ localPeer.ignoreFailureMode = "all"
+ self.failUnlessEqual("all", localPeer.ignoreFailureMode)
+ localPeer.ignoreFailureMode = "daily"
+ self.failUnlessEqual("daily", localPeer.ignoreFailureMode)
+ localPeer.ignoreFailureMode = "weekly"
+ self.failUnlessEqual("weekly", localPeer.ignoreFailureMode)
+ def testConstructor_011(self):
+ """
+ Test assignment of ignoreFailureMode attribute, invalid value.
+ """
+ localPeer = LocalPeer()
+ self.failUnlessEqual(None, localPeer.ignoreFailureMode)
+ self.failUnlessAssignRaises(ValueError, localPeer, "ignoreFailureMode", "bogus")
+
+ def testConstructor_012(self):
+ """
+ Test assignment of ignoreFailureMode attribute, None value.
+ """
+ localPeer = LocalPeer()
+ self.failUnlessEqual(None, localPeer.ignoreFailureMode)
+ localPeer.ignoreFailureMode = None;
+ self.failUnlessEqual(None, localPeer.ignoreFailureMode)
+
+
############################
# Test comparison operators
############################
@@ -3607,8 +3641,8 @@
"""
Test comparison of two identical objects, all attributes non-None.
"""
- localPeer1 = LocalPeer("myname", "/etc/stuff")
- localPeer2 = LocalPeer("myname", "/etc/stuff")
+ localPeer1 = LocalPeer("myname", "/etc/stuff", "all")
+ localPeer2 = LocalPeer("myname", "/etc/stuff", "all")
self.failUnless(localPeer1 == localPeer2)
self.failUnless(not localPeer1 < localPeer2)
self.failUnless(localPeer1 <= localPeer2)
@@ -3634,8 +3668,8 @@
"""
Test comparison of two differing objects, name differs.
"""
- localPeer1 = LocalPeer("name", "/etc/stuff")
- localPeer2 = LocalPeer("name", "/etc/whatever")
+ localPeer1 = LocalPeer("name", "/etc/stuff", "all")
+ localPeer2 = LocalPeer("name", "/etc/whatever", "all")
self.failIfEqual(localPeer1, localPeer2)
self.failUnless(not localPeer1 == localPeer2)
self.failUnless(localPeer1 < localPeer2)
@@ -3662,8 +3696,8 @@
"""
Test comparison of two differing objects, collectDir differs.
"""
- localPeer1 = LocalPeer("name2", "/etc/stuff")
- localPeer2 = LocalPeer("name1", "/etc/stuff")
+ localPeer1 = LocalPeer("name2", "/etc/stuff", "all")
+ localPeer2 = LocalPeer("name1", "/etc/stuff", "all")
self.failIfEqual(localPeer1, localPeer2)
self.failUnless(not localPeer1 == localPeer2)
self.failUnless(not localPeer1 < localPeer2)
@@ -3672,7 +3706,35 @@
self.failUnless(localPeer1 >= localPeer2)
self.failUnless(localPeer1 != localPeer2)
+ def testComparison_008(self):
+ """
+ Test comparison of two differing objects, ignoreFailureMode differs (one None).
+ """
+ localPeer1 = LocalPeer()
+ localPeer2 = LocalPeer(ignoreFailureMode="all")
+ self.failIfEqual(localPeer1, localPeer2)
+ self.failUnless(not localPeer1 == localPeer2)
+ self.failUnless(localPeer1 < localPeer2)
+ self.failUnless(localPeer1 <= localPeer2)
+ self.failUnless(not localPeer1 > localPeer2)
+ self.failUnless(not localPeer1 >= localPeer2)
+ self.failUnless(localPeer1 != localPeer2)
+ def testComparison_009(self):
+ """
+ Test comparison of two differing objects, collectDir differs.
+ """
+ localPeer1 = LocalPeer("name1", "/etc/stuff", "none")
+ localPeer2 = LocalPeer("name1", "/etc/stuff", "all")
+ self.failIfEqual(localPeer1, localPeer2)
+ self.failUnless(not localPeer1 == localPeer2)
+ self.failUnless(not localPeer1 < localPeer2)
+ self.failUnless(not localPeer1 <= localPeer2)
+ self.failUnless(localPeer1 > localPeer2)
+ self.failUnless(localPeer1 >= localPeer2)
+ self.failUnless(localPeer1 != localPeer2)
+
+
#######################
# TestRemotePeer class
#######################
@@ -3720,12 +3782,13 @@
self.failUnlessEqual(None, remotePeer.cbackCommand)
self.failUnlessEqual(False, remotePeer.managed)
self.failUnlessEqual(None, remotePeer.managedActions)
+ self.failUnlessEqual(None, remotePeer.ignoreFailureMode)
def testConstructor_002(self):
"""
Test constructor with all values filled in, with valid values.
"""
- remotePeer = RemotePeer("myname", "/stuff", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer = RemotePeer("myname", "/stuff", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failUnlessEqual("myname", remotePeer.name)
self.failUnlessEqual("/stuff", remotePeer.collectDir)
self.failUnlessEqual("backup", remotePeer.remoteUser)
@@ -3734,6 +3797,7 @@
self.failUnlessEqual("cback", remotePeer.cbackCommand)
self.failUnlessEqual(True, remotePeer.managed)
self.failUnlessEqual(["collect", ], remotePeer.managedActions)
+ self.failUnlessEqual("all", remotePeer.ignoreFailureMode)
def testConstructor_003(self):
"""
@@ -3977,7 +4041,39 @@
self.failUnlessEqual(None, remotePeer.managedActions)
self.failUnlessAssignRaises(ValueError, remotePeer, "managedActions", ["ken", "dash-word", ])
+ def testConstructor_029(self):
+ """
+ Test assignment of ignoreFailureMode attribute, valid values.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.ignoreFailureMode)
+ remotePeer.ignoreFailureMode = "none"
+ self.failUnlessEqual("none", remotePeer.ignoreFailureMode)
+ remotePeer.ignoreFailureMode = "all"
+ self.failUnlessEqual("all", remotePeer.ignoreFailureMode)
+ remotePeer.ignoreFailureMode = "daily"
+ self.failUnlessEqual("daily", remotePeer.ignoreFailureMode)
+ remotePeer.ignoreFailureMode = "weekly"
+ self.failUnlessEqual("weekly", remotePeer.ignoreFailureMode)
+ def testConstructor_030(self):
+ """
+ Test assignment of ignoreFailureMode attribute, invalid value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.ignoreFailureMode)
+ self.failUnlessAssignRaises(ValueError, remotePeer, "ignoreFailureMode", "bogus")
+
+ def testConstructor_031(self):
+ """
+ Test assignment of ignoreFailureMode attribute, None value.
+ """
+ remotePeer = RemotePeer()
+ self.failUnlessEqual(None, remotePeer.ignoreFailureMode)
+ remotePeer.ignoreFailureMode = None;
+ self.failUnlessEqual(None, remotePeer.ignoreFailureMode)
+
+
############################
# Test comparison operators
############################
@@ -4000,8 +4096,8 @@
"""
Test comparison of two identical objects, all attributes non-None.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failUnless(remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
self.failUnless(remotePeer1 <= remotePeer2)
@@ -4027,8 +4123,8 @@
"""
Test comparison of two differing objects, name differs.
"""
- remotePeer1 = RemotePeer("name1", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name2", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name1", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name2", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4055,8 +4151,8 @@
"""
Test comparison of two differing objects, collectDir differs.
"""
- remotePeer1 = RemotePeer("name", "/etc", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4083,8 +4179,8 @@
"""
Test comparison of two differing objects, remoteUser differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "spot", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "spot", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -4111,8 +4207,8 @@
"""
Test comparison of two differing objects, rcpCommand differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -2 -B", "ssh", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -2 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -4139,8 +4235,8 @@
"""
Test comparison of two differing objects, rshCommand differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh2", "cback", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh1", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh2", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh1", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -4167,8 +4263,8 @@
"""
Test comparison of two differing objects, cbackCommand differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback2", True, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback1", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback2", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback1", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -4195,8 +4291,8 @@
"""
Test comparison of two differing objects, managed differs.
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", False, [ "collect", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", False, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4210,8 +4306,8 @@
Test comparison of two differing objects, managedActions differs (one
None, one empty).
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None)
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None, "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4225,8 +4321,8 @@
Test comparison of two differing objects, managedActions differs (one
None, one not empty).
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None)
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, None, "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4240,8 +4336,8 @@
Test comparison of two differing objects, managedActions differs (one
empty, one not empty).
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [] )
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [], "all" )
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(remotePeer1 < remotePeer2)
@@ -4255,8 +4351,8 @@
Test comparison of two differing objects, managedActions differs (both
not empty).
"""
- remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "purge", ])
- remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ])
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "purge", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
self.failIfEqual(remotePeer1, remotePeer2)
self.failUnless(not remotePeer1 == remotePeer2)
self.failUnless(not remotePeer1 < remotePeer2)
@@ -4265,7 +4361,35 @@
self.failUnless(remotePeer1 >= remotePeer2)
self.failUnless(remotePeer1 != remotePeer2)
+ def testComparison_021(self):
+ """
+ Test comparison of two differing objects, ignoreFailureMode differs (one None).
+ """
+ remotePeer1 = RemotePeer()
+ remotePeer2 = RemotePeer(ignoreFailureMode="all")
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+ def testComparison_022(self):
+ """
+ Test comparison of two differing objects, ignoreFailureMode differs.
+ """
+ remotePeer1 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "all")
+ remotePeer2 = RemotePeer("name", "/etc/stuff/tmp/X11", "backup", "scp -1 -B", "ssh", "cback", True, [ "collect", ], "none")
+ self.failIfEqual(remotePeer1, remotePeer2)
+ self.failUnless(not remotePeer1 == remotePeer2)
+ self.failUnless(remotePeer1 < remotePeer2)
+ self.failUnless(remotePeer1 <= remotePeer2)
+ self.failUnless(not remotePeer1 > remotePeer2)
+ self.failUnless(not remotePeer1 >= remotePeer2)
+ self.failUnless(remotePeer1 != remotePeer2)
+
+
############################
# TestReferenceConfig class
############################
@@ -11120,7 +11244,7 @@
expected.stage.remotePeers = []
expected.stage.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.stage.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.stage.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
self.failUnlessEqual(expected, config)
@@ -11268,7 +11392,7 @@
expected.stage.remotePeers = []
expected.stage.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.stage.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.stage.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.store = StoreConfig()
expected.store.sourceDir = "/opt/backup/staging"
@@ -11336,7 +11460,7 @@
expected.stage.remotePeers = []
expected.stage.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.stage.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.stage.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.store = StoreConfig()
expected.store.sourceDir = "/opt/backup/staging"
@@ -11401,7 +11525,7 @@
expected.stage.remotePeers = []
expected.stage.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.stage.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.stage.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.store = StoreConfig()
expected.store.sourceDir = "/opt/backup/staging"
@@ -11469,7 +11593,7 @@
expected.stage.remotePeers = []
expected.stage.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.stage.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.stage.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.stage.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.store = StoreConfig()
expected.store.sourceDir = "/opt/backup/staging"
@@ -11597,7 +11721,7 @@
expected.peers.remotePeers = []
expected.peers.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.peers.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.peers.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.peers.remotePeers.append(RemotePeer("machine4", "/aa", remoteUser="someone", rcpCommand="scp -B", rshCommand="ssh", cbackCommand="cback", managed=True, managedActions=None))
expected.peers.remotePeers.append(RemotePeer("machine5", "/bb", managed=False, managedActions=["collect", "purge",]))
@@ -11669,7 +11793,7 @@
expected.peers.remotePeers = []
expected.peers.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.peers.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.peers.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.peers.remotePeers.append(RemotePeer("machine4", "/aa", remoteUser="someone", rcpCommand="scp -B", rshCommand="ssh", cbackCommand="cback", managed=True, managedActions=None))
expected.peers.remotePeers.append(RemotePeer("machine5", "/bb", managed=False, managedActions=["collect", "purge",]))
@@ -11750,7 +11874,7 @@
expected.peers.remotePeers = []
expected.peers.localPeers.append(LocalPeer("machine1-1", "/opt/backup/collect"))
expected.peers.localPeers.append(LocalPeer("machine1-2", "/var/backup"))
- expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect"))
+ expected.peers.remotePeers.append(RemotePeer("machine2", "/backup/collect", ignoreFailureMode="all"))
expected.peers.remotePeers.append(RemotePeer("machine3", "/home/whatever/tmp", remoteUser="someone", rcpCommand="scp -B"))
expected.peers.remotePeers.append(RemotePeer("machine4", "/aa", remoteUser="someone", rcpCommand="scp -B", rshCommand="ssh", cbackCommand="cback", managed=True, managedActions=None))
expected.peers.remotePeers.append(RemotePeer("machine5", "/bb", managed=False, managedActions=["collect", "purge",]))
Modified: cedar-backup2/trunk/test/data/cback.conf.10
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.10 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/data/cback.conf.10 2008-10-06 02:11:17 UTC (rev 923)
@@ -17,6 +17,7 @@
<name>machine2</name>
<type>remote</type>
<collect_dir>/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
Modified: cedar-backup2/trunk/test/data/cback.conf.15
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.15 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/data/cback.conf.15 2008-10-06 02:11:17 UTC (rev 923)
@@ -125,6 +125,7 @@
<name>machine2</name>
<type>remote</type>
<collect_dir>/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
Modified: cedar-backup2/trunk/test/data/cback.conf.20
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.20 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/data/cback.conf.20 2008-10-06 02:11:17 UTC (rev 923)
@@ -128,6 +128,7 @@
<name>machine2</name>
<type>remote</type>
<collect_dir>/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
Modified: cedar-backup2/trunk/test/data/cback.conf.21
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.21 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/data/cback.conf.21 2008-10-06 02:11:17 UTC (rev 923)
@@ -70,6 +70,7 @@
<name>machine2</name>
<type>remote</type>
<collect_dir>/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
Modified: cedar-backup2/trunk/test/data/cback.conf.23
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.23 2008-05-06 15:32:44 UTC (rev 922)
+++ cedar-backup2/trunk/test/data/cback.conf.23 2008-10-06 02:11:17 UTC (rev 923)
@@ -16,6 +16,7 @@
<name>machine2</name>
<type>remote</type>
<collect_dir>/backup/collect</collect_dir>
+ <ignore_failures>all</ignore_failures>
</peer>
<peer>
<name>machine3</name>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 15:32:49
|
Revision: 922
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=922&view=rev
Author: pronovic
Date: 2008-05-06 08:32:44 -0700 (Tue, 06 May 2008)
Log Message:
-----------
Add gmailfs.txt
Added Paths:
-----------
cedar-backup2/trunk/doc/gmailfs.txt
Added: cedar-backup2/trunk/doc/gmailfs.txt
===================================================================
--- cedar-backup2/trunk/doc/gmailfs.txt (rev 0)
+++ cedar-backup2/trunk/doc/gmailfs.txt 2008-05-06 15:32:44 UTC (rev 922)
@@ -0,0 +1,110 @@
+===========
+Background
+===========
+
+I got a request (SF bug 1930764) to create a "store to another location"
+extension that people could use to write backups using gmailfs rather than
+normal media like CDs or DVDs. What follows is the research I did to try
+and get gmailfs working on my box running Debian etch.
+
+Basically, it didn't work -- or at least, it didn't work well enough that I
+would feel comfortable recommending it to Cedar Backup users. I wanted to
+document this experience here in the codebase, just in case anyone had
+questions.
+
+
+=========================================
+Build and install packages from unstable
+=========================================
+
+Get gmailfs and python-libgmail, which do not need to be built:
+
+ wget http://http.us.debian.org/debian/pool/main/g/gmailfs/gmailfs_0.8-2_all.deb
+ wget http://http.us.debian.org/debian/pool/main/p/python-libgmail/python-libgmail_0.1.8-1_all.deb
+
+Get the source for the other required packages:
+
+ apt-get source fuse
+ apt-get source python-fuse
+
+Build the fuse packages:
+
+ aptitude install dpatch libselinux1-dev libsepol1-dev
+ dpkg-buildpackage -rfakeroot -i
+
+Build the python-fuse package:
+
+ aptitude cdbs dh-buildinfo python-all python-all-dev
+ dpkg --install libfuse2_2.7.3-4_i386.deb # just built
+ dpkg --install libfuse-dev_2.7.3-4_i386.deb # just built
+ dpkg-buildpackage -rfakeroot -i
+
+Install the rest of the packages:
+
+ dpkg --install fuse-utils_2.7.3-4_i386.deb
+ dpkg --install python-fuse_0.2-pre3-5_i386.deb
+ dpkg --install python-libgmail_0.1.8-1_all.deb
+ dpkg --install gmailfs_0.8-2_all.deb
+
+
+=====================
+Mount the filesystem
+=====================
+
+Add fuse to pronovic's groupset:
+
+ usermod -G users,cdrom,floppy,audio,video,scanner,fuse pronovic
+
+You'll probably have to log back in before this takes effect, so make sure that
+fuse is in the active groupset before continuing.
+
+Create the fuse device:
+
+ mknod -m 666 /dev/fuse c 10 229
+
+Create a mountpoint:
+
+ mkdir -p ~/tmp/mnt/gmailfs
+
+Mount the filesystem:
+
+ mount.gmailfs none ~/tmp/mnt/gmailfs -o use...@gm...,fsname=zOlRRa -p
+
+Note that the fsname should be something difficult to guess, because otherwise
+people can send you mail and corrupt your filesystem. The -p option tells gmail
+to prompt you for the password interactively
+
+Create a subject filter on gmail for subject "__g__zOlRRa__h__". This way, you
+can auto-archive the messages that comprise your filesystem. You may also want
+to attach a label to them, so you can find them. Note that the "zOlRRa" must
+match the fsname you used when mounting the filesystem.
+
+At this point, the new filesystem seems to work like any other filesystem,
+except that it's much slower. Other things aren't particularly usable -- for
+instance filename completion. Also, note that every operation you attempt
+shows up as item in your sent mail folder.
+
+I have seen problems doing normal directory operations:
+
+ /home/pronovic/tmp/mnt/gmailfs> ls -l
+ ls: reading directory .: Invalid argument
+ total 0
+
+So, I created a subdirectory called contents. That seemed to work better initially:
+
+ /home/pronovic/tmp/mnt/gmailfs> mkdir contents
+ /home/pronovic/tmp/mnt/gmailfs> ls -l contents
+ total 0
+
+Eventually, I had problems:
+
+ /home/pronovic/tmp/mnt/gmailfs/contents> cp ~/.profile profile
+ /home/pronovic/tmp/mnt/gmailfs/contents> ls -l
+ ls: reading directory .: Invalid argument
+ total 0
+ /home/pronovic/tmp/mnt/gmailfs/contents> ls -l profile
+ -rw-r--r-- 1 pronovic users 4361 2008-05-06 10:08 profile
+
+This is probably OK, as long as all I want to do is deal with individual files, but
+it makes it kind of difficult to use the filesystem in a general sense. I think I'm
+going to give up for now.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 02:12:54
|
Revision: 921
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=921&view=rev
Author: pronovic
Date: 2008-05-05 19:12:52 -0700 (Mon, 05 May 2008)
Log Message:
-----------
Update README to properly reference SourceForge site.
Modified Paths:
--------------
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/README
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-05-06 02:05:09 UTC (rev 920)
+++ cedar-backup2/trunk/Changelog 2008-05-06 02:12:52 UTC (rev 921)
@@ -1,8 +1,8 @@
Version 2.18.1 unreleased
* Fix a few typos in the CREDITS file.
+ * Update README to properly reference SourceForge site.
-
Version 2.18.0 05 May 2008
* Add the ability to dereference links when following them.
Modified: cedar-backup2/trunk/README
===================================================================
--- cedar-backup2/trunk/README 2008-05-06 02:05:09 UTC (rev 920)
+++ cedar-backup2/trunk/README 2008-05-06 02:12:52 UTC (rev 921)
@@ -39,12 +39,11 @@
For more information, see the Cedar Backup web site:
- http://cedar-solutions.com/software/cedar-backup
+ http://cedar-backup.sourceforge.net/
-If you regularly use Cedar Backup, you might also like to join the
-low-volume Cedar Backup mailing list:
+If you regularly use Cedar Backup, you might also want to join the
+low-volume cedar-backup-users mailing list, which you can subscribe to via
+the SourceForge site. This list is used to announce new releases of Cedar
+Backup, and you can use it to report bugs or to get help using Cedar
+Backup.
- http://cedar-solutions.com/listarchives/
-
-Use this mailing list to report bugs or for help using Cedar Backup.
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 02:05:12
|
Revision: 920
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=920&view=rev
Author: pronovic
Date: 2008-05-05 19:05:09 -0700 (Mon, 05 May 2008)
Log Message:
-----------
Add my release procedure in doc/procedure.txt
Added Paths:
-----------
cedar-backup2/trunk/doc/procedure.txt
Added: cedar-backup2/trunk/doc/procedure.txt
===================================================================
--- cedar-backup2/trunk/doc/procedure.txt (rev 0)
+++ cedar-backup2/trunk/doc/procedure.txt 2008-05-06 02:05:09 UTC (rev 920)
@@ -0,0 +1,24 @@
+Release Procedure
+=================
+
+- Make final update to Changelog
+- Update CedarBackup2/release.py
+- Run unit tests one last time (make test)
+- Run pychecker tests one last time (make check)
+- Build the source distributions (make distrib)
+
+- Copy source package to hcoop and install it
+- Copy source package to shell.sourceforge.net and install it
+- Copy htmldocs.tar.gz to sourceforge and install it
+- FTP the source package to upload.sourceforge.net/incoming
+
+- Do a new file release at SourceForge
+- Put a new release announcement out on FreshMeat
+- Send a release email to cedar-backup-users
+
+- Build the Debian package for unstable in a chroot
+- Build the Debian package for stable in a chroot
+- Push the latest Debian packages to daystrom
+- Sync daystrom's FTP directory structure with hcoop
+- Upload the new packages to the Debian servers
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 02:03:57
|
Revision: 919
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=919&view=rev
Author: pronovic
Date: 2008-05-05 19:03:55 -0700 (Mon, 05 May 2008)
Log Message:
-----------
Fix a typo in CREDITS
Modified Paths:
--------------
cedar-backup2/trunk/CREDITS
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/CREDITS
===================================================================
--- cedar-backup2/trunk/CREDITS 2008-05-06 00:57:07 UTC (rev 918)
+++ cedar-backup2/trunk/CREDITS 2008-05-06 02:03:55 UTC (rev 919)
@@ -58,7 +58,7 @@
Walsh and were originally released under a BSD-style license as documented
below.
-Source code annoted as "(c) 2000 Fourthought Inc, USA" was taken from or
+Source code annotated as "(c) 2000 Fourthought Inc, USA" was taken from or
derived from code within the PyXML distribution and was originally part of
the 4DOM suite developed by Fourthought, Inc. Fourthought released the
code under a BSD-like license. Items under this license include the XML
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-05-06 00:57:07 UTC (rev 918)
+++ cedar-backup2/trunk/Changelog 2008-05-06 02:03:55 UTC (rev 919)
@@ -1,3 +1,8 @@
+Version 2.18.1 unreleased
+
+ * Fix a few typos in the CREDITS file.
+
+
Version 2.18.0 05 May 2008
* Add the ability to dereference links when following them.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 00:57:13
|
Revision: 918
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=918&view=rev
Author: pronovic
Date: 2008-05-05 17:57:07 -0700 (Mon, 05 May 2008)
Log Message:
-----------
Tagging the 2.18.0 release of Cedar Backup.
Added Paths:
-----------
cedar-backup2/tags/CEDAR_BACKUP2_V2.18.0/
Copied: cedar-backup2/tags/CEDAR_BACKUP2_V2.18.0 (from rev 917, cedar-backup2/trunk)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-05-06 00:56:58
|
Revision: 917
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=917&view=rev
Author: pronovic
Date: 2008-05-05 17:56:53 -0700 (Mon, 05 May 2008)
Log Message:
-----------
Release 2.18.0
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/release.py
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/CedarBackup2/release.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/release.py 2008-04-28 03:27:18 UTC (rev 916)
+++ cedar-backup2/trunk/CedarBackup2/release.py 2008-05-06 00:56:53 UTC (rev 917)
@@ -34,7 +34,7 @@
AUTHOR = "Kenneth J. Pronovici"
EMAIL = "pro...@ie..."
COPYRIGHT = "2004-2008"
-VERSION = "2.17.1"
-DATE = "26 Apr 2008"
+VERSION = "2.18.0"
+DATE = "05 May 2008"
URL = "http://cedar-backup.sourceforge.net/"
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-28 03:27:18 UTC (rev 916)
+++ cedar-backup2/trunk/Changelog 2008-05-06 00:56:53 UTC (rev 917)
@@ -1,4 +1,4 @@
-Version 2.18.0 unreleased
+Version 2.18.0 05 May 2008
* Add the ability to dereference links when following them.
- Add util.dereferenceLink() function
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-28 03:27:21
|
Revision: 916
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=916&view=rev
Author: pronovic
Date: 2008-04-27 20:27:18 -0700 (Sun, 27 Apr 2008)
Log Message:
-----------
Remove saved-off dereference code
Removed Paths:
-------------
cedar-backup2/trunk/doc/dereference/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-28 03:22:22
|
Revision: 915
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=915&view=rev
Author: pronovic
Date: 2008-04-27 20:21:50 -0700 (Sun, 27 Apr 2008)
Log Message:
-----------
Implement CollectDir.dereference configuration option
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/actions/collect.py
cedar-backup2/trunk/CedarBackup2/config.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/manual/src/config.xml
cedar-backup2/trunk/test/configtests.py
cedar-backup2/trunk/test/data/cback.conf.15
cedar-backup2/trunk/test/data/cback.conf.20
cedar-backup2/trunk/test/data/cback.conf.21
cedar-backup2/trunk/test/data/cback.conf.8
Modified: cedar-backup2/trunk/CedarBackup2/actions/collect.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/actions/collect.py 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/CedarBackup2/actions/collect.py 2008-04-28 03:21:50 UTC (rev 915)
@@ -127,13 +127,14 @@
archiveMode = _getArchiveMode(config, collectDir)
ignoreFile = _getIgnoreFile(config, collectDir)
linkDepth = _getLinkDepth(collectDir)
+ dereference = _getDereference(collectDir)
digestPath = _getDigestPath(config, collectDir)
tarfilePath = _getTarfilePath(config, collectDir, archiveMode)
(excludePaths, excludePatterns) = _getExclusions(config, collectDir)
if fullBackup or (collectMode in ['daily', 'incr', ]) or (collectMode == 'weekly' and todayIsStart):
logger.debug("Directory meets criteria to be backed up today.")
_collectDirectory(config, collectDir.absolutePath, tarfilePath,
- collectMode, archiveMode, ignoreFile, linkDepth,
+ collectMode, archiveMode, ignoreFile, linkDepth, dereference,
resetDigest, digestPath, excludePaths, excludePatterns)
else:
logger.debug("Directory will not be backed up, per collect mode.")
@@ -182,8 +183,8 @@
###############################
def _collectDirectory(config, absolutePath, tarfilePath, collectMode, archiveMode,
- ignoreFile, linkDepth, resetDigest, digestPath, excludePaths,
- excludePatterns):
+ ignoreFile, linkDepth, dereference, resetDigest, digestPath,
+ excludePaths, excludePatterns):
"""
Collects a configured collect directory.
@@ -203,6 +204,7 @@
@param archiveMode: Archive mode to use.
@param ignoreFile: Ignore file to use.
@param linkDepth: Link depth value to use.
+ @param dereference: Dereference flag to use.
@param resetDigest: Reset digest flag.
@param digestPath: Path to digest file on disk, if needed.
@param excludePaths: List of absolute paths to exclude.
@@ -212,7 +214,7 @@
backupList.ignoreFile = ignoreFile
backupList.excludePaths = excludePaths
backupList.excludePatterns = excludePatterns
- backupList.addDirContents(absolutePath, linkDepth=linkDepth)
+ backupList.addDirContents(absolutePath, linkDepth=linkDepth, dereference=dereference)
_executeBackup(config, backupList, absolutePath, tarfilePath, collectMode, archiveMode, resetDigest, digestPath)
@@ -407,6 +409,25 @@
############################
+# _getDereference() function
+############################
+
+def _getDereference(item):
+ """
+ Gets the dereference flag that should be used for a collect directory.
+ If possible, use the one on the directory, otherwise set a value of False.
+ @param item: C{CollectDir} object
+ @return: Ignore file to use.
+ """
+ if item.dereference is None:
+ dereference = False
+ else:
+ dereference = item.dereference
+ logger.debug("Dereference flag is [%s]" % dereference)
+ return dereference
+
+
+############################
# _getDigestPath() function
############################
Modified: cedar-backup2/trunk/CedarBackup2/config.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/config.py 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/CedarBackup2/config.py 2008-04-28 03:21:50 UTC (rev 915)
@@ -1359,13 +1359,13 @@
@note: Lists within this class are "unordered" for equality comparisons.
@sort: __init__, __repr__, __str__, __cmp__, absolutePath, collectMode,
- archiveMode, ignoreFile, linkDepth, absoluteExcludePaths,
+ archiveMode, ignoreFile, linkDepth, dereference, absoluteExcludePaths,
relativeExcludePaths, excludePatterns
"""
def __init__(self, absolutePath=None, collectMode=None, archiveMode=None, ignoreFile=None,
absoluteExcludePaths=None, relativeExcludePaths=None, excludePatterns=None,
- linkDepth=None):
+ linkDepth=None, dereference=False):
"""
Constructor for the C{CollectDir} class.
@@ -1374,6 +1374,7 @@
@param archiveMode: Overridden archive mode for this directory.
@param ignoreFile: Overidden ignore file name for this directory.
@param linkDepth: Maximum at which soft links should be followed.
+ @param dereference: Whether to dereference links that are followed.
@param absoluteExcludePaths: List of absolute paths to exclude.
@param relativeExcludePaths: List of relative paths to exclude.
@param excludePatterns: List of regular expression patterns to exclude.
@@ -1385,6 +1386,7 @@
self._archiveMode = None
self._ignoreFile = None
self._linkDepth = None
+ self._deference = None
self._absoluteExcludePaths = None
self._relativeExcludePaths = None
self._excludePatterns = None
@@ -1393,6 +1395,7 @@
self.archiveMode = archiveMode
self.ignoreFile = ignoreFile
self.linkDepth = linkDepth
+ self.dereference = dereference
self.absoluteExcludePaths = absoluteExcludePaths
self.relativeExcludePaths = relativeExcludePaths
self.excludePatterns = excludePatterns
@@ -1401,12 +1404,12 @@
"""
Official string representation for class instance.
"""
- return "CollectDir(%s, %s, %s, %s, %s, %s, %s, %s)" % (self.absolutePath, self.collectMode,
- self.archiveMode, self.ignoreFile,
- self.absoluteExcludePaths,
- self.relativeExcludePaths,
- self.excludePatterns,
- self.linkDepth)
+ return "CollectDir(%s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.absolutePath, self.collectMode,
+ self.archiveMode, self.ignoreFile,
+ self.absoluteExcludePaths,
+ self.relativeExcludePaths,
+ self.excludePatterns,
+ self.linkDepth, self.dereference)
def __str__(self):
"""
@@ -1448,6 +1451,11 @@
return -1
else:
return 1
+ if self._dereference != other._dereference:
+ if self._dereference < other._dereference:
+ return -1
+ else:
+ return 1
if self._absoluteExcludePaths != other._absoluteExcludePaths:
if self._absoluteExcludePaths < other._absoluteExcludePaths:
return -1
@@ -1558,6 +1566,22 @@
"""
return self._linkDepth
+ def _setDereference(self, value):
+ """
+ Property target used to set the dereference flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._dereference = True
+ else:
+ self._dereference = False
+
+ def _getDereference(self):
+ """
+ Property target used to get the dereference flag.
+ """
+ return self._dereference
+
def _setAbsoluteExcludePaths(self, value):
"""
Property target used to set the absolute exclude paths list.
@@ -1630,6 +1654,7 @@
archiveMode = property(_getArchiveMode, _setArchiveMode, None, doc="Overridden archive mode for this directory.")
ignoreFile = property(_getIgnoreFile, _setIgnoreFile, None, doc="Overridden ignore file name for this directory.")
linkDepth = property(_getLinkDepth, _setLinkDepth, None, doc="Maximum at which soft links should be followed.")
+ dereference = property(_getDereference, _setDereference, None, doc="Whether to dereference links that are followed.")
absoluteExcludePaths = property(_getAbsoluteExcludePaths, _setAbsoluteExcludePaths, None, "List of absolute paths to exclude.")
relativeExcludePaths = property(_getRelativeExcludePaths, _setRelativeExcludePaths, None, "List of relative paths to exclude.")
excludePatterns = property(_getExcludePatterns, _setExcludePatterns, None, "List of regular expression patterns to exclude.")
@@ -4714,6 +4739,7 @@
archiveMode archive_mode
ignoreFile ignore_file
linkDepth link_depth
+ dereference dereference
The collect mode is a special case. Just a C{mode} tag is accepted for
backwards compatibility, but we prefer C{collect_mode} for consistency
@@ -4745,6 +4771,7 @@
cdir.archiveMode = readString(entry, "archive_mode")
cdir.ignoreFile = readString(entry, "ignore_file")
cdir.linkDepth = readInteger(entry, "link_depth")
+ cdir.dereference = readBoolean(entry, "dereference")
(cdir.absoluteExcludePaths, cdir.relativeExcludePaths, cdir.excludePatterns) = Config._parseExclusions(entry)
lst.append(cdir)
if lst == []:
@@ -5365,6 +5392,7 @@
archiveMode dir/archive_mode
ignoreFile dir/ignore_file
linkDepth dir/link_depth
+ dereference dir/dereference
Note that an original XML document might have listed the collect mode
using the C{mode} tag, since we accept both C{collect_mode} and C{mode}.
@@ -5393,6 +5421,7 @@
addStringNode(xmlDom, sectionNode, "archive_mode", collectDir.archiveMode)
addStringNode(xmlDom, sectionNode, "ignore_file", collectDir.ignoreFile)
addIntegerNode(xmlDom, sectionNode, "link_depth", collectDir.linkDepth)
+ addBooleanNode(xmlDom, sectionNode, "dereference", collectDir.dereference)
if ((collectDir.absoluteExcludePaths is not None and collectDir.absoluteExcludePaths != []) or
(collectDir.relativeExcludePaths is not None and collectDir.relativeExcludePaths != []) or
(collectDir.excludePatterns is not None and collectDir.excludePatterns != [])):
@@ -5706,6 +5735,8 @@
raise ValueError("Archive mode must either be set in parent collect section or individual collect directory.")
if self.collect.ignoreFile is None and collectDir.ignoreFile is None:
raise ValueError("Ignore file must either be set in parent collect section or individual collect directory.")
+ if (collectDir.linkDepth is None or collectDir.linkDepth < 1) and collectDir.dereference:
+ raise ValueError("Dereference flag is only valid when a non-zero link depth is in use.")
def _validateStage(self):
"""
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/Changelog 2008-04-28 03:21:50 UTC (rev 915)
@@ -3,6 +3,9 @@
* Add the ability to dereference links when following them.
- Add util.dereferenceLink() function
- Add dereference flag to FilesystemList.addDirContents()
+ - Add CollectDir.dereference attribute
+ - Modify collect action to obey CollectDir.dereference
+ - Update user manual to discuss new attribute
Version 2.17.1 26 Apr 2008
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/manual/src/config.xml 2008-04-28 03:21:50 UTC (rev 915)
@@ -1125,7 +1125,8 @@
but a set of soft links to other files and directories.
Normally, Cedar Backup does not follow soft links, but you can
override this behavior for individual directories using the
- <literal>link_depth</literal> option (see below).
+ <literal>link_depth</literal> and <literal>dereference</literal>
+ options (see below).
</para>
<para>
@@ -1635,7 +1636,7 @@
This field is optional. If it doesn't exist,
the backup will assume a value of zero, meaning
that soft links within the collect directory will
- never be followed.
+ never be followed.
</para>
<para>
<emphasis>Restrictions:</emphasis> If set, must
@@ -1645,6 +1646,38 @@
</varlistentry>
<varlistentry>
+ <term><literal>dereference</literal></term>
+ <listitem>
+ <para>Whether to dereference soft links.</para>
+ <para>
+ If this flag is set, links that are being
+ followed will be dereferenced before being added
+ to the backup. The link will be added (as a
+ link), and then the directory or file that the
+ link points at will be added as well.
+ </para>
+ <para>
+ This value only applies to a directory where soft
+ links are being followed (per the
+ <literal>link_depth</literal> configuration
+ option). It never applies to a configured
+ collect directory itself, only to other
+ directories within the collect directory.
+ </para>
+ <para>
+ This field is optional. If it doesn't exist,
+ the backup will assume that links should never be
+ dereferenced.
+ </para>
+ <para>
+ <emphasis>Restrictions:</emphasis> Must be a
+ boolean (<literal>Y</literal> or
+ <literal>N</literal>).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><literal>exclude</literal></term>
<listitem>
<para>List of paths or patterns to exclude from the backup.</para>
Modified: cedar-backup2/trunk/test/configtests.py
===================================================================
--- cedar-backup2/trunk/test/configtests.py 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/test/configtests.py 2008-04-28 03:21:50 UTC (rev 915)
@@ -2439,6 +2439,7 @@
self.failUnlessEqual(None, collectDir.archiveMode)
self.failUnlessEqual(None, collectDir.ignoreFile)
self.failUnlessEqual(None, collectDir.linkDepth)
+ self.failUnlessEqual(False, collectDir.dereference)
self.failUnlessEqual(None, collectDir.absoluteExcludePaths)
self.failUnlessEqual(None, collectDir.relativeExcludePaths)
self.failUnlessEqual(None, collectDir.excludePatterns)
@@ -2447,12 +2448,13 @@
"""
Test constructor with all values filled in, with valid values.
"""
- collectDir = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 2)
+ collectDir = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 2, True)
self.failUnlessEqual("/etc/whatever", collectDir.absolutePath)
self.failUnlessEqual("incr", collectDir.collectMode)
self.failUnlessEqual("tar", collectDir.archiveMode)
self.failUnlessEqual(".ignore", collectDir.ignoreFile)
self.failUnlessEqual(2, collectDir.linkDepth)
+ self.failUnlessEqual(True, collectDir.dereference)
self.failUnlessEqual([], collectDir.absoluteExcludePaths)
self.failUnlessEqual([], collectDir.relativeExcludePaths)
self.failUnlessEqual([], collectDir.excludePatterns)
@@ -2807,7 +2809,44 @@
self.failUnlessAssignRaises(ValueError, collectDir, "linkDepth", "ken")
self.failUnlessEqual(None, collectDir.linkDepth)
+ def testConstructor_039(self):
+ """
+ Test assignment of dereference attribute, None value.
+ """
+ collectDir = CollectDir(dereference=True)
+ self.failUnlessEqual(True, collectDir.dereference)
+ collectDir.dereference = None
+ self.failUnlessEqual(False, collectDir.dereference)
+ def testConstructor_040(self):
+ """
+ Test assignment of dereference attribute, valid value (real boolean).
+ """
+ collectDir = CollectDir()
+ self.failUnlessEqual(False, collectDir.dereference)
+ collectDir.dereference = True
+ self.failUnlessEqual(True, collectDir.dereference)
+ collectDir.dereference = False
+ self.failUnlessEqual(False, collectDir.dereference)
+
+ def testConstructor_041(self):
+ """
+ Test assignment of dereference attribute, valid value (expression).
+ """
+ collectDir = CollectDir()
+ self.failUnlessEqual(False, collectDir.dereference)
+ collectDir.dereference = 0
+ self.failUnlessEqual(False, collectDir.dereference)
+ collectDir.dereference = []
+ self.failUnlessEqual(False, collectDir.dereference)
+ collectDir.dereference = None
+ self.failUnlessEqual(False, collectDir.dereference)
+ collectDir.dereference = ['a']
+ self.failUnlessEqual(True, collectDir.dereference)
+ collectDir.dereference = 3
+ self.failUnlessEqual(True, collectDir.dereference)
+
+
############################
# Test comparison operators
############################
@@ -2831,8 +2870,8 @@
Test comparison of two identical objects, all attributes non-None (empty
lists).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
self.failUnless(collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
self.failUnless(collectDir1 <= collectDir2)
@@ -2845,8 +2884,8 @@
Test comparison of two identical objects, all attributes non-None
(non-empty lists).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/one",], ["two",], ["three",], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/one",], ["two",], ["three",], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/one",], ["two",], ["three",], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/one",], ["two",], ["three",], 1, True)
self.failUnless(collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
self.failUnless(collectDir1 <= collectDir2)
@@ -2872,8 +2911,8 @@
"""
Test comparison of two differing objects, absolutePath differs.
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/stuff", "incr", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/stuff", "incr", "tar", ".ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(collectDir1 < collectDir2)
@@ -2900,8 +2939,8 @@
"""
Test comparison of two differing objects, collectMode differs.
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "daily", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "daily", "tar", ".ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
@@ -2928,8 +2967,8 @@
"""
Test comparison of two differing objects, archiveMode differs.
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "targz", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "targz", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
@@ -2956,8 +2995,8 @@
"""
Test comparison of two differing objects, ignoreFile differs.
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
@@ -3001,8 +3040,8 @@
Test comparison of two differing objects, absoluteExcludePaths differs
(one empty, one not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/whatever", ], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/whatever", ], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(collectDir1 < collectDir2)
@@ -3016,8 +3055,8 @@
Test comparison of two differing objects, absoluteExcludePaths differs
(both not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/stuff", ], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/stuff", "/something", ], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/stuff", ], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", ["/stuff", "/something", ], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2) # note: different than standard due to unsorted list
@@ -3061,8 +3100,8 @@
Test comparison of two differing objects, relativeExcludePaths differs
(one empty, one not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["one", ], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["one", ], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
@@ -3076,8 +3115,8 @@
Test comparison of two differing objects, relativeExcludePaths differs
(both not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["one", ], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["two", ], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["one", ], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], ["two", ], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(collectDir1 < collectDir2)
@@ -3121,8 +3160,8 @@
Test comparison of two differing objects, excludePatterns differs (one
empty, one not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["pattern", ], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["pattern", ], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(collectDir1 < collectDir2)
@@ -3136,8 +3175,8 @@
Test comparison of two differing objects, excludePatterns differs (both
not empty).
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["p1", ], 1)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["p2", ], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["p1", ], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", ".ignore", [], [], ["p2", ], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(collectDir1 < collectDir2)
@@ -3164,8 +3203,8 @@
"""
Test comparison of two differing objects, linkDepth differs.
"""
- collectDir1 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 2)
- collectDir2 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1)
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 2, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1, True)
self.failIfEqual(collectDir1, collectDir2)
self.failUnless(not collectDir1 == collectDir2)
self.failUnless(not collectDir1 < collectDir2)
@@ -3174,7 +3213,35 @@
self.failUnless(collectDir1 >= collectDir2)
self.failUnless(collectDir1 != collectDir2)
+ def testComparison_026(self):
+ """
+ Test comparison of two differing objects, dereference differs (one None).
+ """
+ collectDir1 = CollectDir()
+ collectDir2 = CollectDir(dereference=True)
+ self.failIfEqual(collectDir1, collectDir2)
+ self.failUnless(not collectDir1 == collectDir2)
+ self.failUnless(collectDir1 < collectDir2)
+ self.failUnless(collectDir1 <= collectDir2)
+ self.failUnless(not collectDir1 > collectDir2)
+ self.failUnless(not collectDir1 >= collectDir2)
+ self.failUnless(collectDir1 != collectDir2)
+ def testComparison_027(self):
+ """
+ Test comparison of two differing objects, dereference differs.
+ """
+ collectDir1 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1, True)
+ collectDir2 = CollectDir("/etc/whatever", "incr", "tar", "ignore", [], [], [], 1, False)
+ self.failIfEqual(collectDir1, collectDir2)
+ self.failUnless(not collectDir1 == collectDir2)
+ self.failUnless(not collectDir1 < collectDir2)
+ self.failUnless(not collectDir1 <= collectDir2)
+ self.failUnless(collectDir1 > collectDir2)
+ self.failUnless(collectDir1 >= collectDir2)
+ self.failUnless(collectDir1 != collectDir2)
+
+
#####################
# TestPurgeDir class
#####################
@@ -10696,7 +10763,67 @@
config.peers.remotePeers[0].managedActions = ["collect", ]
config._validatePeers()
+ def testValidate_078(self):
+ """
+ Test case where dereference is True but link depth is None.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=None, dereference=True), ]
+ self.failUnlessRaises(ValueError, config._validateCollect)
+ def testValidate_079(self):
+ """
+ Test case where dereference is True but link depth is zero.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=0, dereference=True), ]
+ self.failUnlessRaises(ValueError, config._validateCollect)
+
+ def testValidate_080(self):
+ """
+ Test case where dereference is False and linkDepth is None.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=None, dereference=False), ]
+ config._validateCollect()
+
+ def testValidate_081(self):
+ """
+ Test case where dereference is None and linkDepth is None.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=None, dereference=None), ]
+ config._validateCollect()
+
+ def testValidate_082(self):
+ """
+ Test case where dereference is False and linkDepth is zero.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=0, dereference=False), ]
+ config._validateCollect()
+
+ def testValidate_083(self):
+ """
+ Test case where dereference is None and linkDepth is zero.
+ """
+ config = Config()
+ config.collect = CollectConfig()
+ config.collect.targetDir = "/whatever"
+ config.collect.collectDirs = [ CollectDir(absolutePath="/stuff", collectMode="incr", archiveMode="tar", ignoreFile="i", linkDepth=0, dereference=None), ]
+ config._validateCollect()
+
+
############################
# Test parsing of documents
############################
@@ -10939,6 +11066,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11126,6 +11254,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11193,6 +11322,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11257,6 +11387,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11324,6 +11455,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11479,6 +11611,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
@@ -11550,6 +11683,7 @@
expected.collect.collectDirs = []
expected.collect.collectDirs.append(CollectDir(absolutePath="/root"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/tmp", linkDepth=3))
+ expected.collect.collectDirs.append(CollectDir(absolutePath="/ken", linkDepth=1, dereference=True))
expected.collect.collectDirs.append(CollectDir(absolutePath="/var/log", collectMode="incr"))
expected.collect.collectDirs.append(CollectDir(absolutePath="/etc",collectMode="incr",archiveMode="tar",ignoreFile=".ignore"))
collectDir = CollectDir(absolutePath="/opt")
Modified: cedar-backup2/trunk/test/data/cback.conf.15
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.15 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/test/data/cback.conf.15 2008-04-28 03:21:50 UTC (rev 915)
@@ -71,6 +71,11 @@
<link_depth>3</link_depth>
</dir>
<dir>
+ <abs_path>/ken</abs_path>
+ <link_depth>1</link_depth>
+ <dereference>Y</dereference>
+ </dir>
+ <dir>
<abs_path>/var/log</abs_path>
<mode>incr</mode> <!-- deprecated form -->
</dir>
Modified: cedar-backup2/trunk/test/data/cback.conf.20
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.20 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/test/data/cback.conf.20 2008-04-28 03:21:50 UTC (rev 915)
@@ -74,6 +74,11 @@
<link_depth>3</link_depth>
</dir>
<dir>
+ <abs_path>/ken</abs_path>
+ <link_depth>1</link_depth>
+ <dereference>Y</dereference>
+ </dir>
+ <dir>
<abs_path>/var/log</abs_path>
<mode>incr</mode> <!-- deprecated form -->
</dir>
Modified: cedar-backup2/trunk/test/data/cback.conf.21
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.21 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/test/data/cback.conf.21 2008-04-28 03:21:50 UTC (rev 915)
@@ -115,6 +115,11 @@
<link_depth>3</link_depth>
</dir>
<dir>
+ <abs_path>/ken</abs_path>
+ <link_depth>1</link_depth>
+ <dereference>Y</dereference>
+ </dir>
+ <dir>
<abs_path>/var/log</abs_path>
<mode>incr</mode> <!-- deprecated form -->
</dir>
Modified: cedar-backup2/trunk/test/data/cback.conf.8
===================================================================
--- cedar-backup2/trunk/test/data/cback.conf.8 2008-04-28 02:40:04 UTC (rev 914)
+++ cedar-backup2/trunk/test/data/cback.conf.8 2008-04-28 03:21:50 UTC (rev 915)
@@ -20,6 +20,11 @@
<link_depth>3</link_depth>
</dir>
<dir>
+ <abs_path>/ken</abs_path>
+ <link_depth>1</link_depth>
+ <dereference>Y</dereference>
+ </dir>
+ <dir>
<abs_path>/var/log</abs_path>
<mode>incr</mode> <!-- deprecated form -->
</dir>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-28 02:40:07
|
Revision: 914
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=914&view=rev
Author: pronovic
Date: 2008-04-27 19:40:04 -0700 (Sun, 27 Apr 2008)
Log Message:
-----------
Add dereference flag to FilesystemList.addDirContents()
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/filesystem.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/filesystemtests.py
Added Paths:
-----------
cedar-backup2/trunk/test/data/tree22.tar.gz
Modified: cedar-backup2/trunk/CedarBackup2/filesystem.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-28 02:38:06 UTC (rev 913)
+++ cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-28 02:40:04 UTC (rev 914)
@@ -59,7 +59,7 @@
# Cedar Backup modules
from CedarBackup2.knapsack import firstFit, bestFit, worstFit, alternateFit
from CedarBackup2.util import AbsolutePathList, ObjectTypeList, UnorderedList, RegexList
-from CedarBackup2.util import removeKeys, displayBytes, calculateFileAge, encodePath
+from CedarBackup2.util import removeKeys, displayBytes, calculateFileAge, encodePath, dereferenceLink
########################################################################
@@ -358,7 +358,7 @@
logger.debug("Added directory to list: [%s]" % path)
return 1
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
"""
Adds the contents of a directory to the list.
@@ -387,6 +387,9 @@
@note: The L{excludeDirs} flag only controls whether any given directory
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
+
+ @note: If you call this method I{on a link to a directory} that link will
+ never be dereferenced (it may, however, be followed).
@param path: Directory path whose contents should be added to the list
@type path: String representing a path on disk
@@ -400,6 +403,9 @@
@param linkDepth: Maximum depth of the tree at which soft links should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
+ @param dereference: Indicates whether soft links, if followed, should be dereferenced
+ @type dereference: Boolean value
+
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -407,9 +413,9 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return self._addDirContentsInternal(path, addSelf, recursive, linkDepth)
+ return self._addDirContentsInternal(path, addSelf, recursive, linkDepth, dereference)
- def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0):
+ def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0, dereference=False):
"""
Internal implementation of C{addDirContents}.
@@ -433,10 +439,14 @@
gets a little confused (it has a link and a directory with the same
name).
+ @note: If you call this method I{on a link to a directory} that link will
+ never be dereferenced (it may, however, be followed).
+
@param path: Directory path whose contents should be added to the list.
@param includePath: Indicates whether to include the path as well as contents.
@param recursive: Indicates whether directory contents should be added recursively.
@param linkDepth: Depth of soft links that should be followed
+ @param dereference: Indicates whether soft links, if followed, should be dereferenced
@return: Number of items recursively added to the list
@@ -465,18 +475,31 @@
for entry in os.listdir(path):
entrypath = os.path.join(path, entry)
if os.path.isfile(entrypath):
+ if linkDepth > 0 and dereference:
+ derefpath = dereferenceLink(entrypath)
+ if derefpath != entrypath:
+ added += self.addFile(derefpath)
added += self.addFile(entrypath)
elif os.path.isdir(entrypath):
if os.path.islink(entrypath):
- if recursive and linkDepth > 0:
- newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth)
+ if recursive:
+ if linkDepth > 0:
+ newDepth = linkDepth - 1;
+ if dereference:
+ derefpath = dereferenceLink(entrypath)
+ if derefpath != entrypath:
+ added += self._addDirContentsInternal(derefpath, True, recursive, newDepth, dereference)
+ added += self.addDir(entrypath)
+ else:
+ added += self._addDirContentsInternal(entrypath, False, recursive, newDepth, dereference)
+ else:
+ added += self.addDir(entrypath)
else:
added += self.addDir(entrypath)
else:
if recursive:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, linkDepth=newDepth)
+ added += self._addDirContentsInternal(entrypath, True, recursive, newDepth, dereference)
else:
added += self.addDir(entrypath)
return added
@@ -1221,7 +1244,7 @@
# Add methods
##############
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
"""
Adds the contents of a directory to the list.
@@ -1255,6 +1278,9 @@
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
+ @note: If you call this method I{on a link to a directory} that link will
+ never be dereferenced (it may, however, be followed).
+
@param path: Directory path whose contents should be added to the list
@type path: String representing a path on disk
@@ -1266,6 +1292,9 @@
@param linkDepth: Depth of soft links that should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
+ @param dereference: Indicates whether soft links, if followed, should be dereferenced
+ @type dereference: Boolean value
+
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -1273,7 +1302,7 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth)
+ return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth, dereference)
##################
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-28 02:38:06 UTC (rev 913)
+++ cedar-backup2/trunk/Changelog 2008-04-28 02:40:04 UTC (rev 914)
@@ -1,3 +1,9 @@
+Version 2.18.0 unreleased
+
+ * Add the ability to dereference links when following them.
+ - Add util.dereferenceLink() function
+ - Add dereference flag to FilesystemList.addDirContents()
+
Version 2.17.1 26 Apr 2008
* Updated copyright statement slightly.
Added: cedar-backup2/trunk/test/data/tree22.tar.gz
===================================================================
(Binary files differ)
Property changes on: cedar-backup2/trunk/test/data/tree22.tar.gz
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: cedar-backup2/trunk/test/filesystemtests.py
===================================================================
--- cedar-backup2/trunk/test/filesystemtests.py 2008-04-28 02:38:06 UTC (rev 913)
+++ cedar-backup2/trunk/test/filesystemtests.py 2008-04-28 02:40:04 UTC (rev 914)
@@ -131,7 +131,7 @@
DATA_DIRS = [ "./data", "./test/data" ]
RESOURCES = [ "tree1.tar.gz", "tree2.tar.gz", "tree3.tar.gz", "tree4.tar.gz", "tree5.tar.gz",
"tree6.tar.gz", "tree7.tar.gz", "tree8.tar.gz", "tree9.tar.gz", "tree10.tar.gz",
- "tree11.tar.gz", "tree12.tar.gz", "tree13.tar.gz", ]
+ "tree11.tar.gz", "tree12.tar.gz", "tree13.tar.gz", "tree22.tar.gz", ]
INVALID_FILE = "bogus" # This file name should never exist
NOMATCH_PATH = "/something" # This path should never match something we put in a file list
@@ -4758,10 +4758,11 @@
self.extractTar("tree6")
path = self.buildPath(["tree6"])
fsList = FilesystemList()
- count = fsList.addDirContents(path, addSelf=False, linkDepth=1)
+ count = fsList.addDirContents(path, linkDepth=1)
if not platformSupportsLinks():
- self.failUnlessEqual(121, count)
- self.failUnlessEqual(121, len(fsList))
+ self.failUnlessEqual(122, count)
+ self.failUnlessEqual(122, len(fsList))
+ self.failUnless(self.buildPath([ "tree6", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
@@ -4884,8 +4885,9 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(164, count)
- self.failUnlessEqual(164, len(fsList))
+ self.failUnlessEqual(165, count)
+ self.failUnlessEqual(165, len(fsList))
+ self.failUnless(self.buildPath([ "tree6", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -5058,10 +5060,11 @@
self.extractTar("tree6")
path = self.buildPath(["tree6"])
fsList = FilesystemList()
- count = fsList.addDirContents(path, addSelf=False, linkDepth=2)
+ count = fsList.addDirContents(path, linkDepth=2)
if not platformSupportsLinks():
- self.failUnlessEqual(121, count)
- self.failUnlessEqual(121, len(fsList))
+ self.failUnlessEqual(122, count)
+ self.failUnlessEqual(122, len(fsList))
+ self.failUnless(self.buildPath([ "tree6" ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
@@ -5184,8 +5187,9 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(240, count)
- self.failUnlessEqual(240, len(fsList))
+ self.failUnlessEqual(241, count)
+ self.failUnlessEqual(241, len(fsList))
+ self.failUnless(self.buildPath([ "tree6" ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -5427,7 +5431,462 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
+ def testAddDirContents_093(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=0, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(12, count)
+ self.failUnlessEqual(12, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+ def testAddDirContents_094(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=1, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(16, count)
+ self.failUnlessEqual(16, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", ]) in fsList)
+
+ def testAddDirContents_095(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=2, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(20, count)
+ self.failUnlessEqual(20, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in fsList)
+
+ def testAddDirContents_096(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=3, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(20, count)
+ self.failUnlessEqual(20, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in fsList)
+
+ def testAddDirContents_097(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=0, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(12, count)
+ self.failUnlessEqual(12, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+
+ def testAddDirContents_098(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=1, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(20, count)
+ self.failUnlessEqual(20, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005" ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link002", ]) in fsList)
+
+ def testAddDirContents_099(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=2, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(32, count)
+ self.failUnlessEqual(32, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link002", ]) in fsList)
+
+ def testAddDirContents_100(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=3, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(35, count)
+ self.failUnlessEqual(35, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir007", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir007", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir008", "file001", ]) in fsList)
+
+ def testAddDirContents_101(self):
+ """
+ Attempt to add a soft link; excludeFiles and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeFiles = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludeFiles = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(1, count)
+ self.failUnlessEqual([path], fsList)
+
+ def testAddDirContents_102(self):
+ """
+ Attempt to add a soft link; excludeDirs and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeDirs = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludeDirs = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_103(self):
+ """
+ Attempt to add a soft link; excludeLinks and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeLinks = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludeLinks = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_104(self):
+ """
+ Attempt to add a soft link; with excludePaths including the path,
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludePaths = [ path ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludePaths = [ path ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_105(self):
+ """
+ Attempt to add a soft link; with excludePatterns matching the path,
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludePatterns = [ self.pathPattern(path) ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludePatterns = [ self.pathPattern(path) ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_106(self):
+ """
+ Attempt to add a link to a file, with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree9")
+ path = self.buildPath(["tree9", "dir002", "link003", ])
+ fsList = FilesystemList()
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ def testAddDirContents_107(self):
+ """
+ Attempt to add a link to a directory (which should add its contents),
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree9")
+ path = self.buildPath(["tree9", "link002" ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(13, count)
+ self.failUnlessEqual(13, len(fsList))
+ self.failUnless(self.buildPath([ "tree9", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "dir001", ]) in fsList) # duplicated
+ self.failUnless(self.buildPath([ "tree9", "link002", "dir002", ]) in fsList) # duplicated
+ self.failUnless(self.buildPath([ "tree9", "link002", "file001", ]) in fsList) # duplicated
+ self.failUnless(self.buildPath([ "tree9", "link002", "file002", ]) in fsList) # duplicated
+ self.failUnless(self.buildPath([ "tree9", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link004", ]) in fsList)
+
+ def testAddDirContents_108(self):
+ """
+ Attempt to add an invalid link (i.e. a link that points to something that
+ doesn't exist), and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link001"])
+ fsList = FilesystemList()
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ def testAddDirContents_109(self):
+ """
+ Attempt to add directory containing an invalid link (i.e. a link that
+ points to something that doesn't exist), and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10"])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(3, count)
+ self.failUnlessEqual(3, len(fsList))
+ self.failUnless(self.buildPath([ "tree10", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree10", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree10", "dir002", ]) in fsList)
+
+ def testAddDirContents_110(self):
+ """
+ Attempt to add a soft link; with excludeBasenamePatterns matching the
+ path, and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeBasenamePatterns = [ "link001", ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+ fsList = FilesystemList()
+ fsList.excludeBasenamePatterns = [ "link001", ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+
#####################
# Test removeFiles()
#####################
@@ -21420,7 +21879,1359 @@
self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
self.failUnless(self.buildPath([ "tree6", "link002", ]) in purgeList)
+ def testAddDirContents_088(self):
+ """
+ Attempt to add a large tree, with excludeBasenamePatterns set to exclude
+ some entries.
+ """
+ self.extractTar("tree6")
+ path = self.buildPath(["tree6"])
+ purgeList = PurgeItemList()
+ purgeList.excludeBasenamePatterns = [ "file001", "dir001" ]
+ count = purgeList.addDirContents(path)
+ if not platformSupportsLinks():
+ self.failUnlessEqual(54, count)
+ self.failUnlessEqual(54, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ else:
+ self.failUnlessEqual(63, count)
+ self.failUnlessEqual(63, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link002", ]) in purgeList)
+ def testAddDirContents_089(self):
+ """
+ Attempt to add a large tree with no exclusions
+ """
+ self.extractTar("tree6")
+ path = self.buildPath(["tree6"])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path)
+ if not platformSupportsLinks():
+ self.failUnlessEqual(121, count)
+ self.failUnlessEqual(121, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeLi...
[truncated message content] |
|
From: <pro...@us...> - 2008-04-28 02:38:12
|
Revision: 913
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=913&view=rev
Author: pronovic
Date: 2008-04-27 19:38:06 -0700 (Sun, 27 Apr 2008)
Log Message:
-----------
Implement the dereferenceLink() function
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/util.py
cedar-backup2/trunk/test/utiltests.py
Modified: cedar-backup2/trunk/CedarBackup2/util.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/util.py 2008-04-26 19:25:49 UTC (rev 912)
+++ cedar-backup2/trunk/CedarBackup2/util.py 2008-04-28 02:38:06 UTC (rev 913)
@@ -1987,3 +1987,22 @@
os.environ[LANG_VAR] = DEFAULT_LANGUAGE
return os.environ.copy()
+
+#############################
+# dereferenceLink() function
+#############################
+
+def dereferenceLink(path, absolute=True):
+ """
+ Deference a soft link, optionally normalizing it to an absolute path.
+ @param path: Path of link to dereference
+ @param absolute: Whether to normalize the result to an absolute path
+ @return: Dereferenced path, or original path if original is not a link.
+ """
+ if os.path.islink(path):
+ result = os.readlink(path)
+ if absolute and not os.path.isabs(result):
+ result = os.path.abspath(os.path.join(os.path.dirname(path), result))
+ return result
+ return path
+
Modified: cedar-backup2/trunk/test/utiltests.py
===================================================================
--- cedar-backup2/trunk/test/utiltests.py 2008-04-26 19:25:49 UTC (rev 912)
+++ cedar-backup2/trunk/test/utiltests.py 2008-04-28 02:38:06 UTC (rev 913)
@@ -82,13 +82,14 @@
import logging
from os.path import isdir
-from CedarBackup2.testutil import findResources, removedir, platformHasEcho, platformWindows, captureOutput
+from CedarBackup2.testutil import findResources, removedir, extractTar, buildPath, captureOutput
+from CedarBackup2.testutil import platformHasEcho, platformWindows, platformSupportsLinks
from CedarBackup2.util import UnorderedList, AbsolutePathList, ObjectTypeList
from CedarBackup2.util import RestrictedContentList, RegexMatchList, RegexList
from CedarBackup2.util import DirectedGraph, PathResolverSingleton, Diagnostics
from CedarBackup2.util import sortDict, resolveCommand, executeCommand, getFunctionReference, encodePath
from CedarBackup2.util import convertSize, UNIT_BYTES, UNIT_SECTORS, UNIT_KBYTES, UNIT_MBYTES, UNIT_GBYTES
-from CedarBackup2.util import displayBytes, deriveDayOfWeek, isStartOfWeek
+from CedarBackup2.util import displayBytes, deriveDayOfWeek, isStartOfWeek, dereferenceLink
from CedarBackup2.util import buildNormalizedPath, splitCommandLine, nullDevice
@@ -97,7 +98,7 @@
#######################################################################
DATA_DIRS = [ "./data", "./test/data" ]
-RESOURCES = [ "lotsoflines.py", ]
+RESOURCES = [ "lotsoflines.py", "tree10.tar.gz", ]
#######################################################################
@@ -2137,7 +2138,16 @@
except: pass
return name
+ def extractTar(self, tarname):
+ """Extracts a tarfile with a particular name."""
+ extractTar(self.tmpdir, self.resources['%s.tar.gz' % tarname])
+ def buildPath(self, components):
+ """Builds a complete search path from a list of components."""
+ components.insert(0, self.tmpdir)
+ return buildPath(components)
+
+
##################
# Test sortDict()
##################
@@ -3912,6 +3922,105 @@
self.failUnlessEqual(["cback", "'this", "is", "a", "really", "long", "single-quoted", "argument'", ], result)
+ #########################
+ # Test dereferenceLink()
+ #########################
+
+ def testDereferenceLink_001(self):
+ """
+ Test for a path that is a link, absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link002"])
+ if platformSupportsLinks():
+ expected = "file002"
+ else:
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_002(self):
+ """
+ Test for a path that is a link, absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link002"])
+ if platformSupportsLinks():
+ expected = self.buildPath(["tree10", "file002"])
+ else:
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_003(self):
+ """
+ Test for a path that is a file (not a link), absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "file001"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_004(self):
+ """
+ Test for a path that is a file (not a link), absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "file001"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_005(self):
+ """
+ Test for a path that is a directory (not a link), absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "dir001"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_006(self):
+ """
+ Test for a path that is a directory (not a link), absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "dir001"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_007(self):
+ """
+ Test for a path that does not exist, absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "blech"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_008(self):
+ """
+ Test for a path that does not exist, absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "blech"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+
#######################################################################
# Suite definition
#######################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-26 19:25:58
|
Revision: 912
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=912&view=rev
Author: pronovic
Date: 2008-04-26 12:25:49 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
Release 2.17.1
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/release.py
cedar-backup2/trunk/Changelog
Modified: cedar-backup2/trunk/CedarBackup2/release.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/release.py 2008-04-26 19:04:54 UTC (rev 911)
+++ cedar-backup2/trunk/CedarBackup2/release.py 2008-04-26 19:25:49 UTC (rev 912)
@@ -34,7 +34,7 @@
AUTHOR = "Kenneth J. Pronovici"
EMAIL = "pro...@ie..."
COPYRIGHT = "2004-2008"
-VERSION = "2.17.0"
-DATE = "20 Mar 2008"
-URL = "http://cedar-solutions.com/software/cedar-backup"
+VERSION = "2.17.1"
+DATE = "26 Apr 2008"
+URL = "http://cedar-backup.sourceforge.net/"
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-26 19:04:54 UTC (rev 911)
+++ cedar-backup2/trunk/Changelog 2008-04-26 19:25:49 UTC (rev 912)
@@ -1,7 +1,7 @@
-Version 2.17.1 unreleased
+Version 2.17.1 26 Apr 2008
* Updated copyright statement slightly.
- * Updated user manual
+ * Updated user manual.
- Brought copyright notices up-to-date
- Fixed various URLs that didn't reference SourceForge
* Fixed problem with link_depth (closes: #1930729).
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-26 19:05:00
|
Revision: 911
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=911&view=rev
Author: pronovic
Date: 2008-04-26 12:04:54 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
Fall back work on the dereference-link enhancement
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/filesystem.py
cedar-backup2/trunk/CedarBackup2/util.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/filesystemtests.py
cedar-backup2/trunk/test/utiltests.py
Added Paths:
-----------
cedar-backup2/trunk/doc/dereference/
cedar-backup2/trunk/doc/dereference/Changelog
cedar-backup2/trunk/doc/dereference/README
cedar-backup2/trunk/doc/dereference/filesystem.py
cedar-backup2/trunk/doc/dereference/filesystemtests.py
cedar-backup2/trunk/doc/dereference/tree22.tar.gz
cedar-backup2/trunk/doc/dereference/util.py
cedar-backup2/trunk/doc/dereference/utiltests.py
Removed Paths:
-------------
cedar-backup2/trunk/test/data/tree22.tar.gz
Modified: cedar-backup2/trunk/CedarBackup2/filesystem.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-14 01:27:23 UTC (rev 910)
+++ cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-26 19:04:54 UTC (rev 911)
@@ -60,7 +60,6 @@
from CedarBackup2.knapsack import firstFit, bestFit, worstFit, alternateFit
from CedarBackup2.util import AbsolutePathList, ObjectTypeList, UnorderedList, RegexList
from CedarBackup2.util import removeKeys, displayBytes, calculateFileAge, encodePath
-from CedarBackup2.util import dereferenceLink
########################################################################
@@ -359,7 +358,7 @@
logger.debug("Added directory to list: [%s]" % path)
return 1
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
"""
Adds the contents of a directory to the list.
@@ -369,26 +368,22 @@
place. If you only want the directory and its immediate contents to be
added, then pass in C{recursive=False}.
- If the passed-in directory happens to be a soft link, it will be
- recursed. However, by default, other directory links within the
- passed-in directory are not recursed. The C{linkDepth} parameter
- controls this behavior. This value is the maximum depth of the tree at
- which directory links should be followed. So, a depth of 0 does not
- follow any directory links, a depth of 1 follows only directory links
- within the passed-in directory, a depth of 2 follows the directory links
- at the next level down, etc.
-
- The C{dereference} flag also controls link-related behavior. If the
- C{linkDepth} is greater than zero and C{deference} is true, then any file
- or directory link will be deferenced before being added to the list. So,
- the list will contain the path of file or directory that the link points
- at, rather than the path of the link itself.
-
@note: If a directory's absolute path matches an exclude pattern or path,
or if the directory contains the configured ignore file, then the
directory and all of its contents will be recursively excluded from the
list.
+ @note: If the passed-in directory happens to be a soft link, it will be
+ recursed. However, the linkDepth parameter controls whether any soft
+ links I{within} the directory will be recursed. The link depth is
+ maximum depth of the tree at which soft links should be followed. So, a
+ depth of 0 does not follow any soft links, a depth of 1 follows only
+ links within the passed-in directory, a depth of 2 follows the links at
+ the next level down, etc.
+
+ @note: Any invalid soft links (i.e. soft links that point to
+ non-existent items) will be silently ignored.
+
@note: The L{excludeDirs} flag only controls whether any given directory
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
@@ -405,9 +400,6 @@
@param linkDepth: Maximum depth of the tree at which soft links should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
- @param dereference: Whether soft links should be dereferenced
- @type dereference: Boolean value
-
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -415,9 +407,9 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return self._addDirContentsInternal(path, addSelf, recursive, linkDepth, dereference)
+ return self._addDirContentsInternal(path, addSelf, recursive, linkDepth)
- def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0, dereference=False):
+ def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0):
"""
Internal implementation of C{addDirContents}.
@@ -429,34 +421,27 @@
interface, C{addDirContents} ends up being wholly implemented in terms
of this method.
- The C{linkDepth} parameter controls whether directory links are followed
- when we are adding the contents recursively. Any recursive calls reduce
- the value by one. If the value zero or less, then directory links will
- just be added as directories, but will not be followed. This means that
- links are followed to a I{constant depth} starting from the top-most
- directory.
+ The linkDepth parameter controls whether soft links are followed when we
+ are adding the contents recursively. Any recursive calls reduce the
+ value by one. If the value zero or less, then soft links will just be
+ added as directories, but will not be followed. This means that links
+ are followed to a I{constant depth} starting from the top-most directory.
- There is one difference between directory links and directories:
- directory links that are added recursively (and are not deferenced) are
- not placed into the list explicitly. This is because if we do add the
- links recursively, the resulting tar file gets a little confused: it has
- a link and a directory with the same name, which some tar implementations
- cannot successfully extract.
+ There is one difference between soft links and directories: soft links
+ that are added recursively are not placed into the list explicitly. This
+ is because if we do add the links recursively, the resulting tar file
+ gets a little confused (it has a link and a directory with the same
+ name).
@param path: Directory path whose contents should be added to the list.
@param includePath: Indicates whether to include the path as well as contents.
@param recursive: Indicates whether directory contents should be added recursively.
@param linkDepth: Depth of soft links that should be followed
- @param dereference: Whether soft links should be dereferenced when C{linkDepth > 0}
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
"""
- if linkDepth < 1:
- dereference = False # never dereference if we're not following links
- if dereference:
- path = dereferenceLink(path, absolute=True)
added = 0
if not os.path.exists(path) or not os.path.isdir(path):
logger.debug("Path [%s] is not a directory or does not exist on disk." % path)
@@ -479,21 +464,19 @@
added += self.addDir(path) # could actually be excluded by addDir, yet
for entry in os.listdir(path):
entrypath = os.path.join(path, entry)
- if dereference:
- entrypath = dereferenceLink(entrypath)
if os.path.isfile(entrypath):
added += self.addFile(entrypath)
elif os.path.isdir(entrypath):
if os.path.islink(entrypath):
if recursive and linkDepth > 0:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth, dereference=dereference)
+ added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth)
else:
added += self.addDir(entrypath)
else:
if recursive:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, linkDepth=newDepth, dereference=dereference)
+ added += self._addDirContentsInternal(entrypath, linkDepth=newDepth)
else:
added += self.addDir(entrypath)
return added
@@ -1238,7 +1221,7 @@
# Add methods
##############
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
"""
Adds the contents of a directory to the list.
@@ -1248,26 +1231,22 @@
place. If you only want the directory and its contents to be added, then
pass in C{recursive=False}.
- If the passed-in directory happens to be a soft link, it will be
- recursed. However, by default, other directory links within the
- passed-in directory are not recursed. The C{linkDepth} parameter
- controls this behavior. This value is the maximum depth of the tree at
- which directory links should be followed. So, a depth of 0 does not
- follow any directory links, a depth of 1 follows only directory links
- within the passed-in directory, a depth of 2 follows the directory links
- at the next level down, etc.
-
- The C{dereference} flag also controls link-related behavior. If the
- C{linkDepth} is greater than zero and C{deference} is true, then any file
- or directory link will be deferenced before being added to the list. So,
- the list will contain the path of file or directory that the link points
- at, rather than the path of the link itself.
-
@note: If a directory's absolute path matches an exclude pattern or path,
or if the directory contains the configured ignore file, then the
directory and all of its contents will be recursively excluded from the
list.
+ @note: If the passed-in directory happens to be a soft link, it will be
+ recursed. However, the linkDepth parameter controls whether any soft
+ links I{within} the directory will be recursed. The link depth is
+ maximum depth of the tree at which soft links should be followed. So, a
+ depth of 0 does not follow any soft links, a depth of 1 follows only
+ links within the passed-in directory, a depth of 2 follows the links at
+ the next level down, etc.
+
+ @note: Any invalid soft links (i.e. soft links that point to
+ non-existent items) will be silently ignored.
+
@note: The L{excludeDirs} flag only controls whether any given soft link
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
@@ -1287,9 +1266,6 @@
@param linkDepth: Depth of soft links that should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
- @param dereference: Whether soft links should be dereferenced
- @type dereference: Boolean value
-
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -1297,7 +1273,7 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth, dereference)
+ return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth)
##################
Modified: cedar-backup2/trunk/CedarBackup2/util.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/util.py 2008-04-14 01:27:23 UTC (rev 910)
+++ cedar-backup2/trunk/CedarBackup2/util.py 2008-04-26 19:04:54 UTC (rev 911)
@@ -1987,22 +1987,3 @@
os.environ[LANG_VAR] = DEFAULT_LANGUAGE
return os.environ.copy()
-
-#############################
-# dereferenceLink() function
-#############################
-
-def dereferenceLink(path, absolute=True):
- """
- Deference a soft link, optionally normalizing it to an absolute path.
- @param path: Path of link to dereference
- @param absolute: Whether to normalize the result to an absolute path
- @return: Dereferenced path, or original path if original is not a link.
- """
- if os.path.islink(path):
- result = os.readlink(path)
- if absolute and not os.path.isabs(result):
- result = os.path.abspath(os.path.join(os.path.dirname(path), result))
- return result
- return path
-
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-14 01:27:23 UTC (rev 910)
+++ cedar-backup2/trunk/Changelog 2008-04-26 19:04:54 UTC (rev 911)
@@ -7,8 +7,6 @@
* Fixed problem with link_depth (closes: #1930729).
- Can't add links directly, they're implicitly added later by tar
- Changed FilesystemList to use includePath=false for recursive links
- * Added util.dereferenceLink()
- * Implemented dereference option on addDirContents()
Version 2.17.0 20 Mar 2008
Added: cedar-backup2/trunk/doc/dereference/Changelog
===================================================================
--- cedar-backup2/trunk/doc/dereference/Changelog (rev 0)
+++ cedar-backup2/trunk/doc/dereference/Changelog 2008-04-26 19:04:54 UTC (rev 911)
@@ -0,0 +1,554 @@
+Version 2.17.1 unreleased
+
+ * Updated copyright statement slightly.
+ * Updated user manual
+ - Brought copyright notices up-to-date
+ - Fixed various URLs that didn't reference SourceForge
+ * Fixed problem with link_depth (closes: #1930729).
+ - Can't add links directly, they're implicitly added later by tar
+ - Changed FilesystemList to use includePath=false for recursive links
+ * Added util.dereferenceLink()
+ * Implemented dereference option on addDirContents()
+
+Version 2.17.0 20 Mar 2008
+
+ * Change suggested execution index for Capacity extension in manual.
+ * Provide support for application-wide diagnostic reporting.
+ - Add util.Diagnostics class to encapsulate information
+ - Log diagnostics when Cedar Backup first starts
+ - Print diagnostics when running unit tests
+ - Add a new --diagnostics command-line option
+ * Clean up filesystem code that deals with file age, and improve unit tests.
+ - Some platforms apparently cannot set file ages precisely
+ - Change calculateFileAge() to use floats throughout, which is safer
+ - Change removeYoungFiles() to explicitly check on whole days
+ - Put a 1-second fudge factor into unit tests when setting file ages
+ * Fix some unit test failures discovered on Windows XP.
+ - Fix utiltests.TestFunctions.testNullDevice_001()
+ - Fix filesystemtests.TestBackupFileList.testGenerateFitted_004()
+ - Fix typo in filesystemtests.TestFilesystemList.testRemoveLinks_002()
+
+Version 2.16.0 18 Mar 2008
+
+ * Make name attribute optional in RemotePeer constructor.
+ * Add support for collecting soft links (closes: #1854631).
+ - Add linkDepth parameter to FilesystemList.addDirContents()
+ - Add CollectDir.linkDepth attribute
+ - Modify collect action to obey CollectDir.linkDepth
+ - Update user manual to discuss new attribute
+ - Document "link farm" option for collect configuration
+ * Implement a capacity-checking extension (closes: #1915496).
+ - Add new extension in CedarBackup2/extend/capacity.py
+ - Refactor ByteQuantity out of split.py and into config.py
+ - Add total capacity and utilization to MediaCapacity classes
+ - Update user manual to discuss new extension
+
+Version 2.15.3 16 Mar 2008
+
+ * Fix testEncodePath_009() to be aware of "UTF-8" encoding.
+ * Fix typos in the PostgreSQL extension section of the manual.
+ * Improve logging when stage action fails (closes: #1854635).
+ * Fix stage action so it works for local users (closes: #1854634).
+
+Version 2.15.2 07 Feb 2008
+
+ * Updated copyright statements now that code changed in year 2008.
+ * Fix two unit test failures when using Python 2.5 (SF #1861878).
+ - Add new function testtutil.hexFloatLiteralAllowed()
+ - Fix splittests.TestByteQuantity.testConstructor_004() for 0xAC
+ - Fix configtests.TestBlankBehavior.testConstructor_006() for 0xAC
+
+Version 2.15.1 19 Dec 2007
+
+ * Improve error reporting for managed client action failures.
+ * Make sure that managed client failure does not kill entire backup.
+ * Add appendix "Securing Password-less SSH Connection" to user manual.
+
+Version 2.15.0 18 Dec 2007
+
+ * Minor documentation tweaks discovered during 3.0 development.
+ * Add support for a new managed backup feature.
+ - Add a new <peers> configuration section (PeersConfig)
+ - Change peers configuration in <stage> to just override <peers>
+ - Modify stage process to take peers list from peers section (if available)
+ - Add new configuration in options and remote peers to support remote shells
+ - Update user manual to discuss managed backup concept and configuration
+ - Add executeRemoteCommand() and executeManagedAction() on peer.RemotePeer
+
+Version 2.14.0 19 Sep 2007
+
+ * Deal properly with programs that localize their output.
+ - Create new util.sanitizeEnvironment() function to set $LANG=C
+ - Call new sanitizeEnvironment() function inside util.executeCommand()
+ - Change extend/split._splitFile() to be more verbose about problems
+ - Update Extension Architecture Interface to mandate $LANG=C
+ - Add split unit tests to catch any locale-related regressions
+ - Thanks to Lukasz Nowak for initial debugging in split extension
+
+Version 2.13.2 10 Jul 2007
+
+ * Tweak some docstring markup to work with Epydoc beta 1.
+ * Apply documentation patch from Lukasz K. Nowak.
+ - Document that mysql extension can back up remote databases
+ - Fix typos in extend/sysinfo.py
+ * Clean up some configuration error messages to be clearer.
+ - Make sure that reported errors always include enough information
+ - Add a prefix argument to some of the specialized lists in util.py
+ * Catch invalid regular expressions in config and filesystem code.
+ - Add new util.RegexList list to contain only valid regexes
+ - Use RegexList in config.ConfigDir and config.CollectConfig
+ - Use RegexList in subversion.RepositoryDir and mbox.MboxDir
+ - Throw ValueError on bad regex in FilesystemList remove() methods
+ - Use RegexList in FilesystemList for all lists of patterns
+
+Version 2.13.1 29 Mar 2007
+
+ * Fix ongoing problems re-initializing previously-written DVDs
+ - Even with -Z, growisofs sometimes wouldn't overwrite DVDs
+ - It turns out that this ONLY happens from cron, not from a terminal
+ - The solution is to use the undocumented option -use-the-force-luke=tty
+ - Also corrected dvdwriter to use option "-dry-run" not "--dry-run"
+
+Version 2.13.0 25 Mar 2007
+
+ * Change writeIndicator() to raise exception on failure (closes #53).
+ * Change buildNormalizedPath() for leading "." so files won't be hidden
+ * Remove bogus usage of tempfile.NamedTemporaryFile in remote peer.
+ * Refactored some common action code into CedarBackup2.actions.util.
+ * Add unit tests for a variety of basic utility functions (closes: #45).
+ - Error-handling was improved in some utility methods
+ - Fundamentally, behavior should be unchanged
+ * Reimplement DVD capacity calculation (initial code from Dmitry Rutsky).
+ - This is now done using a growisofs dry run, without -Z
+ - The old dvd+rw-mediainfo method was unreliable on some systems
+ - Error-handling behavior on CdWriter was also tweaked for consistency
+ * Add code to check media before writing to it (closes: #5).
+ - Create new check_media store configuration option
+ - Implement new initialize action to initialize rewritable media
+ - Media is initialized by writing an initial session with media label
+ - The store action now always writes a media label as well
+ - Update user manual to discuss the new behavior
+ - Add unit tests for new configuration
+ * Implement an optimized media blanking strategy (closes: #48).
+ - When used, Cedar Backup will only blank media when it runs out of space
+ - Initial implementation and manual text provided by Dmitry Rutsky
+ - Add new blanking_behavior store configuration options
+ - Update user manual to document options and discuss usage
+ - Add unit tests for new configuration
+
+Version 2.12.1 26 Feb 2007
+
+ * Fix typo in new split section in the user manual.
+ * Fix incorrect call to new writeIndicatorFile() function in stage action.
+ * Add notes in manual on how to find gpg and split commands.
+
+Version 2.12.0 23 Feb 2007
+
+ * Fix some encrypt unit tests related to config validation
+ * Make util.PathResolverSingleton a new-style class (i.e. inherit from object)
+ * Modify util.changeOwnership() to be a no-op for None user or group
+ * Created new split extension to split large staged files.
+ - Refactored common action utility code into actions/util.py.
+ - Update standard actions, cback-span, and encrypt to use refactored code
+ - Updated user manual to document the new extension and restore process.
+
+Version 2.11.0 21 Feb 2007
+
+ * Fix log message about SCSI id in writers/dvdwriter.py.
+ * Remove TODO from public distribution (use Bugzilla instead).
+ * Minor changes to mbox functionality (refactoring, test cleanup).
+ * Fix bug in knapsack implementation, masked by poor test suite.
+ * Fix filesystem unit tests that had typos in them and wouldn't work
+ * Reorg user manual to move command-line tools to own chapter (closes: #33)
+ * Add validation for duplicate peer and extension names (closes: #37, #38).
+ * Implement new cback-span command-line tool (closes: #51).
+ - Create new util/cback-span script and CedarBackup2.tools package
+ - Implement guts of script in CedarBackup2/tools/span.py
+ - Add new BackupFileList.generateSpan() method and tests
+ - Refactor other util and filesystem code to make things work
+ - Add new section in user manual to discuss new command
+ * Rework validation requiring least one item to collect (closes: #34).
+ - This is no longer a validation error at the configuration level
+ - Instead, the collect action itself will enforce the rule when it is run
+ * Support a <no_eject> flag in store configuration (closes: #39).
+ - Change StoreConfig, CdWriter and DvdWriter to accept new flag
+ - Update user manual to document new flag, along with warnings about it
+ * Support repository directories in Subversion extension (closes: #46).
+ - Add <repository_dir> configuration modeled after <mbox_dir>
+ - Make <type> configuration value optional and for reference only
+ - Refactor code and deprecate BDBRepository and FSFSRepository
+ - Update user manual to reflect new functionality
+
+Version 2.10.1 30 Jan 2007
+
+ * Fix a few places that still referred only to CD/CD-RW.
+ * Fix typo in definition of actions.constants.DIGEST_EXTENSION.
+
+Version 2.10.0 30 Jan 2007
+
+ * Add support for DVD writers and DVD+R/DVD+RW media.
+ - Create new writers.dvdwriter module and DvdWriter class
+ - Support 'dvdwriter' device type, and 'dvd+r' and 'dvd+rw' media types
+ - Rework user manual to properly discuss both CDs and DVDs
+ * Support encrypted staging directories (closes: #33).
+ - Create new 'encrypt' extension and associated unit tests
+ - Document new extension in user manual
+ * Support new action ordering mechanism for extensions.
+ - Extensions can now specify dependencies rather than indexes
+ - Rewrote cli._ActionSet class to use DirectedGraph for dependencies
+ - This functionality is not yet "official"; that will happen later
+ * Refactor and clean up code that implements standard actions.
+ - Split action.py into various other files in the actions package
+ - Move a few of the more generic utility functions into util.py
+ - Preserve public interface via imports in otherwise empty action.py
+ - Change various files to import from the new module locations
+ * Revise and simplify the implied "image writer" interface in CdWriter.
+ - Add the new initializeImage() and addImageEntry() methods
+ - Interface is now initializeImage(), addImageEntry() and writeImage()
+ - Rework actions.store.writeImage() to use new writer interface
+ * Refactor CD writer functionality and clean up code.
+ - Create new writers package to hold all image writers
+ - Move image.py into writers/util.py package
+ - Move most of writer.py into writers/cdwriter.py
+ - Move writer.py validate functions into writers/util.py
+ - Move writertests.py into cdwritertests.py
+ - Move imagetests.py into writersutiltests.py
+ - Preserve public interface via imports in otherwise empty files
+ - Change various files to import from the new module locations
+ * More general code cleanup and minor enhancements.
+ - Modify util/test.py to accept named tests on command line
+ - Fix rebuild action to look at store config instead of stage.
+ - Clean up xmlutil imports in mbox and subversion extensions
+ - Copy Mac OS X (darwin) errors from store action into rebuild action
+ - Check arguments to validateScsiId better (no None path allowed now)
+ - Rename variables in config.py to be more consistent with each other
+ - Add new excludeBasenamePatterns flag to FilesystemList
+ - Add new addSelf flag to FilesystemList.addDirContents()
+ - Create new RegexMatchList class in util.py, and add tests
+ - Create new DirectedGraph class in util.py, and add tests
+ - Create new sortDict() function in util.py, and add tests
+ * Create unit tests for functionality that was not explictly tested before.
+ - ActionHook, PreActionHook, PostActionHook, CommandOverride (config.py)
+ - AbsolutePathList, ObjectTypeList, RestrictedContentList (util.py)
+
+Version 2.9.0 18 Dec 2006
+
+ * Change mbox extension to use ISO-8601 date format when calling grepmail.
+ * Fix error-handling in generateTarfile() when target dir is missing.
+ * Tweak pycheckrc to find fewer expected errors (from standard library).
+ * Fix Debian bug #403546 by supporting more CD writer configurations.
+ - Be looser with SCSI "methods" allowed in valid SCSI id (update regex)
+ - Make <store> config section's <target_scsi_id> parameter optional
+ - Change CdWriter to support "hardware id" as either SCSI id or device
+ - Implement cdrecord commands in terms of hardware id instead of SCSI id
+ - Add documentation in writer.py to discuss how we talk to hardware
+ - Rework user manual's discussion of how to configure SCSI devices
+ * Update Cedar Backup user manual.
+ - Re-order setup procedures to modify cron at end (Debian #403662)
+ - Fix minor typos and misspellings (Debian #403448 among others)
+ - Add discussion about proper ordering of extension actions
+
+Version 2.8.1 04 Sep 2006
+
+ * Changes to fix, update and properly build Cedar Backup manual
+ - Change DocBook XSL configuration to use "current" stylesheet
+ - Tweak manual-generation rules to work around XSL toolchain issues
+ - Document where to find grepmail utility in Appendix B
+ - Create missing documentation for mbox exclusions configuration
+ - Bumped copyright dates to show "(c) 2005-2006" where needed
+ - Made minor changes to some sections based on proofreading
+
+Version 2.8.0 24 Jun 2006
+
+ * Remove outdated comment in xmlutil.py about dependency on PyXML.
+ * Tweak wording in doc/docbook.txt to make it clearer.
+ * Consistently rework "project description" everywhere.
+ * Fix some simple typos in various comments and documentation.
+ * Added recursive flag (default True) to FilesystemList.addDirContents().
+ * Added flat flag (default False) to BackupFileList.generateTarfile().
+ * Created mbox extension in CedarBackup2.extend.mbox (closes: #31).
+ - Updated user manual to document the new extension and restore process.
+ * Added PostgreSQL extension in CedarBackup2.extend.postgresql (closes: #32).
+ - This code was contributed by user Antoine Beaupre ("The Anarcat").
+ - I tweaked it slightly, added configuration tests, and updated the manual.
+ - I have no PostgreSQL databases on which to test the functionality.
+ * Made most unit tests run properly on Windows platform, just for fun.
+ * Re-implement Pipe class (under executeCommand) for Python 2.4+
+ - After Python 2.4, cross-platform subprocess.Popen class is available
+ - Added some new regression tests for executeCommand to stress new Pipe
+ * Switch to newer version of Docbook XSL stylesheet (1.68.1)
+ - The old stylesheet isn't easily available any more (gone from sf.net)
+ - Unfortunately, the PDF output changed somewhat with the new version
+ * Add support for collecting individual files (closes: #30).
+ - Create new config.CollectFile class for use by other classes
+ - Update config.CollectConfig class to contain a list of collect files
+ - Update config.Config class to parse and emit collect file data
+ - Modified collect process in action.py to handle collect files
+ - Updated user manual to discuss new <file> configuraton
+
+Version 2.7.2 22 Dec 2005
+
+ * Remove some bogus writer tests that depended on an arbitrary SCSI device.
+
+Version 2.7.1 13 Dec 2005
+
+ * Tweak the CREDITS file to fix a few typos.
+ * Remove completed tasks in TODO file and reorganize it slightly.
+ * Get rid of sys.exit() calls in util/test.py in favor of simple returns.
+ * Fix implementation of BackupFileList.removeUnchanged(captureDigest=True).
+ - Since version 2.7.0, digest only included backed-up (unchanged) files
+ - This release fixes code so digest is captured for all files in the list
+ - Fixed captureDigest test cases, which were testing for wrong results
+ * Make some more updates to the user manual based on further proof-reading.
+ - Rework description of "midnight boundary" warning slightly in basic.xml
+ - Change "Which Linux Distribution?" to "Which Platform?" in config.xml
+ - Fix a few typos and misspellings in basic.xml
+
+Version 2.7.0 30 Oct 2005
+
+ * Cleanup some maintainer-only (non-distributed) Makefile rules.
+ * Make changes to standardize file headers with other Cedar Solutions code.
+ * Add debug statements to filesystem code (huge increase in debug log size).
+ * Standardize some config variable names ("parentNode" instead of "parent").
+ * Fix util/test.py to return proper (non-zero) return status upon failure.
+ * No longer attempt to change ownership of files when not running as root.
+ * Remove regression test for bug #25 (testAddFile_036) 'cause it's not portable.
+ * Modify use of user/password in MySQL extension (suggested by Matthias Urlichs).
+ - Make user and password values optional in Cedar Backup configuration
+ - Add a few regression tests to make sure configuration changes work
+ - Add warning when user or password value(s) are visible in process listing
+ - Document use of /root/.my.cnf or ~/.my.cnf in source code and user manual
+ - Rework discussion of command line, file permissions, etc. in user manual
+ * Optimize incremental backup, and hopefully speed it up a bit (closes: #29).
+ - Change BackupFileList.removeUnchanged() to accept a captureDigest flag
+ - This avoids need to call both generateDigestMap() and removeUnchanged()
+ - Note that interface to removeUnchanged was modified, but not broken
+ * Add support for pre- and post-action command hooks (closes: #27).
+ - Added <pre_action_hook> and <post_action_hook> sections within <options>
+ - Updated user manual documentation for options configuration section
+ - Create new config.PreActionHook and PostActionHook classes to hold hooks
+ - Added new hooks list field on config.OptionsConfig class
+ - Update ActionSet and ActionItem in cli to handle and execute hooks
+ * Rework and abstract XML functionality, plus remove dependency on PyXML.
+ - Refactor general XML utility code out of config.py into xmlutil.py
+ - Create new isElement() function to eliminate need for Node references
+ - Create new createInputDom(), createOutputDom() and serializeDom() functions
+ - Use minidom XML parser rather than PyExpat.reader (much faster)
+ - Hack together xmlutil.Serializer based on xml.dom.ext.PrettyPrint
+ - Remove references to PyXML in manual's depends.xml and install.xml files
+ - Add notes about PyXML code sourced from Fourthought, Inc. in CREDITS
+ - Rework mysql and subversion unit tests in terms of new functions
+
+Version 2.6.1 27 Sep 2005
+
+ * Fix broken call to node.hasChildNodes (no parens) in config.py.
+ * Make "pre-existing collect indicator" error more obvious (closes: #26).
+ * Avoid failures for UTF-8 filenames on certain filesystems (closes: #25).
+ * Fix FilesystemList to encode excludeList items, preventing UTF-8 failures.
+
+Version 2.6.0 12 Sep 2005
+
+ * Remove bogus check for remote collect directory on master (closes: #18).
+ * Fix testEncodePath_009 test failure on UTF-8 filesystems (closes: #19).
+ * Fixed several unit tests related to the CollectConfig class (all typos).
+ * Fix filesystem and action code to properly handle path "/" (closes: #24).
+ * Add extension configuration to cback.conf.sample, to clarify things.
+ * Place starting and ending revision numbers into Subversion dump filenames.
+ * Implement resolver mechanism to support paths to commands (closes: #22).
+ - Added <override> section within <options> configuration
+ - Create new config.CommandOverride class to hold overrides
+ - Added new overrides field on config.OptionsConfig class
+ - Create util.PathResolverSingleton class to encapsulate mappings
+ - Create util.resolveCommand convenience function for code to call
+ - Create and call new _setupPathResolver() function in cli code
+ - Change all _CMD constants to _COMMAND, for consistency
+ * Change Subversion extension to support "fsfs" repositories (closes: #20).
+ - Accept "FSFS" repository <type> in <subversion> configuration section
+ - Create new FSFSRepository class to represent an FSFS repository
+ - Refactor internal code common to both BDB and FSFS repositories
+ - Add and rework test cases to provide coverage of FSFSRepository
+ * Port to Darwin (Mac OS X) and ensure that all regression tests pass.
+ - Don't run testAddDirContents_072() for Darwin (tarball's invalid there)
+ - Write new ISO mount testing methods in terms of Apple's "hdiutil" utility
+ - Accept Darwin-style SCSI writer devices, i.e. "IOCompactDiscServices"
+ - Tweak existing SCSI id pattern to allow spaces in a few other places
+ - Add new regression tests for validateScsiId() utility function
+ - Add code warnings and documentation in manual and in doc/osx
+ * Update, clean up and extend Cedar Backup User Manual (closes: #21).
+ - Work through document and copy-edit it now that it's matured
+ - Add documentation for new options and subversion config items
+ - Exorcise references to Linux which assumed it was "the" platform
+ - Add platform-specific notes for non-Linux platforms (darwin, BSDs)
+ - Clarify purpose of the 'collect' action on the master
+ - Clarify how actions (i.e. 'store') are optional
+ - Clarify that 'all' does not execute extensions
+ - Add an appendix on restoring backups
+
+Version 2.5.0 12 Jul 2005
+
+ * Update docs to modify use of "secure" (suggested by Lars Wirzenius).
+ * Removed "Not an Official Debian Package" section in software manual.
+ * Reworked Debian install procedure in manual to reference official packages.
+ * Fix manual's build process to create files with mode 664 rather than 755.
+ * Deal better with date boundaries on the store operation (closes: #17).
+ - Add <warn_midnite> value in <store> configuration
+ - Add warnMidnite field to the StoreConfig object
+ - Add warning in store process for crossing midnite boundary
+ - Change store --full to have more consistent behavior
+ - Update manual to document changes related to this bug
+
+Version 2.4.2 23 Apr 2005
+
+ * Fix boundaries log message again, properly this time.
+ * Fix a few other log messages that used "," rather than "%".
+
+Version 2.4.1 22 Apr 2005
+
+ * Fix minor typos in user manual and source code documentation.
+ * Properly annotate code implemented based on Python 2.3 source.
+ * Add info within CREDITS about Python 2.3 and Docbook XSL licenses.
+ * Fix logging for boundaries values (can't print None[0], duh).
+
+Version 2.4.0 02 Apr 2005
+
+ * Re-license manual under "GPL with clarifications" to satisfy DFSG.
+ * Rework our unmount solution again to try and fix observed problems.
+ - Sometimes, unmount seems to "work" but leaves things mounted.
+ - This might be because some file is not yet completely closed.
+ - We try to work around this by making repeated unmount attempts.
+ - This logic is now encapsulated in util.mount() and util.unmount().
+ - This solution should also be more portable to non-Linux systems.
+
+Version 2.3.1 23 Mar 2005
+
+ * Attempt to deal more gracefully with corrupted media.
+ * Unmount media using -l ("lazy unmount") in consistency check.
+ * Be more verbose about media errors during consistency check.
+
+Version 2.3.0 10 Mar 2005
+
+ * Make 'extend' package public by listing it in CedarBackup2/__init__.py.
+ * Reimplement digest generation to use incremental method (now ~3x faster).
+ * Tweak manifest to be a little more selective about what's distributed.
+
+Version 2.2.0 09 Mar 2005
+
+ * Fix bug related to execution of commands with huge output.
+ * Create custom class util.Pipe, inheriting from popen2.Popen4.
+ * Re-implement util.executeCommand() in terms of util.Pipe.
+ * Change ownership of sysinfo files to backup user/group after write.
+
+Version 2.1.3 08 Mar 2005
+
+ * In sysinfo extension, explicitly path to /sbin/fdisk command.
+ * Modify behavior and logging when optional sysinfo commands are not found.
+ * Add extra logging around boundaries and capacity calculations in writer.py.
+ * In executeCommand, log command using output logger as well as debug level.
+ * Docs now suggest --output in cron command line to aid problem diagnosis.
+ * Fix bug in capacity calculation, this time for media with a single session.
+ * Validate all capacity code against v1.0 code, making changes as needed.
+ * Re-evaluate all capacity-related regression tests against v1.0 code.
+ * Add new regression tests for capacity bugs which weren't already detected.
+
+Version 2.1.2 07 Mar 2005
+
+ * Fix a few extension error messages with incorrect (missing) arguments.
+ * In sysinfo extension, do not log ls and dpkg output to the debug log.
+ * Fix CdWriter, which reported negative capacity when disc was almost full.
+ * Make displayBytes deal properly with negative values via math.fabs().
+ * Change displayBytes to default to 2 digits after the decimal point.
+
+Version 2.1.1 06 Mar 2005
+
+ * Fix bug in setup.py (need to install extensions properly).
+
+Version 2.1.0 06 Mar 2005
+
+ * Fixed doc/cback.1 .TH line to give proper manpage section.
+ * Updated README to more completely describe what Cedar Backup is.
+ * Fix a few logging statements for the collect action, to be clearer.
+ * Fix regression tests that failed in a Debian pbuilder environment.
+ * Add simple main routine to cli.py, so executing it is the same as cback.
+ * Added optional outputFile and doNotLog parameters to util.executeCommand().
+ * Display byte quantities in sensible units (i.e. bytes, kB, MB) when logged.
+ * Refactored private code into public in action.py and config.py.
+ * Created MySQL extension in CedarBackup2.extend.mysql.
+ * Created sysinfo extension in CedarBackup2.extend.sysinfo.
+ * Created Subversion extension in CedarBackup2.extend.subversion.
+ * Added regression tests as needed for new extension functionality.
+ * Added Chapter 5, Official Extensions in the user manual.
+
+Version 2.0.0 26 Feb 2005
+
+ * Complete ground-up rewrite for 2.0.0 release.
+ * See doc/release.txt for more details about changes.
+
+Version 1.13 25 Jan 2005
+
+ * Fix boundaries calculation when using kernel >= 2.6.8 (closes: #16).
+ * Look for a matching boundaries pattern among all lines, not just the first.
+
+Version 1.12 16 Jan 2005
+
+ * Add support for ATAPI devices, just like ATA (closes: #15).
+ * SCSI id can now be in the form '[ATA:|ATAPI:]scsibus,target,lun'.
+
+Version 1.11 17 Oct 2004
+
+ * Add experimental support for new Linux 2.6 ATA CD devices.
+ * SCSI id can now be in the form '[ATA:]scsibus,target,lun'.
+ * Internally, the SCSI id is now stored as a string, not a list.
+ * Cleaned up 'cdrecord' calls in cdr.py to make them consistent.
+ * Fixed a pile of warnings noticed by the latest pychecker.
+
+Version 1.10 01 Dec 2003
+
+ * Removed extraneous error parameter from cback's version() function.
+ * Changed copyright statement and year; added COPYRIGHT in release.py.
+ * Reworked all file headers to match new Cedar Solutions standard.
+ * Removed __version__ and __date__ values with switch to Subversion.
+ * Convert to tabs in Changelog to make the Vim syntax file happy.
+ * Be more stringent in validating contents of SCSI triplet values.
+ * Fixed bug when using modulo 1 (% 1) in a few places.
+ * Fixed shell-interpolation bug discovered by Rick Low (security hole).
+ * Replace all os.popen() calls with new execute_command() call for safety.
+
+Version 1.9 09 Nov 2002
+
+ * Packaging changes to allow Debian version to be "normal", not Debian-native.
+ * Added CedarBackup/release.py to contain "upstream" release number.
+ * Added -V,--version option to cback script.
+ * Rewrote parts of Makefile to remove most Debian-specific rules.
+ * Changed Makefile and setup.py to get version info from release.py.
+ * The setup.py script now references /usr/bin/env python, not python2.2.
+ * Debian-related changes will now reside exclusively in debian/changelog.
+
+Version 1.8 14 Oct 2002
+
+ * Fix bug with the way the default mode is displayed in the help screen.
+
+Version 1.7 14 Oct 2002
+
+ * Bug fix. Upgrade to Python 2.2.2b1 exposed a flaw in my version-check code.
+
+Version 1.6 06 Oct 2002
+
+ * Debian packaging cleanup (should have been a Debian-only release 1.5-2).
+
+Version 1.5 19 Sep 2002
+
+ * Changed cback script to more closely control ownership of logfile.
+
+Version 1.4 10 Sep 2002
+
+ * Various packaging cleanups.
+ * Fixed code that reported negative capacity on a full disc.
+ * Now blank disc ahead of time if it needs to be blanked.
+ * Moved to Python2.2 for cleaner packaging (True, False, etc.)
+
+Version 1.3 20 Aug 2002
+
+ * Initial "public" release.
+
+-----------------------------------------------------------------------------
+vim: set ft=changelog noexpandtab:
Property changes on: cedar-backup2/trunk/doc/dereference/Changelog
___________________________________________________________________
Name: svn:keywords
+ Id
Added: cedar-backup2/trunk/doc/dereference/README
===================================================================
--- cedar-backup2/trunk/doc/dereference/README (rev 0)
+++ cedar-backup2/trunk/doc/dereference/README 2008-04-26 19:04:54 UTC (rev 911)
@@ -0,0 +1,11 @@
+In here is the beginnings of a solution to Dmitry's "dereference" feature
+request. It doesn't work properly. I think that the tests are pretty good,
+but getting the code to work has been more of a challenge than I had
+anticipated.
+
+I've taken this out of the codebase because I want to get 2.17.1 released
+with at least the fix for the link issue. Then, I can spend some more time
+on this feature request later.
+
+KEN
+26 Apr 2008
Property changes on: cedar-backup2/trunk/doc/dereference/README
___________________________________________________________________
Name: svn:keywords
+ Id
Added: cedar-backup2/trunk/doc/dereference/filesystem.py
===================================================================
--- cedar-backup2/trunk/doc/dereference/filesystem.py (rev 0)
+++ cedar-backup2/trunk/doc/dereference/filesystem.py 2008-04-26 19:04:54 UTC (rev 911)
@@ -0,0 +1,1490 @@
+# -*- coding: iso-8859-1 -*-
+# vim: set ft=python ts=3 sw=3 expandtab:
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# C E D A R
+# S O L U T I O N S "Software done right."
+# S O F T W A R E
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Copyright (c) 2004-2008 Kenneth J. Pronovici.
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License,
+# Version 2, as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copies of the GNU General Public License are available from
+# the Free Software Foundation website, http://www.gnu.org/.
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Author : Kenneth J. Pronovici <pro...@ie...>
+# Language : Python (>= 2.3)
+# Project : Cedar Backup, release 2
+# Revision : $Id$
+# Purpose : Provides filesystem-related objects.
+#
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+########################################################################
+# Module documentation
+########################################################################
+
+"""
+Provides filesystem-related objects.
+@sort: FilesystemList, BackupFileList, PurgeItemList
+@author: Kenneth J. Pronovici <pro...@ie...>
+"""
+
+
+########################################################################
+# Imported modules
+########################################################################
+
+# System modules
+import sys
+import os
+import re
+import sha
+import math
+import logging
+import tarfile
+
+# Cedar Backup modules
+from CedarBackup2.knapsack import firstFit, bestFit, worstFit, alternateFit
+from CedarBackup2.util import AbsolutePathList, ObjectTypeList, UnorderedList, RegexList
+from CedarBackup2.util import removeKeys, displayBytes, calculateFileAge, encodePath
+from CedarBackup2.util import dereferenceLink
+
+
+########################################################################
+# Module-wide variables
+########################################################################
+
+logger = logging.getLogger("CedarBackup2.log.filesystem")
+
+
+########################################################################
+# FilesystemList class definition
+########################################################################
+
+class FilesystemList(list):
+
+ ######################
+ # Class documentation
+ ######################
+
+ """
+ Represents a list of filesystem items.
+
+ This is a generic class that represents a list of filesystem items. Callers
+ can add individual files or directories to the list, or can recursively add
+ the contents of a directory. The class also allows for up-front exclusions
+ in several forms (all files, all directories, all items matching a pattern,
+ all items whose basename matches a pattern, or all directories containing a
+ specific "ignore file"). Symbolic links are typically backed up
+ non-recursively, i.e. the link to a directory is backed up, but not the
+ contents of that link (we don't want to deal with recursive loops, etc.).
+
+ The custom methods such as L{addFile} will only add items if they exist on
+ the filesystem and do not match any exclusions that are already in place.
+ However, since a FilesystemList is a subclass of Python's standard list
+ class, callers can also add items to the list in the usual way, using
+ methods like C{append()} or C{insert()}. No validations apply to items
+ added to the list in this way; however, many list-manipulation methods deal
+ "gracefully" with items that don't exist in the filesystem, often by
+ ignoring them.
+
+ Once a list has been created, callers can remove individual items from the
+ list using standard methods like C{pop()} or C{remove()} or they can use
+ custom methods to remove specific types of entries or entries which match a
+ particular pattern.
+
+ @note: Regular expression patterns that apply to paths are assumed to be
+ bounded at front and back by the beginning and end of the string, i.e. they
+ are treated as if they begin with C{^} and end with C{$}. This is true
+ whether we are matching a complete path or a basename.
+
+ @note: Some platforms, like Windows, do not support soft links. On those
+ platforms, the ignore-soft-links flag can be set, but it won't do any good
+ because the operating system never reports a file as a soft link.
+
+ @sort: __init__, addFile, addDir, addDirContents, removeFiles, removeDirs,
+ removeLinks, removeMatch, removeInvalid, normalize, validate,
+ excludeFiles, excludeDirs, excludeLinks, excludePaths,
+ excludePatterns, excludeBasenamePatterns, ignoreFile
+ """
+
+
+ ##############
+ # Constructor
+ ##############
+
+ def __init__(self):
+ """Initializes a list with no configured exclusions."""
+ list.__init__(self)
+ self._excludeFiles = False
+ self._excludeDirs = False
+ self._excludeLinks = False
+ self._excludePaths = None
+ self._excludePatterns = None
+ self._excludeBasenamePatterns = None
+ self._ignoreFile = None
+ self.excludeFiles = False
+ self.excludeLinks = False
+ self.excludeDirs = False
+ self.excludePaths = []
+ self.excludePatterns = RegexList()
+ self.excludeBasenamePatterns = RegexList()
+ self.ignoreFile = None
+
+
+ #############
+ # Properties
+ #############
+
+ def _setExcludeFiles(self, value):
+ """
+ Property target used to set the exclude files flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._excludeFiles = True
+ else:
+ self._excludeFiles = False
+
+ def _getExcludeFiles(self):
+ """
+ Property target used to get the exclude files flag.
+ """
+ return self._excludeFiles
+
+ def _setExcludeDirs(self, value):
+ """
+ Property target used to set the exclude directories flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._excludeDirs = True
+ else:
+ self._excludeDirs = False
+
+ def _getExcludeDirs(self):
+ """
+ Property target used to get the exclude directories flag.
+ """
+ return self._excludeDirs
+
+ def _setExcludeLinks(self, value):
+ """
+ Property target used to set the exclude soft links flag.
+ No validations, but we normalize the value to C{True} or C{False}.
+ """
+ if value:
+ self._excludeLinks = True
+ else:
+ self._excludeLinks = False
+
+ def _getExcludeLinks(self):
+ """
+ Property target used to get the exclude soft links flag.
+ """
+ return self._excludeLinks
+
+ def _setExcludePaths(self, value):
+ """
+ Property target used to set the exclude paths list.
+ A C{None} value is converted to an empty list.
+ Elements do not have to exist on disk at the time of assignment.
+ @raise ValueError: If any list element is not an absolute path.
+ """
+ self._absoluteExcludePaths = AbsolutePathList()
+ if value is not None:
+ self._absoluteExcludePaths.extend(value)
+
+ def _getExcludePaths(self):
+ """
+ Property target used to get the absolute exclude paths list.
+ """
+ return self._absoluteExcludePaths
+
+ def _setExcludePatterns(self, value):
+ """
+ Property target used to set the exclude patterns list.
+ A C{None} value is converted to an empty list.
+ """
+ self._excludePatterns = RegexList()
+ if value is not None:
+ self._excludePatterns.extend(value)
+
+ def _getExcludePatterns(self):
+ """
+ Property target used to get the exclude patterns list.
+ """
+ return self._excludePatterns
+
+ def _setExcludeBasenamePatterns(self, value):
+ """
+ Property target used to set the exclude basename patterns list.
+ A C{None} value is converted to an empty list.
+ """
+ self._excludeBasenamePatterns = RegexList()
+ if value is not None:
+ self._excludeBasenamePatterns.extend(value)
+
+ def _getExcludeBasenamePatterns(self):
+ """
+ Property target used to get the exclude basename patterns list.
+ """
+ return self._excludeBasenamePatterns
+
+ def _setIgnoreFile(self, value):
+ """
+ Property target used to set the ignore file.
+ The value must be a non-empty string if it is not C{None}.
+ @raise ValueError: If the value is an empty string.
+ """
+ if value is not None:
+ if len(value) < 1:
+ raise ValueError("The ignore file must be a non-empty string.")
+ self._ignoreFile = value
+
+ def _getIgnoreFile(self):
+ """
+ Property target used to get the ignore file.
+ """
+ return self._ignoreFile
+
+ excludeFiles = property(_getExcludeFiles, _setExcludeFiles, None, "Boolean indicating whether files should be excluded.")
+ excludeDirs = property(_getExcludeDirs, _setExcludeDirs, None, "Boolean indicating whether directories should be excluded.")
+ excludeLinks = property(_getExcludeLinks, _setExcludeLinks, None, "Boolean indicating whether soft links should be excluded.")
+ excludePaths = property(_getExcludePaths, _setExcludePaths, None, "List of absolute paths to be excluded.")
+ excludePatterns = property(_getExcludePatterns, _setExcludePatterns, None,
+ "List of regular expression patterns (matching complete path) to be excluded.")
+ excludeBasenamePatterns = property(_getExcludeBasenamePatterns, _setExcludeBasenamePatterns,
+ None, "List of regular expression patterns (matching basename) to be excluded.")
+ ignoreFile = property(_getIgnoreFile, _setIgnoreFile, None, "Name of file which will cause directory contents to be ignored.")
+
+
+ ##############
+ # Add methods
+ ##############
+
+ def addFile(self, path):
+ """
+ Adds a file to the list.
+
+ The path must exist and must be a file or a link to an existing file. It
+ will be added to the list subject to any exclusions that are in place.
+
+ @param path: File path to be added to the list
+ @type path: String representing a path on disk
+
+ @return: Number of items added to the list.
+
+ @raise ValueError: If path is not a file or does not exist.
+ @raise ValueError: If the path could not be encoded properly.
+ """
+ path = encodePath(path)
+ if not os.path.exists(path) or not os.path.isfile(path):
+ logger.debug("Path [%s] is not a file or does not exist on disk." % path)
+ raise ValueError("Path is not a file or does not exist on disk.")
+ if self.excludeLinks and os.path.islink(path):
+ logger.debug("Path [%s] is excluded based on excludeLinks." % path)
+ return 0
+ if self.excludeFiles:
+ logger.debug("Path [%s] is excluded based on excludeFiles." % path)
+ return 0
+ if path in self.excludePaths:
+ logger.debug("Path [%s] is excluded based on excludePaths." % path)
+ return 0
+ for pattern in self.excludePatterns:
+ if re.compile(r"^%s$" % pattern).match(path): # safe to assume all are valid due to RegexList
+ logger.debug("Path [%s] is excluded based on pattern [%s]." % (path, pattern))
+ return 0
+ for pattern in self.excludeBasenamePatterns: # safe to assume all are valid due to RegexList
+ if re.compile(r"^%s$" % pattern).match(os.path.basename(path)):
+ logger.debug("Path [%s] is excluded based on basename pattern [%s]." % (path, pattern))
+ return 0
+ self.append(path)
+ logger.debug("Added file to list: [%s]" % path)
+ return 1
+
+ def addDir(self, path):
+ """
+ Adds a directory to the list.
+
+ The path must exist and must be a directory or a link to an existing
+ directory. It will be added to the list subject to any exclusions that
+ are in place. The L{ignoreFile} does not apply to this method, only to
+ L{addDirContents}.
+
+ @param path: Directory path to be added to the list
+ @type path: String representing a path on disk
+
+ @return: Number of items added to the list.
+
+ @raise ValueError: If path is not a directory or does not exist.
+ @raise ValueError: If the path could not be encoded properly.
+ """
+ path = encodePath(path)
+ path = normalizeDir(path)
+ if not os.path.exists(path) or not os.path.isdir(path):
+ logger.debug("Path [%s] is not a directory or does not exist on disk." % path)
+ raise ValueError("Path is not a directory or does not exist on disk.")
+ if self.excludeLinks and os.path.islink(path):
+ logger.debug("Path [%s] is excluded based on excludeLinks." % path)
+ return 0
+ if self.excludeDirs:
+ logger.debug("Path [%s] is excluded based on excludeDirs." % path)
+ return 0
+ if path in self.excludePaths:
+ logger.debug("Path [%s] is excluded based on excludePaths." % path)
+ return 0
+ for pattern in self.excludePatterns: # safe to assume all are valid due to RegexList
+ if re.compile(r"^%s$" % pattern).match(path):
+ logger.debug("Path [%s] is excluded based on pattern [%s]." % (path, pattern))
+ return 0
+ for pattern in self.excludeBasenamePatterns: # safe to assume all are valid due to RegexList
+ if re.compile(r"^%s$" % pattern).match(os.path.basename(path)):
+ logger.debug("Path [%s] is excluded based on basename pattern [%s]." % (path, pattern))
+ return 0
+ self.append(path)
+ logger.debug("Added directory to list: [%s]" % path)
+ return 1
+
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
+ """
+ Adds the contents of a directory to the list.
+
+ The path must exist and must be a directory or a link to a directory.
+ The contents of the directory (as well as the directory path itself) will
+ be recursively added to the list, subject to any exclusions that are in
+ place. If you only want the directory and its immediate contents to be
+ added, then pass in C{recursive=False}.
+
+ If the passed-in directory happens to be a soft link, it will be
+ recursed. However, by default, other directory links within the
+ passed-in directory are not recursed. The C{linkDepth} parameter
+ controls this behavior. This value is the maximum depth of the tree at
+ which directory links should be followed. So, a depth of 0 does not
+ follow any directory links, a depth of 1 follows only directory links
+ within the passed-in directory, a depth of 2 follows the directory links
+ at the next level down, etc.
+
+ The C{dereference} flag also controls link-related behavior. If the
+ C{linkDepth} is greater than zero and C{deference} is true, then any file
+ or directory link will be deferenced before being added to the list. So,
+ the list will contain the p...
[truncated message content] |
|
From: <pro...@us...> - 2008-04-14 01:27:27
|
Revision: 910
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=910&view=rev
Author: pronovic
Date: 2008-04-13 18:27:23 -0700 (Sun, 13 Apr 2008)
Log Message:
-----------
Check in some more tests which expose flaws in my previous dereference implementation
Modified Paths:
--------------
cedar-backup2/trunk/test/filesystemtests.py
Modified: cedar-backup2/trunk/test/filesystemtests.py
===================================================================
--- cedar-backup2/trunk/test/filesystemtests.py 2008-04-13 21:44:38 UTC (rev 909)
+++ cedar-backup2/trunk/test/filesystemtests.py 2008-04-14 01:27:23 UTC (rev 910)
@@ -1061,7 +1061,182 @@
self.failUnlessEqual(1, count)
self.failUnlessEqual([path], fsList)
+# def testAddFile_044(self):
+# """
+# Attempt to add a file that doesn't exist; dereference=True
+# """
+# path = self.buildPath([INVALID_FILE])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_045(self):
+# """
+# Attempt to add a directory; dereference=True
+# """
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir001"])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_046(self):
+# """
+# Attempt to add a soft link; dereference=True
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# expected = self.buildPath(["tree5", "file007"])
+# fsList = FilesystemList()
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([expected], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_047(self):
+# """
+# Attempt to add an existing file; dereference=True
+# """
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "file001"])
+# fsList = FilesystemList()
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([path], fsList)
+#
+# def testAddFile_048(self):
+# """
+# Attempt to add a soft link; with excludeBasenamePatterns matching the
+# path and dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# fsList = FilesystemList()
+# fsList.excludeBasenamePatterns = [ "link001", ]
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludeBasenamePatterns = [ "link001", ]
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_049(self):
+# """
+# Attempt to add an invalid link (i.e. a link that points to something that
+# doesn't exist), and dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree10")
+# path = self.buildPath(["tree10", "link001"])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_050(self):
+# """
+# Attempt to add a soft link; with excludePatterns matching the path and
+# dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# fsList = FilesystemList()
+# fsList.excludePatterns = [ self.pathPattern(path) ]
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludePatterns = [ self.pathPattern(path) ]
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_051(self):
+# """
+# Attempt to add a soft link; with excludePaths including the path
+# and dereference=True
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# fsList = FilesystemList()
+# fsList.excludePaths = [ path ]
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludePaths = [ path ]
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_052(self):
+# """
+# Attempt to add a soft link; excludeLinks and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludeLinks = True
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludeLinks = True
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_053(self):
+# """
+# Attempt to add a soft link; excludeDirs and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# expected = self.buildPath(["tree5", "file007"])
+# fsList = FilesystemList()
+# fsList.excludeDirs = True
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([expected], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludeDirs = True
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+#
+# def testAddFile_054(self):
+# """
+# Attempt to add a soft link; excludeFiles and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to file007
+# fsList = FilesystemList()
+# fsList.excludeFiles = True
+# count = fsList.addFile(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+# fsList = FilesystemList()
+# fsList.excludeFiles = True
+# self.failUnlessRaises(ValueError, fsList.addFile, path, True)
+
################
# Test addDir()
################
@@ -1601,7 +1776,181 @@
self.failUnlessEqual(1, count)
self.failUnlessEqual([path], fsList)
+# def testAddDir_043(self):
+# """
+# Attempt to add a directory that doesn't exist; dereference=True.
+# """
+# path = self.buildPath([INVALID_FILE])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# def testAddDir_044(self):
+# """
+# Attempt to add a file; dereference=True.
+# """
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "file001"])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# def testAddDir_045(self):
+# """
+# Attempt to add a soft link; dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# expected = self.buildPath(["tree5", "dir002", "dir003"])
+# fsList = FilesystemList()
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([expected], fsList)
+#
+# def testAddDir_046(self):
+# """
+# Attempt to add an existing directory; dereference=True.
+# """
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir001"])
+# fsList = FilesystemList()
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([path], fsList)
+#
+# def testAddDir_047(self):
+# """
+# Attempt to add a soft link; with excludeBasenamePatterns matching the
+# path, and dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludeBasenamePatterns = [ "link001", ]
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludeBasenamePatterns = [ "link001", ]
+# count = fsList.addDir(path)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList, True)
+#
+# def testAddDir_048(self):
+# """
+# Attempt to add an invalid link (i.e. a link that points to something that
+# doesn't exist), and dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree10")
+# path = self.buildPath(["tree10", "link001"])
+# fsList = FilesystemList()
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# def testAddDir_049(self):
+# """
+# Attempt to add a soft link; with excludePatterns matching the path.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludePatterns = [ self.pathPattern(path) ]
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludePatterns = [ self.pathPattern(path) ]
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# def testAddDir_050(self):
+# """
+# Attempt to add a soft link; with excludePaths including the path,
+# and dereference=True.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludePaths = [ path ]
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludePaths = [ path ]
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# def testAddDir_051(self):
+# """
+# Attempt to add a soft link; excludeLinks and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludeLinks = True
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludeLinks = True
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# def testAddDir_052(self):
+# """
+# Attempt to add a soft link; excludeDirs and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludeDirs = True
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludeDirs = True
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(0, count)
+# self.failUnlessEqual([], fsList)
+#
+# def testAddDir_053(self):
+# """
+# Attempt to add a soft link; excludeFiles and dereference set.
+# """
+# if platformSupportsLinks():
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "link001"]) # link to a file
+# fsList = FilesystemList()
+# fsList.excludeFiles = True
+# self.failUnlessRaises(ValueError, fsList.addDir, path, True)
+#
+# self.extractTar("tree5")
+# path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+# expected = self.buildPath(["tree5", "dir002", "dir003"]) # link to dir003
+# fsList = FilesystemList()
+# fsList.excludeFiles = True
+# count = fsList.addDir(path, True)
+# self.failUnlessEqual(1, count)
+# self.failUnlessEqual([expected], fsList)
+
########################
# Test addDirContents()
########################
@@ -5687,7 +6036,184 @@
self.failUnless(self.buildPath(["tree22", "dir007", "file001", ]) in fsList)
self.failUnless(self.buildPath(["tree22", "dir008", "file001", ]) in fsList)
+ def testAddDirContents_101(self):
+ """
+ Attempt to add a soft link; excludeFiles and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeFiles = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ expected = self.buildPath(["tree5", "dir002", "dir003", ])
+ fsList = FilesystemList()
+ fsList.excludeFiles = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(1, count)
+ self.failUnlessEqual([path], fsList)
+
+ def testAddDirContents_102(self):
+ """
+ Attempt to add a soft link; excludeDirs and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeDirs = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludeDirs = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_103(self):
+ """
+ Attempt to add a soft link; excludeLinks and dereference set.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeLinks = True
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludeLinks = True
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_104(self):
+ """
+ Attempt to add a soft link; with excludePaths including the path,
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludePaths = [ path ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludePaths = [ path ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_105(self):
+ """
+ Attempt to add a soft link; with excludePatterns matching the path,
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludePatterns = [ self.pathPattern(path) ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to dir003
+ fsList = FilesystemList()
+ fsList.excludePatterns = [ self.pathPattern(path) ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+ def testAddDirContents_106(self):
+ """
+ Attempt to add a link to a file, with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree9")
+ path = self.buildPath(["tree9", "dir002", "link003", ])
+ fsList = FilesystemList()
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ def testAddDirContents_107(self):
+ """
+ Attempt to add a link to a directory (which should add its contents),
+ with dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree9")
+ path = self.buildPath(["tree9", "link002" ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(9, count)
+ self.failUnlessEqual(9, len(fsList))
+ self.failUnless(self.buildPath([ "tree9", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "dir002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "file002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree9", "link002", "link004", ]) in fsList)
+
+ def testAddDirContents_108(self):
+ """
+ Attempt to add an invalid link (i.e. a link that points to something that
+ doesn't exist), and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link001"])
+ fsList = FilesystemList()
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ def testAddDirContents_109(self):
+ """
+ Attempt to add directory containing an invalid link (i.e. a link that
+ points to something that doesn't exist), and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10"])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(3, count)
+ self.failUnlessEqual(3, len(fsList))
+ self.failUnless(self.buildPath([ "tree10", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree10", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree10", "dir002", ]) in fsList)
+
+ def testAddDirContents_110(self):
+ """
+ Attempt to add a soft link; with excludeBasenamePatterns matching the
+ path, and dereference=True.
+ """
+ if platformSupportsLinks():
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "link001"]) # link to a file
+ fsList = FilesystemList()
+ fsList.excludeBasenamePatterns = [ "link001", ]
+ self.failUnlessRaises(ValueError, fsList.addDirContents, path, True, True, 1, True)
+
+ self.extractTar("tree5")
+ path = self.buildPath(["tree5", "dir002", "link001"]) # link to a dir
+ fsList = FilesystemList()
+ fsList.excludeBasenamePatterns = [ "link001", ]
+ count = fsList.addDirContents(path, True, True, 1, True)
+ self.failUnlessEqual(0, count)
+ self.failUnlessEqual([], fsList)
+
+
#####################
# Test removeFiles()
#####################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-13 21:44:47
|
Revision: 909
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=909&view=rev
Author: pronovic
Date: 2008-04-13 14:44:38 -0700 (Sun, 13 Apr 2008)
Log Message:
-----------
Implemented dereference option on addDirContents
Added Paths:
-----------
cedar-backup2/trunk/test/data/tree22.tar.gz
Added: cedar-backup2/trunk/test/data/tree22.tar.gz
===================================================================
(Binary files differ)
Property changes on: cedar-backup2/trunk/test/data/tree22.tar.gz
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-13 21:44:22
|
Revision: 908
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=908&view=rev
Author: pronovic
Date: 2008-04-13 14:44:16 -0700 (Sun, 13 Apr 2008)
Log Message:
-----------
Implemented dereference option on addDirContents
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/filesystem.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/filesystemtests.py
Modified: cedar-backup2/trunk/CedarBackup2/filesystem.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-13 20:16:45 UTC (rev 907)
+++ cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-13 21:44:16 UTC (rev 908)
@@ -60,6 +60,7 @@
from CedarBackup2.knapsack import firstFit, bestFit, worstFit, alternateFit
from CedarBackup2.util import AbsolutePathList, ObjectTypeList, UnorderedList, RegexList
from CedarBackup2.util import removeKeys, displayBytes, calculateFileAge, encodePath
+from CedarBackup2.util import dereferenceLink
########################################################################
@@ -358,7 +359,7 @@
logger.debug("Added directory to list: [%s]" % path)
return 1
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
"""
Adds the contents of a directory to the list.
@@ -368,22 +369,26 @@
place. If you only want the directory and its immediate contents to be
added, then pass in C{recursive=False}.
+ If the passed-in directory happens to be a soft link, it will be
+ recursed. However, by default, other directory links within the
+ passed-in directory are not recursed. The C{linkDepth} parameter
+ controls this behavior. This value is the maximum depth of the tree at
+ which directory links should be followed. So, a depth of 0 does not
+ follow any directory links, a depth of 1 follows only directory links
+ within the passed-in directory, a depth of 2 follows the directory links
+ at the next level down, etc.
+
+ The C{dereference} flag also controls link-related behavior. If the
+ C{linkDepth} is greater than zero and C{deference} is true, then any file
+ or directory link will be deferenced before being added to the list. So,
+ the list will contain the path of file or directory that the link points
+ at, rather than the path of the link itself.
+
@note: If a directory's absolute path matches an exclude pattern or path,
or if the directory contains the configured ignore file, then the
directory and all of its contents will be recursively excluded from the
list.
- @note: If the passed-in directory happens to be a soft link, it will be
- recursed. However, the linkDepth parameter controls whether any soft
- links I{within} the directory will be recursed. The link depth is
- maximum depth of the tree at which soft links should be followed. So, a
- depth of 0 does not follow any soft links, a depth of 1 follows only
- links within the passed-in directory, a depth of 2 follows the links at
- the next level down, etc.
-
- @note: Any invalid soft links (i.e. soft links that point to
- non-existent items) will be silently ignored.
-
@note: The L{excludeDirs} flag only controls whether any given directory
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
@@ -400,6 +405,9 @@
@param linkDepth: Maximum depth of the tree at which soft links should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
+ @param dereference: Whether soft links should be dereferenced
+ @type dereference: Boolean value
+
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -407,9 +415,9 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return self._addDirContentsInternal(path, addSelf, recursive, linkDepth)
+ return self._addDirContentsInternal(path, addSelf, recursive, linkDepth, dereference)
- def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0):
+ def _addDirContentsInternal(self, path, includePath=True, recursive=True, linkDepth=0, dereference=False):
"""
Internal implementation of C{addDirContents}.
@@ -421,27 +429,34 @@
interface, C{addDirContents} ends up being wholly implemented in terms
of this method.
- The linkDepth parameter controls whether soft links are followed when we
- are adding the contents recursively. Any recursive calls reduce the
- value by one. If the value zero or less, then soft links will just be
- added as directories, but will not be followed. This means that links
- are followed to a I{constant depth} starting from the top-most directory.
+ The C{linkDepth} parameter controls whether directory links are followed
+ when we are adding the contents recursively. Any recursive calls reduce
+ the value by one. If the value zero or less, then directory links will
+ just be added as directories, but will not be followed. This means that
+ links are followed to a I{constant depth} starting from the top-most
+ directory.
- There is one difference between soft links and directories: soft links
- that are added recursively are not placed into the list explicitly. This
- is because if we do add the links recursively, the resulting tar file
- gets a little confused (it has a link and a directory with the same
- name).
+ There is one difference between directory links and directories:
+ directory links that are added recursively (and are not deferenced) are
+ not placed into the list explicitly. This is because if we do add the
+ links recursively, the resulting tar file gets a little confused: it has
+ a link and a directory with the same name, which some tar implementations
+ cannot successfully extract.
@param path: Directory path whose contents should be added to the list.
@param includePath: Indicates whether to include the path as well as contents.
@param recursive: Indicates whether directory contents should be added recursively.
@param linkDepth: Depth of soft links that should be followed
+ @param dereference: Whether soft links should be dereferenced when C{linkDepth > 0}
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
"""
+ if linkDepth < 1:
+ dereference = False # never dereference if we're not following links
+ if dereference:
+ path = dereferenceLink(path, absolute=True)
added = 0
if not os.path.exists(path) or not os.path.isdir(path):
logger.debug("Path [%s] is not a directory or does not exist on disk." % path)
@@ -464,19 +479,21 @@
added += self.addDir(path) # could actually be excluded by addDir, yet
for entry in os.listdir(path):
entrypath = os.path.join(path, entry)
+ if dereference:
+ entrypath = dereferenceLink(entrypath)
if os.path.isfile(entrypath):
added += self.addFile(entrypath)
elif os.path.isdir(entrypath):
if os.path.islink(entrypath):
if recursive and linkDepth > 0:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth)
+ added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth, dereference=dereference)
else:
added += self.addDir(entrypath)
else:
if recursive:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, linkDepth=newDepth)
+ added += self._addDirContentsInternal(entrypath, linkDepth=newDepth, dereference=dereference)
else:
added += self.addDir(entrypath)
return added
@@ -1221,7 +1238,7 @@
# Add methods
##############
- def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0):
+ def addDirContents(self, path, recursive=True, addSelf=True, linkDepth=0, dereference=False):
"""
Adds the contents of a directory to the list.
@@ -1231,22 +1248,26 @@
place. If you only want the directory and its contents to be added, then
pass in C{recursive=False}.
+ If the passed-in directory happens to be a soft link, it will be
+ recursed. However, by default, other directory links within the
+ passed-in directory are not recursed. The C{linkDepth} parameter
+ controls this behavior. This value is the maximum depth of the tree at
+ which directory links should be followed. So, a depth of 0 does not
+ follow any directory links, a depth of 1 follows only directory links
+ within the passed-in directory, a depth of 2 follows the directory links
+ at the next level down, etc.
+
+ The C{dereference} flag also controls link-related behavior. If the
+ C{linkDepth} is greater than zero and C{deference} is true, then any file
+ or directory link will be deferenced before being added to the list. So,
+ the list will contain the path of file or directory that the link points
+ at, rather than the path of the link itself.
+
@note: If a directory's absolute path matches an exclude pattern or path,
or if the directory contains the configured ignore file, then the
directory and all of its contents will be recursively excluded from the
list.
- @note: If the passed-in directory happens to be a soft link, it will be
- recursed. However, the linkDepth parameter controls whether any soft
- links I{within} the directory will be recursed. The link depth is
- maximum depth of the tree at which soft links should be followed. So, a
- depth of 0 does not follow any soft links, a depth of 1 follows only
- links within the passed-in directory, a depth of 2 follows the links at
- the next level down, etc.
-
- @note: Any invalid soft links (i.e. soft links that point to
- non-existent items) will be silently ignored.
-
@note: The L{excludeDirs} flag only controls whether any given soft link
path itself is added to the list once it has been discovered. It does
I{not} modify any behavior related to directory recursion.
@@ -1266,6 +1287,9 @@
@param linkDepth: Depth of soft links that should be followed
@type linkDepth: Integer value, where zero means not to follow any soft links
+ @param dereference: Whether soft links should be dereferenced
+ @type dereference: Boolean value
+
@return: Number of items recursively added to the list
@raise ValueError: If path is not a directory or does not exist.
@@ -1273,7 +1297,7 @@
"""
path = encodePath(path)
path = normalizeDir(path)
- return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth)
+ return super(PurgeItemList, self)._addDirContentsInternal(path, False, recursive, linkDepth, dereference)
##################
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-13 20:16:45 UTC (rev 907)
+++ cedar-backup2/trunk/Changelog 2008-04-13 21:44:16 UTC (rev 908)
@@ -8,6 +8,7 @@
- Can't add links directly, they're implicitly added later by tar
- Changed FilesystemList to use includePath=false for recursive links
* Added util.dereferenceLink()
+ * Implemented dereference option on addDirContents()
Version 2.17.0 20 Mar 2008
Modified: cedar-backup2/trunk/test/filesystemtests.py
===================================================================
--- cedar-backup2/trunk/test/filesystemtests.py 2008-04-13 20:16:45 UTC (rev 907)
+++ cedar-backup2/trunk/test/filesystemtests.py 2008-04-13 21:44:16 UTC (rev 908)
@@ -131,7 +131,7 @@
DATA_DIRS = [ "./data", "./test/data" ]
RESOURCES = [ "tree1.tar.gz", "tree2.tar.gz", "tree3.tar.gz", "tree4.tar.gz", "tree5.tar.gz",
"tree6.tar.gz", "tree7.tar.gz", "tree8.tar.gz", "tree9.tar.gz", "tree10.tar.gz",
- "tree11.tar.gz", "tree12.tar.gz", "tree13.tar.gz", ]
+ "tree11.tar.gz", "tree12.tar.gz", "tree13.tar.gz", "tree22.tar.gz", ]
INVALID_FILE = "bogus" # This file name should never exist
NOMATCH_PATH = "/something" # This path should never match something we put in a file list
@@ -5431,7 +5431,263 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
+ def testAddDirContents_093(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=0, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(12, count)
+ self.failUnlessEqual(12, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+ def testAddDirContents_094(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=1, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(16, count)
+ self.failUnlessEqual(16, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", ]) in fsList)
+
+ def testAddDirContents_095(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=2, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(20, count)
+ self.failUnlessEqual(20, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in fsList)
+
+ def testAddDirContents_096(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=3, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(20, count)
+ self.failUnlessEqual(20, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in fsList)
+
+ def testAddDirContents_097(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=0, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(12, count)
+ self.failUnlessEqual(12, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in fsList)
+
+ def testAddDirContents_098(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=1, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(17, count)
+ self.failUnlessEqual(17, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005" ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link002", ]) in fsList)
+
+ def testAddDirContents_099(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=2, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(23, count)
+ self.failUnlessEqual(23, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link002", ]) in fsList)
+
+ def testAddDirContents_100(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ fsList = FilesystemList()
+ count = fsList.addDirContents(path, linkDepth=3, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(24, count)
+ self.failUnlessEqual(24, len(fsList))
+ self.failUnless(self.buildPath(["tree22", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003",]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir007", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir007", "file001", ]) in fsList)
+ self.failUnless(self.buildPath(["tree22", "dir008", "file001", ]) in fsList)
+
+
#####################
# Test removeFiles()
#####################
@@ -22505,7 +22761,255 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ def testAddDirContents_092(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=0, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(11, count)
+ self.failUnlessEqual(11, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in purgeList)
+ def testAddDirContents_093(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=1, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(15, count)
+ self.failUnlessEqual(15, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", ]) in purgeList)
+
+ def testAddDirContents_094(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=2, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(19, count)
+ self.failUnlessEqual(19, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in purgeList)
+
+ def testAddDirContents_095(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=False.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=3, dereference=False)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(19, count)
+ self.failUnlessEqual(19, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", "link002", "link002", ]) in purgeList)
+
+ def testAddDirContents_096(self):
+ """
+ Attempt to add a directory with linkDepth=0, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=0, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(11, count)
+ self.failUnlessEqual(11, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "link003", ]) in purgeList)
+
+ def testAddDirContents_097(self):
+ """
+ Attempt to add a directory with linkDepth=1, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=1, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(16, count)
+ self.failUnlessEqual(16, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005" ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "link002", ]) in purgeList)
+
+ def testAddDirContents_098(self):
+ """
+ Attempt to add a directory with linkDepth=2, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=2, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(22, count)
+ self.failUnlessEqual(22, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "link002", ]) in purgeList)
+
+ def testAddDirContents_099(self):
+ """
+ Attempt to add a directory with linkDepth=3, dereference=True.
+ """
+ self.extractTar("tree22")
+ path = self.buildPath(["tree22", "dir003", ])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=3, dereference=True)
+ if not platformSupportsLinks():
+ pass
+ else:
+ self.failUnlessEqual(23, count)
+ self.failUnlessEqual(23, len(purgeList))
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir004", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file002",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir001", "file003",]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir005", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir002", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir006", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir007", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir007", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath(["tree22", "dir008", "file001", ]) in purgeList)
+
+
####################
# Test removeAged()
####################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-13 20:16:54
|
Revision: 907
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=907&view=rev
Author: pronovic
Date: 2008-04-13 13:16:45 -0700 (Sun, 13 Apr 2008)
Log Message:
-----------
Tweak a few more tests for linkDepth
Modified Paths:
--------------
cedar-backup2/trunk/test/filesystemtests.py
Modified: cedar-backup2/trunk/test/filesystemtests.py
===================================================================
--- cedar-backup2/trunk/test/filesystemtests.py 2008-04-13 18:03:00 UTC (rev 906)
+++ cedar-backup2/trunk/test/filesystemtests.py 2008-04-13 20:16:45 UTC (rev 907)
@@ -4758,10 +4758,11 @@
self.extractTar("tree6")
path = self.buildPath(["tree6"])
fsList = FilesystemList()
- count = fsList.addDirContents(path, addSelf=False, linkDepth=1)
+ count = fsList.addDirContents(path, linkDepth=1)
if not platformSupportsLinks():
- self.failUnlessEqual(121, count)
- self.failUnlessEqual(121, len(fsList))
+ self.failUnlessEqual(122, count)
+ self.failUnlessEqual(122, len(fsList))
+ self.failUnless(self.buildPath([ "tree6", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
@@ -4884,8 +4885,9 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(164, count)
- self.failUnlessEqual(164, len(fsList))
+ self.failUnlessEqual(165, count)
+ self.failUnlessEqual(165, len(fsList))
+ self.failUnless(self.buildPath([ "tree6", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -5058,10 +5060,11 @@
self.extractTar("tree6")
path = self.buildPath(["tree6"])
fsList = FilesystemList()
- count = fsList.addDirContents(path, addSelf=False, linkDepth=2)
+ count = fsList.addDirContents(path, linkDepth=2)
if not platformSupportsLinks():
- self.failUnlessEqual(121, count)
- self.failUnlessEqual(121, len(fsList))
+ self.failUnlessEqual(122, count)
+ self.failUnlessEqual(122, len(fsList))
+ self.failUnless(self.buildPath([ "tree6" ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
@@ -5184,8 +5187,9 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(240, count)
- self.failUnlessEqual(240, len(fsList))
+ self.failUnlessEqual(241, count)
+ self.failUnlessEqual(241, len(fsList))
+ self.failUnless(self.buildPath([ "tree6" ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -21420,7 +21424,1088 @@
self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
self.failUnless(self.buildPath([ "tree6", "link002", ]) in purgeList)
+ def testAddDirContents_088(self):
+ """
+ Attempt to add a large tree, with excludeBasenamePatterns set to exclude
+ some entries.
+ """
+ self.extractTar("tree6")
+ path = self.buildPath(["tree6"])
+ purgeList = PurgeItemList()
+ purgeList.excludeBasenamePatterns = [ "file001", "dir001" ]
+ count = purgeList.addDirContents(path)
+ if not platformSupportsLinks():
+ self.failUnlessEqual(54, count)
+ self.failUnlessEqual(54, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ else:
+ self.failUnlessEqual(63, count)
+ self.failUnlessEqual(63, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link002", ]) in purgeList)
+ def testAddDirContents_089(self):
+ """
+ Attempt to add a large tree with no exclusions
+ """
+ self.extractTar("tree6")
+ path = self.buildPath(["tree6"])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path)
+ if not platformSupportsLinks():
+ self.failUnlessEqual(121, count)
+ self.failUnlessEqual(121, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ else:
+ self.failUnlessEqual(135, count)
+ self.failUnlessEqual(135, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link002", ]) in purgeList)
+
+ def testAddDirContents_090(self):
+ """
+ Attempt to add a directory with linkDepth=1.
+ """
+ self.extractTar("tree6")
+ path = self.buildPath(["tree6"])
+ purgeList = PurgeItemList()
+ count = purgeList.addDirContents(path, linkDepth=1)
+ if not platformSupportsLinks():
+ self.failUnlessEqual(121, count)
+ self.failUnlessEqual(121, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "link001", ]) in purgeList)
+ else:
+ self.failUnlessEqual(164, count)
+ self.failUnlessEqual(164, len(purgeList))
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "ignore", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "file009", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "file008", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir002", "link005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "dir002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file005", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file006", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "file007", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link001", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link003", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in purgeList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in purgeList)
+ ...
[truncated message content] |
|
From: <pro...@us...> - 2008-04-13 18:03:11
|
Revision: 906
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=906&view=rev
Author: pronovic
Date: 2008-04-13 11:03:00 -0700 (Sun, 13 Apr 2008)
Log Message:
-----------
Added util.dereferenceLink() and associated tests
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/util.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/utiltests.py
Modified: cedar-backup2/trunk/CedarBackup2/util.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/util.py 2008-04-01 02:12:55 UTC (rev 905)
+++ cedar-backup2/trunk/CedarBackup2/util.py 2008-04-13 18:03:00 UTC (rev 906)
@@ -1987,3 +1987,22 @@
os.environ[LANG_VAR] = DEFAULT_LANGUAGE
return os.environ.copy()
+
+#############################
+# dereferenceLink() function
+#############################
+
+def dereferenceLink(path, absolute=True):
+ """
+ Deference a soft link, optionally normalizing it to an absolute path.
+ @param path: Path of link to dereference
+ @param absolute: Whether to normalize the result to an absolute path
+ @return: Dereferenced path, or original path if original is not a link.
+ """
+ if os.path.islink(path):
+ result = os.readlink(path)
+ if absolute and not os.path.isabs(result):
+ result = os.path.abspath(os.path.join(os.path.dirname(path), result))
+ return result
+ return path
+
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-04-01 02:12:55 UTC (rev 905)
+++ cedar-backup2/trunk/Changelog 2008-04-13 18:03:00 UTC (rev 906)
@@ -7,6 +7,7 @@
* Fixed problem with link_depth (closes: #1930729).
- Can't add links directly, they're implicitly added later by tar
- Changed FilesystemList to use includePath=false for recursive links
+ * Added util.dereferenceLink()
Version 2.17.0 20 Mar 2008
Modified: cedar-backup2/trunk/test/utiltests.py
===================================================================
--- cedar-backup2/trunk/test/utiltests.py 2008-04-01 02:12:55 UTC (rev 905)
+++ cedar-backup2/trunk/test/utiltests.py 2008-04-13 18:03:00 UTC (rev 906)
@@ -82,13 +82,14 @@
import logging
from os.path import isdir
-from CedarBackup2.testutil import findResources, removedir, platformHasEcho, platformWindows, captureOutput
+from CedarBackup2.testutil import findResources, removedir, extractTar, buildPath, captureOutput
+from CedarBackup2.testutil import platformHasEcho, platformWindows, platformSupportsLinks
from CedarBackup2.util import UnorderedList, AbsolutePathList, ObjectTypeList
from CedarBackup2.util import RestrictedContentList, RegexMatchList, RegexList
from CedarBackup2.util import DirectedGraph, PathResolverSingleton, Diagnostics
from CedarBackup2.util import sortDict, resolveCommand, executeCommand, getFunctionReference, encodePath
from CedarBackup2.util import convertSize, UNIT_BYTES, UNIT_SECTORS, UNIT_KBYTES, UNIT_MBYTES, UNIT_GBYTES
-from CedarBackup2.util import displayBytes, deriveDayOfWeek, isStartOfWeek
+from CedarBackup2.util import displayBytes, deriveDayOfWeek, isStartOfWeek, dereferenceLink
from CedarBackup2.util import buildNormalizedPath, splitCommandLine, nullDevice
@@ -97,7 +98,7 @@
#######################################################################
DATA_DIRS = [ "./data", "./test/data" ]
-RESOURCES = [ "lotsoflines.py", ]
+RESOURCES = [ "lotsoflines.py", "tree10.tar.gz", ]
#######################################################################
@@ -2137,7 +2138,16 @@
except: pass
return name
+ def extractTar(self, tarname):
+ """Extracts a tarfile with a particular name."""
+ extractTar(self.tmpdir, self.resources['%s.tar.gz' % tarname])
+ def buildPath(self, components):
+ """Builds a complete search path from a list of components."""
+ components.insert(0, self.tmpdir)
+ return buildPath(components)
+
+
##################
# Test sortDict()
##################
@@ -3912,6 +3922,105 @@
self.failUnlessEqual(["cback", "'this", "is", "a", "really", "long", "single-quoted", "argument'", ], result)
+ #########################
+ # Test dereferenceLink()
+ #########################
+
+ def testDereferenceLink_001(self):
+ """
+ Test for a path that is a link, absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link002"])
+ if platformSupportsLinks():
+ expected = "file002"
+ else:
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_002(self):
+ """
+ Test for a path that is a link, absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "link002"])
+ if platformSupportsLinks():
+ expected = self.buildPath(["tree10", "file002"])
+ else:
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_003(self):
+ """
+ Test for a path that is a file (not a link), absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "file001"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_004(self):
+ """
+ Test for a path that is a file (not a link), absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "file001"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_005(self):
+ """
+ Test for a path that is a directory (not a link), absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "dir001"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_006(self):
+ """
+ Test for a path that is a directory (not a link), absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "dir001"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_007(self):
+ """
+ Test for a path that does not exist, absolute=false.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "blech"])
+ expected = path
+ actual = dereferenceLink(path, absolute=False)
+ self.failUnlessEqual(expected, actual)
+
+ def testDereferenceLink_008(self):
+ """
+ Test for a path that does not exist, absolute=true.
+ """
+ self.extractTar("tree10")
+ path = self.buildPath(["tree10", "blech"])
+ expected = path
+ actual = dereferenceLink(path)
+ self.failUnlessEqual(expected, actual)
+ actual = dereferenceLink(path, absolute=True)
+ self.failUnlessEqual(expected, actual)
+
+
#######################################################################
# Suite definition
#######################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-01 02:12:57
|
Revision: 905
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=905&view=rev
Author: pronovic
Date: 2008-03-31 19:12:55 -0700 (Mon, 31 Mar 2008)
Log Message:
-----------
Add comment about linkDepth
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/filesystem.py
Modified: cedar-backup2/trunk/CedarBackup2/filesystem.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-01 01:01:18 UTC (rev 904)
+++ cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-01 02:12:55 UTC (rev 905)
@@ -427,6 +427,12 @@
added as directories, but will not be followed. This means that links
are followed to a I{constant depth} starting from the top-most directory.
+ There is one difference between soft links and directories: soft links
+ that are added recursively are not placed into the list explicitly. This
+ is because if we do add the links recursively, the resulting tar file
+ gets a little confused (it has a link and a directory with the same
+ name).
+
@param path: Directory path whose contents should be added to the list.
@param includePath: Indicates whether to include the path as well as contents.
@param recursive: Indicates whether directory contents should be added recursively.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-04-01 01:01:26
|
Revision: 904
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=904&view=rev
Author: pronovic
Date: 2008-03-31 18:01:18 -0700 (Mon, 31 Mar 2008)
Log Message:
-----------
Fixed problem with link_depth (closes: #1930729)
Modified Paths:
--------------
cedar-backup2/trunk/CedarBackup2/filesystem.py
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/test/filesystemtests.py
Modified: cedar-backup2/trunk/CedarBackup2/filesystem.py
===================================================================
--- cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-03-21 03:04:24 UTC (rev 903)
+++ cedar-backup2/trunk/CedarBackup2/filesystem.py 2008-04-01 01:01:18 UTC (rev 904)
@@ -424,7 +424,8 @@
The linkDepth parameter controls whether soft links are followed when we
are adding the contents recursively. Any recursive calls reduce the
value by one. If the value zero or less, then soft links will just be
- added as directories, but will not be followed.
+ added as directories, but will not be followed. This means that links
+ are followed to a I{constant depth} starting from the top-most directory.
@param path: Directory path whose contents should be added to the list.
@param includePath: Indicates whether to include the path as well as contents.
@@ -463,7 +464,7 @@
if os.path.islink(entrypath):
if recursive and linkDepth > 0:
newDepth = linkDepth - 1;
- added += self._addDirContentsInternal(entrypath, linkDepth=newDepth)
+ added += self._addDirContentsInternal(entrypath, includePath=False, linkDepth=newDepth)
else:
added += self.addDir(entrypath)
else:
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-03-21 03:04:24 UTC (rev 903)
+++ cedar-backup2/trunk/Changelog 2008-04-01 01:01:18 UTC (rev 904)
@@ -4,6 +4,9 @@
* Updated user manual
- Brought copyright notices up-to-date
- Fixed various URLs that didn't reference SourceForge
+ * Fixed problem with link_depth (closes: #1930729).
+ - Can't add links directly, they're implicitly added later by tar
+ - Changed FilesystemList to use includePath=false for recursive links
Version 2.17.0 20 Mar 2008
Modified: cedar-backup2/trunk/test/filesystemtests.py
===================================================================
--- cedar-backup2/trunk/test/filesystemtests.py 2008-03-21 03:04:24 UTC (rev 903)
+++ cedar-backup2/trunk/test/filesystemtests.py 2008-04-01 01:01:18 UTC (rev 904)
@@ -4884,8 +4884,8 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(165, count)
- self.failUnlessEqual(165, len(fsList))
+ self.failUnlessEqual(164, count)
+ self.failUnlessEqual(164, len(fsList))
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -5017,7 +5017,6 @@
self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "dir002", ]) in fsList)
@@ -5185,8 +5184,8 @@
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
else:
- self.failUnlessEqual(247, count)
- self.failUnlessEqual(247, len(fsList))
+ self.failUnlessEqual(240, count)
+ self.failUnlessEqual(240, len(fsList))
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "dir001", "dir003", ]) in fsList)
@@ -5214,7 +5213,9 @@
self.failUnless(self.buildPath([ "tree6", "dir001", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "file003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "file004", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir001", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "dir003", ]) in fsList)
@@ -5229,9 +5230,6 @@
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir001", "link001", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir001", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir001", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "dir003", ]) in fsList)
@@ -5281,6 +5279,13 @@
self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "dir003", "link004", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "dir003", ]) in fsList)
@@ -5293,6 +5298,11 @@
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "file007", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "file008", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "file009", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "link003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "link004", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir002", "link002", "link005", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "file001", ]) in fsList)
@@ -5302,24 +5312,10 @@
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "file005", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "file006", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "file007", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "link005", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir002", "link005", "link004", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link004", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "dir001", "link005", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "file001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "file002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "file003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "link001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir002", "link004", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "dir001", "file001", ]) in fsList)
@@ -5346,6 +5342,20 @@
self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "dir002", "link004", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "file001", ]) in fsList)
@@ -5353,7 +5363,6 @@
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "file003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "file004", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "file005", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link001", "link003", ]) in fsList)
@@ -5369,25 +5378,8 @@
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", "file007", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", "file008", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", "file009", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "link004", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "dir003", "link004", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file004", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file005", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file006", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file007", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file008", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "file009", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "ignore", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "dir003", "link005", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "dir003", ]) in fsList)
@@ -5399,18 +5391,24 @@
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "file006", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "file007", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "ignore", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir001", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "file001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "file003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "dir002", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "link001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "file001", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "file002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "file003", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "file004", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "link002", ]) in fsList)
+ self.failUnless(self.buildPath([ "tree6", "link002", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "dir001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "dir002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "dir003", ]) in fsList)
@@ -5425,12 +5423,6 @@
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "link001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "link002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link002", "link001", "link003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "file001", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "file002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "file003", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "file004", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "link002", ]) in fsList)
- self.failUnless(self.buildPath([ "tree6", "link002", "link003", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "file001", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "file002", ]) in fsList)
self.failUnless(self.buildPath([ "tree6", "link001", ]) in fsList)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <pro...@us...> - 2008-03-21 03:04:40
|
Revision: 903
http://cedar-backup.svn.sourceforge.net/cedar-backup/?rev=903&view=rev
Author: pronovic
Date: 2008-03-20 20:04:24 -0700 (Thu, 20 Mar 2008)
Log Message:
-----------
Fix URLs to point to SF
Modified Paths:
--------------
cedar-backup2/trunk/Changelog
cedar-backup2/trunk/manual/src/config.xml
cedar-backup2/trunk/manual/src/install.xml
cedar-backup2/trunk/manual/src/intro.xml
Modified: cedar-backup2/trunk/Changelog
===================================================================
--- cedar-backup2/trunk/Changelog 2008-03-21 03:01:48 UTC (rev 902)
+++ cedar-backup2/trunk/Changelog 2008-03-21 03:04:24 UTC (rev 903)
@@ -1,6 +1,9 @@
Version 2.17.1 unreleased
- * Tweak various pieces of copyright information.
+ * Updated copyright statement slightly.
+ * Updated user manual
+ - Brought copyright notices up-to-date
+ - Fixed various URLs that didn't reference SourceForge
Version 2.17.0 20 Mar 2008
Modified: cedar-backup2/trunk/manual/src/config.xml
===================================================================
--- cedar-backup2/trunk/manual/src/config.xml 2008-03-21 03:01:48 UTC (rev 902)
+++ cedar-backup2/trunk/manual/src/config.xml 2008-03-21 03:04:24 UTC (rev 903)
@@ -3064,8 +3064,9 @@
<emphasis>If Cedar Backup ever completes <quote>normally</quote>
but the disc that is created is not usable, please report this as a
bug.
- <footnote id="cedar-config-foot-bugzilla"><para>
- See <ulink url="http://cedar-solutions.com/bugzilla/"/>.</para></footnote>
+ <footnote id="cedar-config-foot-bugs"><para>
+ See <quote>SF Bug Tracking</quote> at
+ <ulink url="http://cedar-backup.sourceforge.net/"/>.</para></footnote>
To be safe, always enable the consistency check option in the
store configuration section.</emphasis>
</para>
@@ -3957,7 +3958,7 @@
<emphasis>If Cedar Backup ever completes <quote>normally</quote>
but the disc that is created is not usable, please report this as a
bug.
- <footnoteref linkend="cedar-config-foot-bugzilla"/>
+ <footnoteref linkend="cedar-config-foot-bugs"/>
To be safe, always enable the consistency check option in the
store configuration section.</emphasis>
</para>
Modified: cedar-backup2/trunk/manual/src/install.xml
===================================================================
--- cedar-backup2/trunk/manual/src/install.xml 2008-03-21 03:01:48 UTC (rev 902)
+++ cedar-backup2/trunk/manual/src/install.xml 2008-03-21 03:04:24 UTC (rev 903)
@@ -7,7 +7,7 @@
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
-# Copyright (c) 2005-2007 Kenneth J. Pronovici.
+# Copyright (c) 2005-2008 Kenneth J. Pronovici.
# All rights reserved.
#
# This work is free; you can redistribute it and/or modify it
@@ -81,8 +81,8 @@
If you would like to use Cedar Backup on a non-Linux system, you
should install the Python source distribution along with all of the
indicated dependencies. Then, please report back to the Cedar
- Backup Users mailing list <footnote><para>See <ulink
- url="http://cedar-solutions.com/listarchives/"/>.</para></footnote>
+ Backup Users mailing list <footnote><para>See <quote>SF Mailing Lists</quote>
+ at <ulink url="http://cedar-backup.sourceforge.net/"/>.</para></footnote>
with information about your platform and any problems you
encountered.
</para>
@@ -110,7 +110,8 @@
Backup.) Otherwise, you need to install from the Cedar Solutions APT
data source. To do this, add the Cedar Solutions APT data source to
your <filename>/etc/apt/sources.list</filename> file. <footnote><para>See
- <ulink url="http://cedar-solutions.com/debian.html"/>.</para></footnote>
+ <quote>SF Bug Tracking</quote> at
+ <ulink url="http://cedar-backup.sourceforge.net/"/>.</para></footnote>
</para>
<para>
@@ -137,10 +138,10 @@
<para>
If you would prefer, you can also download the
<filename>.deb</filename> files and install them by hand with a tool
- such as <command>dpkg</command>. You can find a link to the
- <filename>.deb</filename> files on the Cedar Solutions website.
+ such as <command>dpkg</command>. You can find
+ these files files in the Cedar Solutions APT source.
<footnote id="cedar-install-foot-software"><para>See <ulink
- url="http://cedar-solutions.com/software.html"/>.</para></footnote>
+ url="http://cedar-solutions.com/debian.html"/>.</para></footnote>
</para>
<para>
Modified: cedar-backup2/trunk/manual/src/intro.xml
===================================================================
--- cedar-backup2/trunk/manual/src/intro.xml 2008-03-21 03:01:48 UTC (rev 902)
+++ cedar-backup2/trunk/manual/src/intro.xml 2008-03-21 03:04:24 UTC (rev 903)
@@ -131,8 +131,9 @@
<para>
If you experience a problem, your best bet is to write the Cedar
- Backup Users mailing list. <footnote><para>See <ulink
- url="http://cedar-solutions.com/listarchives/"/>.</para></footnote>
+ Backup Users mailing list. <footnote><para>See
+ <quote>SF Mailing Lists</quote> at
+ <ulink url="http://cedar-backup.sourceforge.net/"/>.</para></footnote>
This is a public list for all Cedar Backup users. If you write to
this list, you might get help from me, or from some other user who has
experienced the same thing you have.
@@ -142,8 +143,8 @@
If you know that the problem you have found constitutes a bug, or
if you would like to make an enhancement request, then feel free to
file a bug report in the Cedar Solutions Bug Tracking System.
- <footnote><para>See <ulink
- url="http://cedar-solutions.com/bugzilla/"/>.</para></footnote>
+ <footnote><para>See <quote>SF Bug Tracking</quote>
+ at <ulink url="http://cedar-backup.sourceforge.net/"/>.</para></footnote>
</para>
<para>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|