def test_check_for_symlinks(self): ''' Test that check_for_symlinks raises a ValueError iff there is a symlink underneat the given path. ''' path_util.check_for_symlinks(self.bundle_path) link_target = '../some/random/thing/to/symlink/to' symlink_path = os.path.join(self.bundle_directories[-1], 'my_symlink') os.symlink(link_target, symlink_path) self.assertRaises( ValueError, lambda: path_util.check_for_symlinks(self.bundle_path), )
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