X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=programs%2Fimagex.c;h=b6f1c17383e2831eceddff6b9c9d04db31276c63;hp=632adfbbb3a586e34e220a8c89f1f39c2d2c754c;hb=6cc6cd848ea2382971ae5bcf1ef8dc655e2bc64f;hpb=8b676e7d340fb8197824745eb387e1d3154e6f60 diff --git a/programs/imagex.c b/programs/imagex.c index 632adfbb..b6f1c173 100644 --- a/programs/imagex.c +++ b/programs/imagex.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers + * Copyright (C) 2012-2016 Eric Biggers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -149,7 +149,6 @@ enum { IMAGEX_COMMIT_OPTION, IMAGEX_COMPACT_OPTION, IMAGEX_COMPRESS_OPTION, - IMAGEX_COMPRESS_SLOW_OPTION, IMAGEX_CONFIG_OPTION, IMAGEX_DEBUG_OPTION, IMAGEX_DELTA_FROM_OPTION, @@ -182,7 +181,6 @@ enum { IMAGEX_RECOMPRESS_OPTION, IMAGEX_RECURSIVE_OPTION, IMAGEX_REF_OPTION, - IMAGEX_RESUME_OPTION, IMAGEX_RPFIX_OPTION, IMAGEX_SNAPSHOT_OPTION, IMAGEX_SOFT_OPTION, @@ -216,9 +214,6 @@ static const struct option apply_options[] = { {T("rpfix"), no_argument, NULL, IMAGEX_RPFIX_OPTION}, {T("norpfix"), no_argument, NULL, IMAGEX_NORPFIX_OPTION}, {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION}, - - /* --resume is undocumented for now as it needs improvement. */ - {T("resume"), no_argument, NULL, IMAGEX_RESUME_OPTION}, {T("wimboot"), no_argument, NULL, IMAGEX_WIMBOOT_OPTION}, {T("compact"), required_argument, NULL, IMAGEX_COMPACT_OPTION}, {NULL, 0, NULL, 0}, @@ -230,14 +225,10 @@ static const struct option capture_or_append_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("nocheck"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, - {T("pack-streams"), no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("config"), required_argument, NULL, IMAGEX_CONFIG_OPTION}, {T("dereference"), no_argument, NULL, IMAGEX_DEREFERENCE_OPTION}, @@ -285,14 +276,10 @@ static const struct option export_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, - {T("pack-streams"),no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("ref"), required_argument, NULL, IMAGEX_REF_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, @@ -362,15 +349,10 @@ static const struct option optimize_options[] = { {T("no-check"), no_argument, NULL, IMAGEX_NOCHECK_OPTION}, {T("compress"), required_argument, NULL, IMAGEX_COMPRESS_OPTION}, {T("recompress"), no_argument, NULL, IMAGEX_RECOMPRESS_OPTION}, - {T("compress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, - {T("recompress-slow"), no_argument, NULL, IMAGEX_COMPRESS_SLOW_OPTION}, {T("chunk-size"), required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION}, {T("solid"), no_argument, NULL, IMAGEX_SOLID_OPTION}, - {T("pack-streams"),no_argument, NULL, IMAGEX_SOLID_OPTION}, {T("solid-compress"),required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, - {T("pack-compress"), required_argument, NULL, IMAGEX_SOLID_COMPRESS_OPTION}, {T("solid-chunk-size"),required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, - {T("pack-chunk-size"), required_argument, NULL, IMAGEX_SOLID_CHUNK_SIZE_OPTION}, {T("no-solid-sort"), no_argument, NULL, IMAGEX_NO_SOLID_SORT_OPTION}, {T("threads"), required_argument, NULL, IMAGEX_THREADS_OPTION}, {T("pipable"), no_argument, NULL, IMAGEX_PIPABLE_OPTION}, @@ -518,9 +500,9 @@ print_available_compression_types(FILE *fp) tfputs(s, fp); } -/* Parse the argument to --compress */ +/* Parse the argument to --compress or --solid-compress */ static int -get_compression_type(tchar *optarg) +get_compression_type(tchar *optarg, bool solid) { int ctype; unsigned int compression_level = 0; @@ -543,15 +525,27 @@ get_compression_type(tchar *optarg) if (!tstrcasecmp(optarg, T("maximum")) || !tstrcasecmp(optarg, T("lzx")) || - !tstrcasecmp(optarg, T("max"))) + !tstrcasecmp(optarg, T("max"))) { ctype = WIMLIB_COMPRESSION_TYPE_LZX; - else if (!tstrcasecmp(optarg, T("fast")) || !tstrcasecmp(optarg, T("xpress"))) + } else if (!tstrcasecmp(optarg, T("fast")) || !tstrcasecmp(optarg, T("xpress"))) { ctype = WIMLIB_COMPRESSION_TYPE_XPRESS; - else if (!tstrcasecmp(optarg, T("recovery")) || !tstrcasecmp(optarg, T("lzms"))) + } else if (!tstrcasecmp(optarg, T("recovery"))) { + if (!solid) { + tfprintf(stderr, +T( +"Warning: use of '--compress=recovery' is discouraged because it behaves\n" +" differently from DISM. Instead, you typically want to use '--solid' to\n" +" create a solid LZMS-compressed WIM or \"ESD file\", similar to DISM's\n" +" /compress:recovery. But if you really want *non-solid* LZMS compression,\n" +" then you may suppress this warning by specifying '--compress=lzms' instead\n" +" of '--compress=recovery'.\n")); + } + ctype = WIMLIB_COMPRESSION_TYPE_LZMS; + } else if (!tstrcasecmp(optarg, T("lzms"))) { ctype = WIMLIB_COMPRESSION_TYPE_LZMS; - else if (!tstrcasecmp(optarg, T("none"))) + } else if (!tstrcasecmp(optarg, T("none"))) { ctype = WIMLIB_COMPRESSION_TYPE_NONE; - else { + } else { imagex_error(T("Invalid compression type \"%"TS"\"!"), optarg); print_available_compression_types(stderr); return WIMLIB_COMPRESSION_TYPE_INVALID; @@ -593,16 +587,6 @@ set_compact_mode(const tchar *arg, int *extract_flags) } -static void -set_compress_slow(void) -{ -#if 0 - fprintf(stderr, "WARNING: the '--compress-slow' option is deprecated.\n" - " Use the '--compress=TYPE:LEVEL' option instead.\n"); -#endif - wimlib_set_default_compression_level(-1, 100); -} - struct string_set { tchar **strings; unsigned num_strings; @@ -1159,23 +1143,24 @@ imagex_progress_func(enum wimlib_progress_msg msg, switch (msg) { case WIMLIB_PROGRESS_MSG_WRITE_STREAMS: { - static bool first = true; - if (first) { - imagex_printf(T("Writing %"TS"-compressed data " - "using %u thread%"TS"\n"), - wimlib_get_compression_type_string( - info->write_streams.compression_type), - info->write_streams.num_threads, - (info->write_streams.num_threads == 1) ? T("") : T("s")); - first = false; + static bool started; + if (!started) { + if (info->write_streams.compression_type != WIMLIB_COMPRESSION_TYPE_NONE) { + imagex_printf(T("Using %"TS" compression " + "with %u thread%"TS"\n"), + wimlib_get_compression_type_string( + info->write_streams.compression_type), + info->write_streams.num_threads, + (info->write_streams.num_threads == 1) ? T("") : T("s")); + } + started = true; } } unit_shift = get_unit(info->write_streams.total_bytes, &unit_name); percent_done = TO_PERCENT(info->write_streams.completed_bytes, info->write_streams.total_bytes); - imagex_printf(T("\r%"PRIu64" %"TS" of %"PRIu64" %"TS" (uncompressed) " - "written (%u%% done)"), + imagex_printf(T("\rArchiving file data: %"PRIu64" %"TS" of %"PRIu64" %"TS" (%u%%) done"), info->write_streams.completed_bytes >> unit_shift, unit_name, info->write_streams.total_bytes >> unit_shift, @@ -1707,9 +1692,6 @@ imagex_apply(int argc, tchar **argv, int cmd) extract_flags |= WIMLIB_EXTRACT_FLAG_REPLACE_INVALID_FILENAMES; extract_flags |= WIMLIB_EXTRACT_FLAG_ALL_CASE_CONFLICTS; break; - case IMAGEX_RESUME_OPTION: - extract_flags |= WIMLIB_EXTRACT_FLAG_RESUME; - break; case IMAGEX_WIMBOOT_OPTION: extract_flags |= WIMLIB_EXTRACT_FLAG_WIMBOOT; break; @@ -1904,13 +1886,10 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) add_flags &= ~WIMLIB_ADD_FLAG_WINCONFIG; break; case IMAGEX_COMPRESS_OPTION: - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - break; case IMAGEX_CHUNK_SIZE_OPTION: chunk_size = parse_chunk_size(optarg); if (chunk_size == UINT32_MAX) @@ -1922,7 +1901,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; @@ -2866,14 +2845,10 @@ imagex_export(int argc, tchar **argv, int cmd) write_flags |= WIMLIB_WRITE_FLAG_NO_CHECK_INTEGRITY; break; case IMAGEX_COMPRESS_OPTION: - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - break; case IMAGEX_RECOMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; break; @@ -2894,7 +2869,7 @@ imagex_export(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; @@ -3780,14 +3755,10 @@ imagex_optimize(int argc, tchar **argv, int cmd) break; case IMAGEX_COMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - compression_type = get_compression_type(optarg); + compression_type = get_compression_type(optarg, false); if (compression_type == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; - case IMAGEX_COMPRESS_SLOW_OPTION: - set_compress_slow(); - write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; - break; case IMAGEX_RECOMPRESS_OPTION: write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS; break; @@ -3802,7 +3773,7 @@ imagex_optimize(int argc, tchar **argv, int cmd) goto out_err; break; case IMAGEX_SOLID_COMPRESS_OPTION: - solid_ctype = get_compression_type(optarg); + solid_ctype = get_compression_type(optarg, true); if (solid_ctype == WIMLIB_COMPRESSION_TYPE_INVALID) goto out_err; break; @@ -4388,7 +4359,7 @@ T( " [--boot] [--check] [--nocheck] [--config=FILE]\n" " [--threads=NUM_THREADS] [--no-acls] [--strict-acls]\n" " [--rpfix] [--norpfix] [--update-of=[WIMFILE:]IMAGE]\n" -" [--wimboot] [--unix-data] [--dereference]\n" +" [--wimboot] [--unix-data] [--dereference] [--snapshot]\n" ), [CMD_APPLY] = T( @@ -4406,6 +4377,7 @@ T( " [--no-acls] [--strict-acls] [--rpfix] [--norpfix]\n" " [--update-of=[WIMFILE:]IMAGE] [--delta-from=WIMFILE]\n" " [--wimboot] [--unix-data] [--dereference] [--solid]\n" +" [--snapshot]\n" ), [CMD_DELETE] = T( @@ -4516,7 +4488,7 @@ version(void) static const tchar *s = T( "wimlib-imagex (distributed with " PACKAGE " " PACKAGE_VERSION ")\n" -"Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers\n" +"Copyright (C) 2012-2016 Eric Biggers\n" "License GPLv3+; GNU GPL version 3 or later .\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"