def test_set_permissions(self): ''' Test that set_permissions sets permissions for all files in a directory. ''' # This test will NOT work if the r and w bits for the user are not on! # If r is 0, stat will fail. If w is 0, tearDown will fail post the test. permissions = 0o723 path_util.set_permissions(self.bundle_path, permissions) for path in self.bundle_directories + self.bundle_files: self.assertEqual(stat.S_IMODE(os.lstat(path).st_mode), permissions)
def upload(self, path, allow_symlinks=False): ''' Copy the contents of the directory at path into the data subdirectory, in a subfolder named by a hash of the contents of the new data directory. Return a (data_hash, metadata) pair, where the metadata is a dict mapping keys to precomputed statistics about the new data directory. ''' absolute_path = path_util.normalize(path) path_util.check_isvalid(absolute_path, 'upload') # Recursively copy the directory into a new BundleStore temp directory. temp_directory = uuid.uuid4().hex temp_path = os.path.join(self.temp, temp_directory) path_util.copy(absolute_path, temp_path) # Multiplex between uploading a directory and uploading a file here. # All other path_util calls will use these lists of directories and files. if os.path.isdir(temp_path): dirs_and_files = path_util.recursive_ls(temp_path) else: dirs_and_files = ([], [temp_path]) if not allow_symlinks: path_util.check_for_symlinks(temp_path, dirs_and_files) path_util.set_permissions(temp_path, 0o755, dirs_and_files) # Hash the contents of the temporary directory, and then if there is no # data with this hash value, move this directory into the data directory. data_hash = '0x%s' % (path_util.hash_directory(temp_path, dirs_and_files),) data_size = path_util.get_size(temp_path, dirs_and_files) final_path = os.path.join(self.data, data_hash) final_path_exists = False try: os.utime(final_path, None) final_path_exists = True except OSError, e: if e.errno == errno.ENOENT: os.rename(temp_path, final_path) else: raise