diff options
author | Lars Wirzenius <liw@iki.fi> | 2007-08-01 04:00:37 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@iki.fi> | 2007-08-01 04:00:37 +0300 |
commit | a07d968d2d66ced014664a6b3d6c4a807e78938e (patch) | |
tree | 091182c91860354bfe9bf863f7db0bf4cbf2fc65 | |
parent | ff2c0a660e30060c1c032f5d2dc3d3fa7c4e311e (diff) | |
parent | cbf569483cba08efb4f2d939f64b1ef439bf8b80 (diff) | |
download | genbackupdata-a07d968d2d66ced014664a6b3d6c4a807e78938e.tar.gz |
Merged from temporary branch.
-rw-r--r-- | genbackupdata.py | 50 | ||||
-rwxr-xr-x | tests.py | 39 |
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()""" @@ -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 |