summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@iki.fi>2007-08-01 04:00:37 +0300
committerLars Wirzenius <liw@iki.fi>2007-08-01 04:00:37 +0300
commita07d968d2d66ced014664a6b3d6c4a807e78938e (patch)
tree091182c91860354bfe9bf863f7db0bf4cbf2fc65
parentff2c0a660e30060c1c032f5d2dc3d3fa7c4e311e (diff)
parentcbf569483cba08efb4f2d939f64b1ef439bf8b80 (diff)
downloadgenbackupdata-a07d968d2d66ced014664a6b3d6c4a807e78938e.tar.gz
Merged from temporary branch.
-rw-r--r--genbackupdata.py50
-rwxr-xr-xtests.py39
2 files changed, 29 insertions, 60 deletions
diff --git a/genbackupdata.py b/genbackupdata.py
index ecc82de..c9019e6 100644
--- a/genbackupdata.py
+++ b/genbackupdata.py
@@ -68,6 +68,8 @@ class BackupData:
self._preexisting_file_count = 0
self._preexisting_data_size = 0
self._filename_counter = 0
+ self._current_dir_no = 0
+ self._next_filecount = 0
def set_directory(self, dirname):
"""Set the directory to be operated on
@@ -197,34 +199,21 @@ class BackupData:
self.set_preexisting_file_count(count)
self.set_preexisting_data_size(size)
- def _files_in_directory(self, dirname):
- """Return number of non-directory files in a directory
-
- This returns 0 if the directory doesn't exist, or there's another
- error with os.listdir or otherwise.
-
- """
-
- try:
- names = os.listdir(dirname)
- names = [os.path.join(dirname, x) for x in names]
- files = [x for x in names if not os.path.isdir(x)]
- return len(files)
- except os.error:
- return 0
-
def _choose_directory(self):
"""Choose directory in which to create the next file"""
- max = self.get_max_files_per_directory()
- if self._files_in_directory(self._dirname) < max:
- return self._dirname
- i = 0
+
while True:
- dirname = os.path.join(self._dirname, "dir%d" % i)
- if self._files_in_directory(dirname) < max:
- return dirname
- i += 1
-
+ dirname = os.path.join(self._dirname,
+ "dir%d" % self._current_dir_no)
+ if not os.path.exists(dirname):
+ self._next_filecount = 0
+ break
+ if (self._next_filecount > 0 and
+ self._next_filecount < self._max_files_per_directory):
+ break
+ self._current_dir_no += 1
+ return dirname
+
def next_filename(self):
"""Choose the name of the next filename
@@ -237,11 +226,13 @@ class BackupData:
but it is probably a bad idea for external code to rely on this.
"""
+
dirname = self._choose_directory()
while True:
filename = os.path.join(dirname,
"file%d" % self._filename_counter)
if not os.path.exists(filename):
+ self._next_filecount += 1
return filename
self._filename_counter += 1
@@ -281,7 +272,6 @@ class BackupData:
return "".join(chunks)
-
def create_subdirectories(self, filename):
"""Create the sub-directories that are needed to create filename"""
subdir = os.path.dirname(filename)
@@ -361,13 +351,17 @@ class BackupData:
"""Rename COUNT files to new names"""
if os.path.exists(self._dirname):
for file in self.choose_files_randomly(count):
- os.rename(file, self.next_filename())
+ new_file = self.next_filename()
+ self.create_subdirectories(new_file)
+ os.rename(file, new_file)
def link_files(self, count):
"""Create COUNT new filenames that are hard links to existing files"""
if os.path.exists(self._dirname):
for file in self.choose_files_randomly(count):
- os.link(file, self.next_filename())
+ new_file = self.next_filename()
+ self.create_subdirectories(new_file)
+ os.link(file, new_file)
def get_modify_percentage(self):
"""Return how many percent to grow each file with modify_files()"""
diff --git a/tests.py b/tests.py
index f72f9ce..5d623a1 100755
--- a/tests.py
+++ b/tests.py
@@ -177,7 +177,7 @@ class BackupDataTests(unittest.TestCase):
def testChoosesFirstFilenameCorrectly(self):
filename = self.bd.next_filename()
- self.failUnlessEqual(filename, os.path.join(self.dirname, "file0"))
+ self.failUnless(filename.startswith(self.dirname))
def testChoosesFirstFilenameCorrectlyTwice(self):
filename1 = self.bd.next_filename()
@@ -190,47 +190,22 @@ class BackupDataTests(unittest.TestCase):
self.create(filename1, "")
filename2 = self.bd.next_filename()
self.failIfEqual(filename1, filename2)
- self.failUnlessEqual(filename2, os.path.join(self.dirname, "file1"))
- def testChoosesRootWhenItDoesNotExist(self):
- self.failUnlessEqual(self.dirname, self.bd._choose_directory())
-
- def testChoosesRootWhenItIsEmpty(self):
- self.bd.create_directory()
- self.failUnlessEqual(self.dirname, self.bd._choose_directory())
-
- def testChoosesRootDirectoryUntilMaxFileLimitIsReached(self):
- self.bd.set_max_files_per_directory(10) # For speed
- self.bd.create_directory()
- for i in range(self.bd.get_max_files_per_directory()):
- self.failUnlessEqual(self.bd._choose_directory(), self.dirname)
- self.create(self.bd.next_filename(), "")
-
- def testChoosesSubdirectoryWhenMaxFileLimitIsReached(self):
+ def testChoosesSameDirectoryUntilMaxFileLimitIsReached(self):
self.bd.set_max_files_per_directory(10) # For speed
self.bd.create_directory()
+ chosen = self.bd._choose_directory()
for i in range(self.bd.get_max_files_per_directory()):
+ self.failUnlessEqual(self.bd._choose_directory(), chosen)
self.create(self.bd.next_filename(), "")
- self.failUnlessEqual(self.bd._choose_directory(),
- os.path.join(self.dirname, "dir0"))
- def testChoosesFirstSubdirectoryUntilMaxFileLimitIsReached(self):
+ def testChoosesNewDirectoryWhenMaxFileLimitIsReached(self):
self.bd.set_max_files_per_directory(10) # For speed
self.bd.create_directory()
+ chosen = self.bd._choose_directory()
for i in range(self.bd.get_max_files_per_directory()):
self.create(self.bd.next_filename(), "")
- for i in range(self.bd.get_max_files_per_directory()):
- self.failUnlessEqual(self.bd._choose_directory(),
- os.path.join(self.dirname, "dir0"))
- self.create(self.bd.next_filename(), "")
-
- def testChoosesSecondSubdirectoryWhenFirstOneFillsUp(self):
- self.bd.set_max_files_per_directory(10) # For speed
- self.bd.create_directory()
- for i in range(2 * self.bd.get_max_files_per_directory()):
- self.create(self.bd.next_filename(), "")
- self.failUnlessEqual(self.bd._choose_directory(),
- os.path.join(self.dirname, "dir1"))
+ self.failIfEqual(self.bd._choose_directory(), chosen)
def testGeneratesSmallAmountOfTextDataCorrectly(self):
n = 128