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;
}