static int parse_and_validate_options(int argc, const char *argv[], const char * const usage[], const char *prefix, struct wt_status *s) { int f = 0; argc = parse_options(argc, argv, prefix, builtin_commit_options, usage, 0); if (force_author && !strchr(force_author, '>')) force_author = find_author_by_nickname(force_author); if (force_author && renew_authorship) die("Using both --reset-author and --author does not make sense"); if (logfile || message.len || use_message || fixup_message) use_editor = 0; if (edit_flag) use_editor = 1; if (!use_editor) setenv("GIT_EDITOR", ":", 1); if (get_sha1("HEAD", head_sha1)) initial_commit = 1; /* Sanity check options */ if (amend && initial_commit) die("You have nothing to amend."); if (amend && in_merge) die("You are in the middle of a merge -- cannot amend."); if (fixup_message && squash_message) die("Options --squash and --fixup cannot be used together"); if (use_message) f++; if (edit_message) f++; if (fixup_message) f++; if (logfile) f++; if (f > 1) die("Only one of -c/-C/-F/--fixup can be used."); if (message.len && f > 0) die("Option -m cannot be combined with -c/-C/-F/--fixup."); if (edit_message) use_message = edit_message; if (amend && !use_message && !fixup_message) use_message = "HEAD"; if (!use_message && renew_authorship) die("--reset-author can be used only with -C, -c or --amend."); if (use_message) { const char *out_enc; struct commit *commit; commit = lookup_commit_reference_by_name(use_message); if (!commit) die("could not lookup commit %s", use_message); out_enc = get_commit_output_encoding(); use_message_buffer = logmsg_reencode(commit, out_enc); /* * If we failed to reencode the buffer, just copy it * byte for byte so the user can try to fix it up. * This also handles the case where input and output * encodings are identical. */ if (use_message_buffer == NULL) use_message_buffer = xstrdup(commit->buffer); } if (!!also + !!only + !!all + !!interactive > 1) die("Only one of --include/--only/--all/--interactive can be used."); if (argc == 0 && (also || (only && !amend))) die("No paths with --include/--only does not make sense."); if (argc == 0 && only && amend) only_include_assumed = "Clever... amending the last one with dirty index."; if (argc > 0 && !also && !only) only_include_assumed = "Explicit paths specified without -i nor -o; assuming --only paths..."; if (!cleanup_arg || !strcmp(cleanup_arg, "default")) cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "verbatim")) cleanup_mode = CLEANUP_NONE; else if (!strcmp(cleanup_arg, "whitespace")) cleanup_mode = CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "strip")) cleanup_mode = CLEANUP_ALL; else die("Invalid cleanup mode %s", cleanup_arg); handle_untracked_files_arg(s); if (all && argc > 0) die("Paths with -a does not make sense."); else if (interactive && argc > 0) die("Paths with --interactive does not make sense."); if (null_termination && status_format == STATUS_FORMAT_LONG) status_format = STATUS_FORMAT_PORCELAIN; if (status_format != STATUS_FORMAT_LONG) dry_run = 1; return argc; }
static int parse_and_validate_options(int argc, const char *argv[], const struct option *options, const char * const usage[], const char *prefix, struct commit *current_head, struct wt_status *s) { int f = 0; argc = parse_options(argc, argv, prefix, options, usage, 0); finalize_deferred_config(s); if (force_author && !strchr(force_author, '>')) force_author = find_author_by_nickname(force_author); if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); if (logfile || have_option_m || use_message || fixup_message) use_editor = 0; if (0 <= edit_flag) use_editor = edit_flag; if (!use_editor) setenv("GIT_EDITOR", ":", 1); /* Sanity check options */ if (amend && !current_head) die(_("You have nothing to amend.")); if (amend && whence != FROM_COMMIT) { if (whence == FROM_MERGE) die(_("You are in the middle of a merge -- cannot amend.")); else if (whence == FROM_CHERRY_PICK) die(_("You are in the middle of a cherry-pick -- cannot amend.")); } if (fixup_message && squash_message) die(_("Options --squash and --fixup cannot be used together")); if (use_message) f++; if (edit_message) f++; if (fixup_message) f++; if (logfile) f++; if (f > 1) die(_("Only one of -c/-C/-F/--fixup can be used.")); if (message.len && f > 0) die((_("Option -m cannot be combined with -c/-C/-F/--fixup."))); if (f || message.len) template_file = NULL; if (edit_message) use_message = edit_message; if (amend && !use_message && !fixup_message) use_message = "HEAD"; if (!use_message && whence != FROM_CHERRY_PICK && renew_authorship) die(_("--reset-author can be used only with -C, -c or --amend.")); if (use_message) { use_message_buffer = read_commit_message(use_message); if (!renew_authorship) { author_message = use_message; author_message_buffer = use_message_buffer; } } if (whence == FROM_CHERRY_PICK && !renew_authorship) { author_message = "CHERRY_PICK_HEAD"; author_message_buffer = read_commit_message(author_message); } if (patch_interactive) interactive = 1; if (also + only + all + interactive > 1) die(_("Only one of --include/--only/--all/--interactive/--patch can be used.")); if (argc == 0 && (also || (only && !amend))) die(_("No paths with --include/--only does not make sense.")); if (argc == 0 && only && amend) only_include_assumed = _("Clever... amending the last one with dirty index."); if (argc > 0 && !also && !only) only_include_assumed = _("Explicit paths specified without -i nor -o; assuming --only paths..."); if (!cleanup_arg || !strcmp(cleanup_arg, "default")) cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "verbatim")) cleanup_mode = CLEANUP_NONE; else if (!strcmp(cleanup_arg, "whitespace")) cleanup_mode = CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "strip")) cleanup_mode = CLEANUP_ALL; else die(_("Invalid cleanup mode %s"), cleanup_arg); handle_untracked_files_arg(s); if (all && argc > 0) die(_("Paths with -a does not make sense.")); if (status_format != STATUS_FORMAT_NONE) dry_run = 1; return argc; }
static int parse_and_validate_options(int argc, const char *argv[], const char * const usage[], const char *prefix) { int f = 0; argc = parse_options(argc, argv, builtin_commit_options, usage, 0); logfile = parse_options_fix_filename(prefix, logfile); template_file = parse_options_fix_filename(prefix, template_file); if (force_author && !strchr(force_author, '>')) force_author = find_author_by_nickname(force_author); if (logfile || message.len || use_message) use_editor = 0; if (edit_flag) use_editor = 1; if (!use_editor) setenv("GIT_EDITOR", ":", 1); if (get_sha1("HEAD", head_sha1)) initial_commit = 1; if (!get_sha1("MERGE_HEAD", merge_head_sha1)) in_merge = 1; /* Sanity check options */ if (amend && initial_commit) die("You have nothing to amend."); if (amend && in_merge) die("You are in the middle of a merge -- cannot amend."); if (use_message) f++; if (edit_message) f++; if (logfile) f++; if (f > 1) die("Only one of -c/-C/-F can be used."); if (message.len && f > 0) die("Option -m cannot be combined with -c/-C/-F."); if (edit_message) use_message = edit_message; if (amend && !use_message) use_message = "HEAD"; if (use_message) { unsigned char sha1[20]; static char utf8[] = "UTF-8"; const char *out_enc; char *enc, *end; struct commit *commit; if (get_sha1(use_message, sha1)) die("could not lookup commit %s", use_message); commit = lookup_commit_reference(sha1); if (!commit || parse_commit(commit)) die("could not parse commit %s", use_message); enc = strstr(commit->buffer, "\nencoding"); if (enc) { end = strchr(enc + 10, '\n'); enc = xstrndup(enc + 10, end - (enc + 10)); } else { enc = utf8; } out_enc = git_commit_encoding ? git_commit_encoding : utf8; if (strcmp(out_enc, enc)) use_message_buffer = reencode_string(commit->buffer, out_enc, enc); /* * If we failed to reencode the buffer, just copy it * byte for byte so the user can try to fix it up. * This also handles the case where input and output * encodings are identical. */ if (use_message_buffer == NULL) use_message_buffer = xstrdup(commit->buffer); if (enc != utf8) free(enc); } if (!!also + !!only + !!all + !!interactive > 1) die("Only one of --include/--only/--all/--interactive can be used."); if (argc == 0 && (also || (only && !amend))) die("No paths with --include/--only does not make sense."); if (argc == 0 && only && amend) only_include_assumed = "Clever... amending the last one with dirty index."; if (argc > 0 && !also && !only) only_include_assumed = "Explicit paths specified without -i nor -o; assuming --only paths..."; if (!cleanup_arg || !strcmp(cleanup_arg, "default")) cleanup_mode = use_editor ? CLEANUP_ALL : CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "verbatim")) cleanup_mode = CLEANUP_NONE; else if (!strcmp(cleanup_arg, "whitespace")) cleanup_mode = CLEANUP_SPACE; else if (!strcmp(cleanup_arg, "strip")) cleanup_mode = CLEANUP_ALL; else die("Invalid cleanup mode %s", cleanup_arg); if (!untracked_files_arg) ; /* default already initialized */ else if (!strcmp(untracked_files_arg, "no")) show_untracked_files = SHOW_NO_UNTRACKED_FILES; else if (!strcmp(untracked_files_arg, "normal")) show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES; else if (!strcmp(untracked_files_arg, "all")) show_untracked_files = SHOW_ALL_UNTRACKED_FILES; else die("Invalid untracked files mode '%s'", untracked_files_arg); if (all && argc > 0) die("Paths with -a does not make sense."); else if (interactive && argc > 0) die("Paths with --interactive does not make sense."); return argc; }