int extract()

in src/native/tools/extract/extract.cpp [221:287]


int extract(fs::path source_path, fs::path diff_path, std::string hash, size_t size, fs::path target_path)
{
	printf("Extract item with hash: %s\n", hash.c_str());
	printf("and length: %zu\n", size);
	printf("using source: %s\n", source_path.string().c_str());
	printf("and diff    :    %s\n", diff_path.string().c_str());
	printf("To folder   : %s\n", target_path.string().c_str());

	std::shared_ptr<diffs::core::kitchen> kitchen = diffs::core::kitchen::create();
	add_file_to_pantry(*kitchen, source_path);
	auto archive = load_diff(diff_path);
	archive->stock_kitchen(kitchen.get());

	diffs::core::item_definition item{size};
	std::vector<char> hash_data;
	if (!archive_diff::hashing::hexstring_to_data(hash, hash_data))
	{
		printf("Couldn't convert hash: %s into data.\n", hash.c_str());
		return 1;
	}
	std::string_view hash_view{hash_data.data(), hash_data.size()};
	auto hash_value =
		archive_diff::hashing::hash::import_hash_value(archive_diff::hashing::algorithm::sha256, hash_view);
	item = item.with_hash(hash_value);
	printf("Item: %s\n", item.to_string().c_str());

	kitchen->request_item(item);

	if (!kitchen->process_requested_items())
	{
		printf("Failed to process requested items\n");
		return 1;
	}

	kitchen->resume_slicing();

	auto prepared_item = kitchen->fetch_item(item);
	fs::create_directories(target_path);
	auto item_path                     = target_path / hash;
	std::shared_ptr<io::writer> writer = std::make_shared<io::file::binary_file_writer>(item_path.string());
	prepared_item->write(writer);

	prepared_item.reset();
	writer.reset();

	auto reader   = io::file::io_device::make_reader(item_path.string());
	auto new_item = diffs::core::create_definition_from_reader(reader);

	kitchen->cancel_slicing();

	if (!item.equals(new_item))
	{
		printf(
			"Extracted item at %s is incorrect.\n\tExpected: %s\n\tActual: %s\n",
			item_path.string().c_str(),
			item.to_string().c_str(),
			new_item.to_string().c_str());

		auto dependencies = get_dependencies(*archive, item);
		extract_items(*kitchen.get(), *archive, dependencies, target_path);
		printf("Done examining dependencies.\n");
		return 1;
	}
	printf("Ok.\n");

	return 0;
}