]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
wimupdate: Add --no-replace default option
[wimlib] / programs / imagex.c
index 753206d55ecacd917fad6ffa1eae92efc3e364de..c3a08e8e1ff08f6e4f1e26a70afdab2b2032edbb 100644 (file)
@@ -173,10 +173,12 @@ enum {
        IMAGEX_NOT_PIPABLE_OPTION,
        IMAGEX_NO_ACLS_OPTION,
        IMAGEX_NO_ATTRIBUTES_OPTION,
+       IMAGEX_NO_REPLACE_OPTION,
        IMAGEX_NO_WILDCARDS_OPTION,
        IMAGEX_NULLGLOB_OPTION,
        IMAGEX_ONE_FILE_ONLY_OPTION,
        IMAGEX_PACK_CHUNK_SIZE_OPTION,
+       IMAGEX_PACK_COMPRESS_OPTION,
        IMAGEX_PACK_STREAMS_OPTION,
        IMAGEX_PATH_OPTION,
        IMAGEX_PIPABLE_OPTION,
@@ -233,6 +235,8 @@ static const struct option capture_or_append_options[] = {
        {T("chunk-size"),  required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION},
        {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
        {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
+       {T("pack-compress"), required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
+       {T("solid-compress"),required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
        {T("pack-streams"), no_argument,      NULL, IMAGEX_PACK_STREAMS_OPTION},
        {T("solid"),       no_argument,      NULL, IMAGEX_PACK_STREAMS_OPTION},
        {T("config"),      required_argument, NULL, IMAGEX_CONFIG_OPTION},
@@ -281,6 +285,8 @@ static const struct option export_options[] = {
        {T("chunk-size"),  required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION},
        {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
        {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
+       {T("pack-compress"), required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
+       {T("solid-compress"),required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
        {T("ref"),         required_argument, NULL, IMAGEX_REF_OPTION},
        {T("threads"),     required_argument, NULL, IMAGEX_THREADS_OPTION},
        {T("rebuild"),     no_argument,       NULL, IMAGEX_REBUILD_OPTION},
@@ -348,6 +354,8 @@ static const struct option optimize_options[] = {
        {T("chunk-size"),  required_argument, NULL, IMAGEX_CHUNK_SIZE_OPTION},
        {T("pack-chunk-size"), required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
        {T("solid-chunk-size"),required_argument, NULL, IMAGEX_PACK_CHUNK_SIZE_OPTION},
+       {T("pack-compress"), required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
+       {T("solid-compress"),required_argument, NULL, IMAGEX_PACK_COMPRESS_OPTION},
        {T("pack-streams"),no_argument,       NULL, IMAGEX_PACK_STREAMS_OPTION},
        {T("solid"),       no_argument,       NULL, IMAGEX_PACK_STREAMS_OPTION},
        {T("threads"),     required_argument, NULL, IMAGEX_THREADS_OPTION},
@@ -394,6 +402,7 @@ static const struct option update_options[] = {
        {T("noacls"),      no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("no-acls"),     no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
        {T("strict-acls"), no_argument,       NULL, IMAGEX_STRICT_ACLS_OPTION},
+       {T("no-replace"),  no_argument,       NULL, IMAGEX_NO_REPLACE_OPTION},
 
        {NULL, 0, NULL, 0},
 };
@@ -1228,6 +1237,10 @@ imagex_progress_func(enum wimlib_progress_msg msg,
                        break;
                }
                break;
+       case WIMLIB_PROGRESS_MSG_REPLACE_FILE_IN_WIM:
+               imagex_printf(T("Updating \"%"TS"\" in WIM image\n"),
+                             info->replace.path_in_wim);
+               break;
        default:
                break;
        }
@@ -1291,6 +1304,8 @@ update_command_add_option(int op, const tchar *option,
                        cmd->add.add_flags |= WIMLIB_ADD_FLAG_STRICT_ACLS;
                else if (!tstrcmp(option, T("--dereference")))
                        cmd->add.add_flags |= WIMLIB_ADD_FLAG_DEREFERENCE;
+               else if (!tstrcmp(option, T("--no-replace")))
+                       cmd->add.add_flags |= WIMLIB_ADD_FLAG_NO_REPLACE;
                else
                        recognized = false;
                break;
@@ -1469,7 +1484,7 @@ parse_update_command_file(tchar **cmd_file_contents_p, size_t cmd_file_nchars,
        return cmds;
 }
 
-/* Apply one image, or all images, from a WIM file into a directory, OR apply
+/* Apply one image, or all images, from a WIM file to a directory, OR apply
  * one image from a WIM file to a NTFS volume.  */
 static int
 imagex_apply(int argc, tchar **argv, int cmd)
@@ -1668,6 +1683,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
        int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID;
        uint32_t chunk_size = UINT32_MAX;
        uint32_t pack_chunk_size = UINT32_MAX;
+       int pack_ctype = WIMLIB_COMPRESSION_TYPE_INVALID;
        const tchar *wimfile;
        int wim_fd;
        const tchar *name;
@@ -1734,6 +1750,11 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
                        if (pack_chunk_size == UINT32_MAX)
                                goto out_err;
                        break;
+               case IMAGEX_PACK_COMPRESS_OPTION:
+                       pack_ctype = get_compression_type(optarg);
+                       if (pack_ctype == WIMLIB_COMPRESSION_TYPE_INVALID)
+                               goto out_err;
+                       break;
                case IMAGEX_PACK_STREAMS_OPTION:
                        write_flags |= WIMLIB_WRITE_FLAG_PACK_STREAMS;
                        break;
@@ -1832,7 +1853,7 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
                        compression_type = WIMLIB_COMPRESSION_TYPE_XPRESS;
                } else {
                        compression_type = WIMLIB_COMPRESSION_TYPE_LZX;
-                       if (!compress_slow) {
+                       if (!compress_slow && pack_ctype != WIMLIB_COMPRESSION_TYPE_LZX) {
                                struct wimlib_lzx_compressor_params params = {
                                        .hdr.size = sizeof(params),
                                        .algorithm = WIMLIB_LZX_ALGORITHM_FAST,
@@ -1842,7 +1863,6 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
                                                                     &params.hdr);
                        }
                }
-
        }
 
        if (compress_slow)
@@ -1972,6 +1992,11 @@ imagex_capture_or_append(int argc, tchar **argv, int cmd)
                if (ret)
                        goto out_free_wim;
        }
+       if (pack_ctype != WIMLIB_COMPRESSION_TYPE_INVALID) {
+               ret = wimlib_set_output_pack_compression_type(wim, pack_ctype);
+               if (ret)
+                       goto out_free_wim;
+       }
        if (pack_chunk_size != UINT32_MAX) {
                ret = wimlib_set_output_pack_chunk_size(wim, pack_chunk_size);
                if (ret)
@@ -2568,6 +2593,7 @@ imagex_export(int argc, tchar **argv, int cmd)
        unsigned num_threads = 0;
        uint32_t chunk_size = UINT32_MAX;
        uint32_t pack_chunk_size = UINT32_MAX;
+       int pack_ctype = WIMLIB_COMPRESSION_TYPE_INVALID;
 
        for_opt(c, export_options) {
                switch (c) {
@@ -2603,6 +2629,11 @@ imagex_export(int argc, tchar **argv, int cmd)
                        if (pack_chunk_size == UINT32_MAX)
                                goto out_err;
                        break;
+               case IMAGEX_PACK_COMPRESS_OPTION:
+                       pack_ctype = get_compression_type(optarg);
+                       if (pack_ctype == WIMLIB_COMPRESSION_TYPE_INVALID)
+                               goto out_err;
+                       break;
                case IMAGEX_REF_OPTION:
                        ret = string_set_append(&refglobs, optarg);
                        if (ret)
@@ -2732,6 +2763,11 @@ imagex_export(int argc, tchar **argv, int cmd)
                if (ret)
                        goto out_free_dest_wim;
        }
+       if (pack_ctype != WIMLIB_COMPRESSION_TYPE_INVALID) {
+               ret = wimlib_set_output_pack_compression_type(dest_wim, pack_ctype);
+               if (ret)
+                       goto out_free_dest_wim;
+       }
        if (pack_chunk_size != UINT32_MAX) {
                ret = wimlib_set_output_pack_chunk_size(dest_wim, pack_chunk_size);
                if (ret)
@@ -3408,6 +3444,7 @@ imagex_optimize(int argc, tchar **argv, int cmd)
        int compression_type = WIMLIB_COMPRESSION_TYPE_INVALID;
        uint32_t chunk_size = UINT32_MAX;
        uint32_t pack_chunk_size = UINT32_MAX;
+       int pack_ctype = WIMLIB_COMPRESSION_TYPE_INVALID;
        int ret;
        WIMStruct *wim;
        const tchar *wimfile;
@@ -3447,6 +3484,11 @@ imagex_optimize(int argc, tchar **argv, int cmd)
                        if (pack_chunk_size == UINT32_MAX)
                                goto out_err;
                        break;
+               case IMAGEX_PACK_COMPRESS_OPTION:
+                       pack_ctype = get_compression_type(optarg);
+                       if (pack_ctype == WIMLIB_COMPRESSION_TYPE_INVALID)
+                               goto out_err;
+                       break;
                case IMAGEX_PACK_STREAMS_OPTION:
                        write_flags |= WIMLIB_WRITE_FLAG_PACK_STREAMS;
                        write_flags |= WIMLIB_WRITE_FLAG_RECOMPRESS;
@@ -3491,6 +3533,11 @@ imagex_optimize(int argc, tchar **argv, int cmd)
                if (ret)
                        goto out_wimlib_free;
        }
+       if (pack_ctype != WIMLIB_COMPRESSION_TYPE_INVALID) {
+               ret = wimlib_set_output_pack_compression_type(wim, pack_ctype);
+               if (ret)
+                       goto out_wimlib_free;
+       }
        if (pack_chunk_size != UINT32_MAX) {
                ret = wimlib_set_output_pack_chunk_size(wim, pack_chunk_size);
                if (ret)
@@ -3733,6 +3780,9 @@ imagex_update(int argc, tchar **argv, int cmd)
                case IMAGEX_STRICT_ACLS_OPTION:
                        default_add_flags |= WIMLIB_ADD_FLAG_STRICT_ACLS;
                        break;
+               case IMAGEX_NO_REPLACE_OPTION:
+                       default_add_flags |= WIMLIB_ADD_FLAG_NO_REPLACE;
+                       break;
                default:
                        goto out_usage;
                }
@@ -4187,7 +4237,7 @@ main(int argc, char **argv)
                exit(2);
        }
 
-       /* Enable warning and error messages in wimlib be more user-friendly.
+       /* Enable warning and error messages in wimlib to be more user-friendly.
         * */
        wimlib_set_print_errors(true);