]> wimlib.net Git - wimlib/blobdiff - programs/imagex.c
imagex.c: Make command-line usage for "update" consistent
[wimlib] / programs / imagex.c
index 407967fa784d6363907793f7e3eb5cc05e788303..85026c82adddd52d722588afe72008891ff6e45e 100644 (file)
@@ -169,17 +169,26 @@ IMAGEX_PROGNAME" unmount DIRECTORY [--commit] [--check] [--rebuild]\n"
 ),
 [UPDATE] =
 T(
-IMAGEX_PROGNAME" update WIMFILE IMAGE [--check] [--rebuild]\n"
-"                      [--threads=NUM_THREADS] [DEFAULT_ADD_OPTIONS]\n"
-"                      [DEFAULT_DELETE_OPTIONS] [< CMDFILE]\n"
-"               ... where each CMD is:\n"
-"               add [--unix-data] [--no-acls] [--strict-acls] [--dereference]\n"
-"                   [--verbose] FILE_OR_DIRECTORY DEST_WIM_PATH\n"
-"               delete [--force] [--recursive] WIM_PATH\n"
-"               rename SRC_PATH_IN_WIM DEST_PATH_IN_WIM\n"
+IMAGEX_PROGNAME" update WIMFILE [IMAGE_NUM | IMAGE_NAME] [--check] [--rebuild]\n"
+"                       [--threads=NUM_THREADS] [DEFAULT_ADD_OPTIONS]\n"
+"                       [DEFAULT_DELETE_OPTIONS] < CMDFILE\n"
 ),
 };
 
