mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 17:27:35 +00:00
Userland: Teach the file utility about zip files
It now shows a short description with a file and directory counts, and the total content size uncompressed.
This commit is contained in:
parent
729aae8437
commit
2c6b156803
4 changed files with 30 additions and 3 deletions
|
@ -512,7 +512,7 @@ if (BUILD_LAGOM)
|
||||||
if (NOT EMSCRIPTEN)
|
if (NOT EMSCRIPTEN)
|
||||||
# LibELF is part of LibC in SerenityOS builds, but not in Lagom.
|
# LibELF is part of LibC in SerenityOS builds, but not in Lagom.
|
||||||
add_executable(file ../../Userland/Utilities/file.cpp)
|
add_executable(file ../../Userland/Utilities/file.cpp)
|
||||||
target_link_libraries(file LibAudio LibCompress LibCore LibELF LibGfx LibIPC LibMain)
|
target_link_libraries(file LibAudio LibArchive LibCompress LibCore LibELF LibGfx LibIPC LibMain)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(gml-format ../../Userland/Utilities/gml-format.cpp)
|
add_executable(gml-format ../../Userland/Utilities/gml-format.cpp)
|
||||||
|
|
|
@ -41,7 +41,7 @@ set(utility_srcs
|
||||||
|
|
||||||
serenity_bin(BuggieBox)
|
serenity_bin(BuggieBox)
|
||||||
target_sources(BuggieBox PRIVATE main.cpp)
|
target_sources(BuggieBox PRIVATE main.cpp)
|
||||||
target_link_libraries(BuggieBox PRIVATE LibMain LibShell LibCompress LibCore LibCrypto LibFileSystem LibGfx LibLine LibRegex LibAudio)
|
target_link_libraries(BuggieBox PRIVATE LibMain LibShell LibArchive LibCompress LibCore LibCrypto LibFileSystem LibGfx LibLine LibRegex LibAudio)
|
||||||
|
|
||||||
foreach(file IN LISTS utility_srcs)
|
foreach(file IN LISTS utility_srcs)
|
||||||
buggiebox_utility(${file})
|
buggiebox_utility(${file})
|
||||||
|
|
|
@ -90,7 +90,7 @@ target_link_libraries(diff PRIVATE LibDiff)
|
||||||
target_link_libraries(disasm PRIVATE LibX86)
|
target_link_libraries(disasm PRIVATE LibX86)
|
||||||
target_link_libraries(expr PRIVATE LibRegex)
|
target_link_libraries(expr PRIVATE LibRegex)
|
||||||
target_link_libraries(fdtdump PRIVATE LibDeviceTree)
|
target_link_libraries(fdtdump PRIVATE LibDeviceTree)
|
||||||
target_link_libraries(file PRIVATE LibGfx LibIPC LibCompress LibAudio)
|
target_link_libraries(file PRIVATE LibGfx LibIPC LibArchive LibCompress LibAudio)
|
||||||
target_link_libraries(functrace PRIVATE LibDebug LibX86)
|
target_link_libraries(functrace PRIVATE LibDebug LibX86)
|
||||||
target_link_libraries(gml-format PRIVATE LibGUI)
|
target_link_libraries(gml-format PRIVATE LibGUI)
|
||||||
target_link_libraries(grep PRIVATE LibFileSystem LibRegex)
|
target_link_libraries(grep PRIVATE LibFileSystem LibRegex)
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <AK/NumberFormat.h>
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
#include <AK/Vector.h>
|
#include <AK/Vector.h>
|
||||||
|
#include <LibArchive/Zip.h>
|
||||||
#include <LibAudio/Loader.h>
|
#include <LibAudio/Loader.h>
|
||||||
#include <LibCompress/Gzip.h>
|
#include <LibCompress/Gzip.h>
|
||||||
#include <LibCore/ArgsParser.h>
|
#include <LibCore/ArgsParser.h>
|
||||||
|
@ -104,6 +106,30 @@ static ErrorOr<Optional<String>> gzip_details(StringView description, StringView
|
||||||
return TRY(String::formatted("{}, {}", description, gzip_details.value()));
|
return TRY(String::formatted("{}, {}", description, gzip_details.value()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ErrorOr<Optional<String>> zip_details(StringView description, StringView path)
|
||||||
|
{
|
||||||
|
auto mapped_file = TRY(Core::MappedFile::map(path));
|
||||||
|
auto zip_file = Archive::Zip::try_create(mapped_file->bytes());
|
||||||
|
u32 files = 0;
|
||||||
|
u32 directories = 0;
|
||||||
|
u64 total_bytes = 0;
|
||||||
|
TRY(zip_file->for_each_member([&](auto zip_member) -> ErrorOr<IterationDecision> {
|
||||||
|
if (zip_member.is_directory)
|
||||||
|
directories++;
|
||||||
|
else
|
||||||
|
files++;
|
||||||
|
total_bytes += zip_member.uncompressed_size;
|
||||||
|
return IterationDecision::Continue;
|
||||||
|
}));
|
||||||
|
return TRY(String::formatted("{}, {} {}, {} {} totaling {} uncompressed",
|
||||||
|
description,
|
||||||
|
directories,
|
||||||
|
directories == 1 ? "directory" : "directories",
|
||||||
|
files,
|
||||||
|
files == 1 ? "file" : "files",
|
||||||
|
AK::human_readable_size(total_bytes)));
|
||||||
|
}
|
||||||
|
|
||||||
static ErrorOr<Optional<String>> elf_details(StringView description, StringView path)
|
static ErrorOr<Optional<String>> elf_details(StringView description, StringView path)
|
||||||
{
|
{
|
||||||
auto mapped_file = TRY(Core::MappedFile::map(path));
|
auto mapped_file = TRY(Core::MappedFile::map(path));
|
||||||
|
@ -146,6 +172,7 @@ static ErrorOr<Optional<String>> elf_details(StringView description, StringView
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/tar"sv, "tape archive"sv, description_only) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/tar"sv, "tape archive"sv, description_only) \
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/wasm"sv, "WebAssembly bytecode"sv, description_only) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/wasm"sv, "WebAssembly bytecode"sv, description_only) \
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/x-7z-compressed"sv, "7-Zip archive"sv, description_only) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/x-7z-compressed"sv, "7-Zip archive"sv, description_only) \
|
||||||
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("application/zip"sv, "ZIP archive"sv, zip_details) \
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/flac"sv, "FLAC audio"sv, audio_details) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/flac"sv, "FLAC audio"sv, audio_details) \
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/midi"sv, "MIDI notes"sv, audio_details) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/midi"sv, "MIDI notes"sv, audio_details) \
|
||||||
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/mpeg"sv, "MP3 audio"sv, audio_details) \
|
__ENUMERATE_MIME_TYPE_DESCRIPTION("audio/mpeg"sv, "MP3 audio"sv, audio_details) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue