]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
wiminfo: remove old --metadata option
[wimlib] / programs / imagex.c
index 656bb36a3e37dc559c16ba6e3cc0d8fb6dac0368..cc8d0e2073336cb8fa7957d786908861e26ad258 100644 (file)
@@ -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,8 +181,8 @@ enum {
        IMAGEX_RECOMPRESS_OPTION,
        IMAGEX_RECURSIVE_OPTION,
        IMAGEX_REF_OPTION,
-       IMAGEX_RESUME_OPTION,
        IMAGEX_RPFIX_OPTION,
+       IMAGEX_SNAPSHOT_OPTION,
        IMAGEX_SOFT_OPTION,
        IMAGEX_SOLID_CHUNK_SIZE_OPTION,
        IMAGEX_SOLID_COMPRESS_OPTION,
@@ -215,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},
@@ -229,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},
@@ -258,6 +250,7 @@ static const struct option capture_or_append_options[] = {
        {T("delta-from"),  required_argument, NULL, IMAGEX_DELTA_FROM_OPTION},
        {T("wimboot"),     no_argument,       NULL, IMAGEX_WIMBOOT_OPTION},
        {T("unsafe-compact"), no_argument,    NULL, IMAGEX_UNSAFE_COMPACT_OPTION},
+       {T("snapshot"),    no_argument,       NULL, IMAGEX_SNAPSHOT_OPTION},
        {NULL, 0, NULL, 0},
 };
 
@@ -283,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},
@@ -332,7 +321,6 @@ static const struct option info_options[] = {
        {T("header"),       no_argument,       NULL, IMAGEX_HEADER_OPTION},
        {T("lookup-table"), no_argument,       NULL, IMAGEX_BLOBS_OPTION},
        {T("blobs"),        no_argument,       NULL, IMAGEX_BLOBS_OPTION},
-       {T("metadata"),     no_argument,       NULL, IMAGEX_METADATA_OPTION},
        {T("xml"),          no_argument,       NULL, IMAGEX_XML_OPTION},
        {T("image-property"), required_argument, NULL, IMAGEX_IMAGE_PROPERTY_OPTION},
        {NULL, 0, NULL, 0},
@@ -360,15 +348,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},
@@ -516,9 +499,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;
@@ -541,15 +524,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;
@@ -591,16 +586,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;
@@ -1157,23 +1142,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,
@@ -1705,9 +1691,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;
@@ -1902,13 +1885,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)
@@ -1920,7 +1900,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;
@@ -2022,6 +2002,9 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
                        }
                        write_flags |= WIMLIB_WRITE_FLAG_UNSAFE_COMPACT;
                        break;
+               case IMAGEX_SNAPSHOT_OPTION:
+                       add_flags |= WIMLIB_ADD_FLAG_SNAPSHOT;
+                       break;
                default:
                        goto out_usage;
                }
@@ -2861,14 +2844,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;
@@ -2889,7 +2868,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;
@@ -3359,10 +3338,6 @@ imagex_info(int argc, tchar **argv, int cmd)
                        xml_out_file = optarg;
                        short_header = false;
                        break;
-               case IMAGEX_METADATA_OPTION:
-                       imagex_error(T("The --metadata option has been removed. "
-                                      "Use 'wimdir --detail' instead."));
-                       goto out_err;
                case IMAGEX_IMAGE_PROPERTY_OPTION:
                        ret = append_image_property_argument(&image_properties);
                        if (ret)
@@ -3775,14 +3750,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;
@@ -3797,7 +3768,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;
@@ -4383,7 +4354,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(
@@ -4401,6 +4372,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(
@@ -4511,7 +4483,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 <http://gnu.org/licenses/gpl.html>.\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"