Rev 5414: Implement osutils.available_backup_name. in file:///home/vila/src/bzr/bugs/323111-orphans/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Sep 9 10:27:33 BST 2010


At file:///home/vila/src/bzr/bugs/323111-orphans/

------------------------------------------------------------
revno: 5414
revision-id: v.ladeuil+lp at free.fr-20100909092733-yn70gnd11vfwyp30
parent: v.ladeuil+lp at free.fr-20100907130555-6ocpql16nzjr4808
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: backup-names
timestamp: Thu 2010-09-09 11:27:33 +0200
message:
  Implement osutils.available_backup_name.
-------------- next part --------------
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py	2010-08-24 12:36:53 +0000
+++ b/bzrlib/osutils.py	2010-09-09 09:27:33 +0000
@@ -2354,3 +2354,19 @@
         raise errors.BzrError("Can't decode username as %s." % \
                 user_encoding)
     return username
+
+
+def available_backup_name(base, exists):
+    """Find a non-existing backup file name.
+
+    This will *not* create anything, this only return a 'free' entry.
+
+    :param base: The base name.
+    :param exists: A callable returning True if the passed path exists.
+    """
+    counter = 1
+    name = "%s.~%d~" % (base, counter)
+    while exists(name):
+        counter += 1
+        name = "%s.~%d~" % (base, counter)
+    return name

=== modified file 'bzrlib/tests/test_osutils.py'
--- a/bzrlib/tests/test_osutils.py	2010-07-08 09:11:44 +0000
+++ b/bzrlib/tests/test_osutils.py	2010-09-09 09:27:33 +0000
@@ -2078,3 +2078,32 @@
         ue = osutils.get_user_encoding()
         osutils.set_or_unset_env('LOGNAME', u'jrandom\xb6'.encode(ue))
         self.assertEqual(u'jrandom\xb6', osutils.getuser_unicode())
+
+class TestBackupNames(tests.TestCase):
+
+    def setUp(self):
+        super(TestBackupNames, self).setUp()
+        self.backups = []
+
+    def backup_exists(self, name):
+        return name in self.backups
+
+    def available_backup_name(self, name):
+        backup_name = osutils.available_backup_name(name, self.backup_exists)
+        self.backups.append(backup_name)
+        return backup_name
+
+    def assertBackupName(self, expected, name):
+        self.assertEqual(expected, self.available_backup_name(name))
+
+    def test_empty(self):
+        self.assertBackupName('file.~1~', 'file')
+
+    def test_existing(self):
+        self.available_backup_name('file')
+        self.available_backup_name('file')
+        self.assertBackupName('file.~3~', 'file')
+        # Empty slots are found, this is not a strict requirement and may be
+        # revisited if we test against all implementations.
+        self.backups.remove('file.~2~')
+        self.assertBackupName('file.~2~', 'file')



More information about the bazaar-commits mailing list