+
+static void
+recommend_man_page(const tchar *cmd_name)
+{
+#ifdef __WIN32__
+       tprintf(T("See "IMAGEX_PROGNAME"-%"TS".pdf in the "
+                 "doc directory for more details.\n"),
+               cmd_name);
+#else
+       tprintf(T("Try `man "IMAGEX_PROGNAME"-%"TS"' "
+                 "for more details.\n"), cmd_name);
+#endif
+}
+
 enum {
        IMAGEX_ALLOW_OTHER_OPTION,
        IMAGEX_BOOT_OPTION,
@@ -333,9 +342,16 @@ static const struct option update_options[] = {
        {T("threads"),     required_argument, NULL, IMAGEX_THREADS_OPTION},
        {T("check"),       no_argument,       NULL, IMAGEX_CHECK_OPTION},
        {T("rebuild"),     no_argument,       NULL, IMAGEX_REBUILD_OPTION},
+
+       /* Default delete options */
        {T("force"),       no_argument,       NULL, IMAGEX_FORCE_OPTION},
        {T("recursive"),   no_argument,       NULL, IMAGEX_RECURSIVE_OPTION},
+
+       /* Global add option */
        {T("config"),      required_argument, NULL, IMAGEX_CONFIG_OPTION},
+
+       /* Default add options */
+       {T("verbose"),     no_argument,       NULL, IMAGEX_VERBOSE_OPTION},
        {T("dereference"), no_argument,       NULL, IMAGEX_DEREFERENCE_OPTION},
        {T("unix-data"),   no_argument,       NULL, IMAGEX_UNIX_DATA_OPTION},
        {T("noacls"),      no_argument,       NULL, IMAGEX_NO_ACLS_OPTION},
@@ -1224,7 +1240,9 @@ update_command_add_option(int op, const tchar *option,
        bool recognized = true;
        switch (op) {
        case WIMLIB_UPDATE_OP_ADD:
-               if (!tstrcmp(option, T("--unix-data")))
+               if (!tstrcmp(option, T("--verbose")))
+                       cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+               else if (!tstrcmp(option, T("--unix-data")))
                        cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_UNIX_DATA;
                else if (!tstrcmp(option, T("--no-acls")) || !tstrcmp(option, T("--noacls")))
                        cmd->add.add_flags |= WIMLIB_ADD_IMAGE_FLAG_NO_ACLS;
@@ -1243,7 +1261,7 @@ update_command_add_option(int op, const tchar *option,
                else
                        recognized = false;
                break;
-       case WIMLIB_UPDATE_OP_RENAME:
+       default:
                recognized = false;
                break;
        }
@@ -1338,8 +1356,8 @@ parse_update_command(tchar *line, size_t len,
                        if (!update_command_add_option(op, next_string, command))
                        {
                                imagex_error(T("Unrecognized option \"%"TS"\" to "
-                                              "update command on line %zu"),
-                                            next_string, line_number);
+                                              "update command \"%"TS"\" on line %zu"),
+                                            next_string, command_name, line_number);
 
                                return false;
                        }
@@ -2106,18 +2124,19 @@ free_extract_commands(struct wimlib_extract_command *cmds, size_t num_cmds,
 }
 
 static struct wimlib_extract_command *
-prepare_extract_commands(tchar **argv, int argc, int extract_flags,
-                        tchar *dest_dir, size_t *num_cmds_ret)
+prepare_extract_commands(tchar **paths, unsigned num_paths,
+                        int extract_flags, tchar *dest_dir,
+                        size_t *num_cmds_ret)
 {
        struct wimlib_extract_command *cmds;
        size_t num_cmds;
        tchar *emptystr = T("");
 
-       if (argc == 0) {
-               argc = 1;
-               argv = &emptystr;
+       if (num_paths == 0) {
+               num_paths = 1;
+               paths = &emptystr;
        }
-       num_cmds = argc;
+       num_cmds = num_paths;
        cmds = calloc(num_cmds, sizeof(cmds[0]));
        if (!cmds) {
                imagex_error(T("Out of memory!"));
@@ -2126,18 +2145,18 @@ prepare_extract_commands(tchar **argv, int argc, int extract_flags,
 
        for (size_t i = 0; i < num_cmds; i++) {
                cmds[i].extract_flags = extract_flags;
-               cmds[i].wim_source_path = argv[i];
-               if (is_root_wim_path(argv[i])) {
+               cmds[i].wim_source_path = paths[i];
+               if (is_root_wim_path(paths[i])) {
                        cmds[i].fs_dest_path = dest_dir;
                } else {
-                       size_t len = tstrlen(dest_dir) + 1 + tstrlen(argv[i]);
+                       size_t len = tstrlen(dest_dir) + 1 + tstrlen(paths[i]);
                        cmds[i].fs_dest_path = malloc((len + 1) * sizeof(tchar));
                        if (!cmds[i].fs_dest_path) {
                                free_extract_commands(cmds, num_cmds, dest_dir);
                                return NULL;
                        }
                        tsprintf(cmds[i].fs_dest_path, T("%"TS"/%"TS), dest_dir,
-                                tbasename(argv[i]));
+                                tbasename(paths[i]));
                }
        }
        *num_cmds_ret = num_cmds;
@@ -2193,19 +2212,15 @@ imagex_extract(int argc, tchar **argv)
                        imagex_be_quiet = true;
                        break;
                default:
-                       usage(EXTRACT);
-                       ret = -1;
-                       goto out;
+                       goto out_usage;
                }
        }
        argc -= optind;
        argv += optind;
 
-       if (argc < 2) {
-               usage(EXTRACT);
-               ret = -1;
-               goto out;
-       }
+       if (argc < 2)
+               goto out_usage;
+
        wimfile = argv[0];
        image_num_or_name = argv[1];
 
@@ -2242,7 +2257,7 @@ imagex_extract(int argc, tchar **argv)
        win32_acquire_restore_privileges();
 #endif
 
-       ret = wimlib_extract_files(wim, image, 0, cmds, num_cmds,
+       ret = wimlib_extract_files(wim, image, cmds, num_cmds, 0,
                                   additional_swms, num_additional_swms,
                                   imagex_progress_func);
        if (ret == 0) {
@@ -2267,6 +2282,10 @@ out_free_cmds:
        free_extract_commands(cmds, num_cmds, dest_dir);
 out:
        return ret;
+out_usage:
+       usage(EXTRACT);
+       ret = -1;
+       goto out;
 }
 
 /* Prints information about a WIM file; also can mark an image as bootable,
@@ -2892,7 +2911,7 @@ imagex_update(int argc, tchar **argv)
        WIMStruct *wim;
        int ret;
        int open_flags = 0;
-       int write_flags = WIMLIB_WRITE_FLAG_SOFT_DELETE;
+       int write_flags = 0;
        int update_flags = 0;
        int default_add_flags = WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE;
        int default_delete_flags = 0;
@@ -2909,6 +2928,7 @@ imagex_update(int argc, tchar **argv)
 
        for_opt(c, update_options) {
                switch (c) {
+               /* Generic or write options */
                case IMAGEX_THREADS_OPTION:
                        num_threads = parse_num_threads(optarg);
                        if (num_threads == UINT_MAX) {
@@ -2923,15 +2943,24 @@ imagex_update(int argc, tchar **argv)
                case IMAGEX_REBUILD_OPTION:
                        write_flags |= WIMLIB_WRITE_FLAG_REBUILD;
                        break;
+
+               /* Default delete options */
                case IMAGEX_FORCE_OPTION:
                        default_delete_flags |= WIMLIB_DELETE_FLAG_FORCE;
                        break;
                case IMAGEX_RECURSIVE_OPTION:
                        default_delete_flags |= WIMLIB_DELETE_FLAG_RECURSIVE;
                        break;
+
+               /* Global add option */
                case IMAGEX_CONFIG_OPTION:
                        config_file = optarg;
                        break;
+
+               /* Default add options */
+               case IMAGEX_VERBOSE_OPTION:
+                       default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_VERBOSE;
+                       break;
                case IMAGEX_DEREFERENCE_OPTION:
                        default_add_flags |= WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE;
                        break;
@@ -2989,8 +3018,10 @@ imagex_update(int argc, tchar **argv)
        }
 
        /* Read update commands from standard input */
-       if (isatty(STDIN_FILENO))
+       if (isatty(STDIN_FILENO)) {
                tputs(T("Reading update commands from standard input..."));
+               recommend_man_page(T("update"));
+       }
        cmd_file_contents = stdin_get_text_contents(&cmd_file_nchars);
        if (!cmd_file_contents) {
                ret = -1;
@@ -3134,8 +3165,8 @@ usage(int cmd_type)
        tprintf(T("Usage:\n%"TS), usage_strings[cmd_type]);
        for_imagex_command(cmd) {
                if (cmd->cmd == cmd_type) {
-                       tprintf(T("\nTry `man "IMAGEX_PROGNAME"-%"TS"' "
-                                 "for more details.\n"), cmd->name);
+                       tputc(T('\n'), stdout);
+                       recommend_man_page(cmd->name);
                }
        }
 }