]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
Update NEWS
[wimlib] / programs / imagex.c
index 4800633e07a80254e8fd1ab34532664269e6646e..92e64ee775d0b815567e1eb99a566a55b45741c1 100644 (file)
@@ -142,6 +142,7 @@ enum {
        IMAGEX_NORPFIX_OPTION,
        IMAGEX_NOCHECK_OPTION,
        IMAGEX_NO_ACLS_OPTION,
+       IMAGEX_NO_WILDCARDS_OPTION,
        IMAGEX_NOT_PIPABLE_OPTION,
        IMAGEX_PACK_STREAMS_OPTION,
        IMAGEX_PATH_OPTION,
@@ -157,6 +158,7 @@ enum {
        IMAGEX_STAGING_DIR_OPTION,
        IMAGEX_STREAMS_INTERFACE_OPTION,
        IMAGEX_STRICT_ACLS_OPTION,
+       IMAGEX_STRICT_WILDCARDS_OPTION,
        IMAGEX_SYMLINK_OPTION,
        IMAGEX_THREADS_OPTION,
        IMAGEX_TO_STDOUT_OPTION,
@@ -252,6 +254,8 @@ static const struct option extract_options[] = {
        {T("dest-dir"),    required_argument, NULL, IMAGEX_DEST_DIR_OPTION},
        {T("to-stdout"),   no_argument,       NULL, IMAGEX_TO_STDOUT_OPTION},
        {T("include-invalid-names"), no_argument, NULL, IMAGEX_INCLUDE_INVALID_NAMES_OPTION},
+       {T("strict-wildcards"), no_argument,  NULL, IMAGEX_STRICT_WILDCARDS_OPTION},
+       {T("no-wildcards"), no_argument,      NULL, IMAGEX_NO_WILDCARDS_OPTION},
        {NULL, 0, NULL, 0},
 };
 
@@ -2697,8 +2701,10 @@ imagex_extract(int argc, tchar **argv, int cmd)
        int ret;
        const tchar *wimfile;
        const tchar *image_num_or_name;
+       const tchar *pathlist;
        tchar *dest_dir = T(".");
        int extract_flags = WIMLIB_EXTRACT_FLAG_SEQUENTIAL | WIMLIB_EXTRACT_FLAG_NORPFIX;
+       int listfile_extract_flags = WIMLIB_EXTRACT_FLAG_GLOB_PATHS;
 
        STRING_SET(refglobs);
 
@@ -2739,6 +2745,12 @@ imagex_extract(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_NO_WILDCARDS_OPTION:
+                       listfile_extract_flags &= ~WIMLIB_EXTRACT_FLAG_GLOB_PATHS;
+                       break;
+               case IMAGEX_STRICT_WILDCARDS_OPTION:
+                       listfile_extract_flags |= WIMLIB_EXTRACT_FLAG_STRICT_GLOB;
+                       break;
                default:
                        goto out_usage;
                }
@@ -2755,10 +2767,17 @@ imagex_extract(int argc, tchar **argv, int cmd)
        argc -= 2;
        argv += 2;
 
-       cmds = prepare_extract_commands(argv, argc, extract_flags, dest_dir,
-                                       &num_cmds);
-       if (!cmds)
-               goto out_err;
+       if (argc == 1 && argv[0][0] == T('@')) {
+               pathlist = argv[0] + 1;
+               cmds = NULL;
+               num_cmds = 0;
+       } else {
+               cmds = prepare_extract_commands(argv, argc, extract_flags, dest_dir,
+                                               &num_cmds);
+               if (cmds == NULL)
+                       goto out_err;
+               pathlist = NULL;
+       }
 
        ret = wimlib_open_wim(wimfile, open_flags, &wim, imagex_progress_func);
        if (ret)
@@ -2777,8 +2796,17 @@ imagex_extract(int argc, tchar **argv, int cmd)
                        goto out_wimlib_free;
        }
 
-       ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0,
-                                  imagex_progress_func);
+       ret = 0;
+       if (ret == 0 && cmds != NULL) {
+               ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0,
+                                          imagex_progress_func);
+       }
+       if (ret == 0 && pathlist != NULL) {
+               ret = wimlib_extract_pathlist(wim, image, dest_dir,
+                                             pathlist,
+                                             extract_flags | listfile_extract_flags,
+                                             imagex_progress_func);
+       }
        if (ret == 0) {
                if (!imagex_be_quiet)
                        imagex_printf(T("Done extracting files.\n"));
@@ -2786,7 +2814,7 @@ imagex_extract(int argc, tchar **argv, int cmd)
                tfprintf(stderr, T("Note: You can use `%"TS"' to see what "
                                   "files and directories\n"
                                   "      are in the WIM image.\n"),
-                               get_cmd_string(CMD_INFO, false));
+                               get_cmd_string(CMD_DIR, false));
        } else if (ret == WIMLIB_ERR_RESOURCE_NOT_FOUND) {
                struct wimlib_wim_info info;
 
@@ -3853,7 +3881,7 @@ T(
 ),
 [CMD_EXTRACT] =
 T(
-"    %"TS" WIMFILE (IMAGE_NUM | IMAGE_NAME) [PATH...]\n"
+"    %"TS" WIMFILE (IMAGE_NUM | IMAGE_NAME) ([PATH...] | @LISTFILE)\n"
 "                    [--check] [--ref=\"GLOB\"] [--no-acls] [--strict-acls]\n"
 "                    [--to-stdout] [--dest-dir=CMD_DIR]\n"
 "                    [--include-invalid-names]\n"
@@ -4058,8 +4086,26 @@ main(int argc, char **argv)
 
                }
        }
+
 #endif /* !__WIN32__ */
 
+       {
+               tchar *igcase = tgetenv(T("WIMLIB_IMAGEX_IGNORE_CASE"));
+               if (igcase != NULL) {
+                       if (!tstrcmp(igcase, T("no")) ||
+                           !tstrcmp(igcase, T("0")))
+                               init_flags |= WIMLIB_INIT_FLAG_DEFAULT_CASE_SENSITIVE;
+                       else if (!tstrcmp(igcase, T("yes")) ||
+                                !tstrcmp(igcase, T("1")))
+                               init_flags |= WIMLIB_INIT_FLAG_DEFAULT_CASE_INSENSITIVE;
+                       else {
+                               fprintf(stderr,
+                                       "WARNING: Ignoring unknown setting of "
+                                       "WIMLIB_IMAGEX_IGNORE_CASE\n");
+                       }
+               }
+       }
+
        /* Allow being invoked as wimCOMMAND (e.g. wimapply).  */
        cmd = CMD_NONE;
        if (!tstrncmp(invocation_name, T("wim"), 3) &&