Merge branch 'js/rebase-cleanup'
authorJunio C Hamano <gitster@pobox.com>
Mon, 29 Jul 2019 19:39:13 +0000 (12:39 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Jul 2019 19:39:14 +0000 (12:39 -0700)
A few leftover cleanup to "git rebase" in C.

* js/rebase-cleanup:
git: mark cmd_rebase as requiring a worktree
rebase: fix white-space

1  2 
builtin/rebase.c
git.c
diff --combined builtin/rebase.c
index 95d34223e93774edbede0c83d781587777d647f3,21681a551b1983cf9229e9f793bbbd53414451bb..670096c065f5f5fa8cb57c642cd759111b010988
@@@ -508,7 -508,7 +508,7 @@@ int cmd_rebase__interactive(int argc, c
        if (argc == 1)
                usage_with_options(builtin_rebase_interactive_usage, options);
  
 -      argc = parse_options(argc, argv, NULL, options,
 +      argc = parse_options(argc, argv, prefix, options,
                        builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0);
  
        if (!is_null_oid(&squash_onto))
@@@ -738,30 -738,20 +738,30 @@@ static int finish_rebase(struct rebase_
  {
        struct strbuf dir = STRBUF_INIT;
        const char *argv_gc_auto[] = { "gc", "--auto", NULL };
 +      int ret = 0;
  
        delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
        apply_autostash(opts);
 -      close_all_packs(the_repository->objects);
 +      close_object_store(the_repository->objects);
        /*
         * We ignore errors in 'gc --auto', since the
         * user should see them.
         */
        run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
 -      strbuf_addstr(&dir, opts->state_dir);
 -      remove_dir_recursively(&dir, 0);
 -      strbuf_release(&dir);
 +      if (opts->type == REBASE_INTERACTIVE) {
 +              struct replay_opts replay = REPLAY_OPTS_INIT;
  
 -      return 0;
 +              replay.action = REPLAY_INTERACTIVE_REBASE;
 +              ret = sequencer_remove_state(&replay);
 +      } else {
 +              strbuf_addstr(&dir, opts->state_dir);
 +              if (remove_dir_recursively(&dir, 0))
 +                      ret = error(_("could not remove '%s'"),
 +                                  opts->state_dir);
 +              strbuf_release(&dir);
 +      }
 +
 +      return ret;
  }
  
  static struct commit *peel_committish(const char *name)
@@@ -850,13 -840,13 +850,13 @@@ static int reset_head(struct object_id 
                goto leave_reset_head;
        }
  
 -      if (!reset_hard && !fill_tree_descriptor(&desc[nr++], &head_oid)) {
 +      if (!reset_hard && !fill_tree_descriptor(the_repository, &desc[nr++], &head_oid)) {
                ret = error(_("failed to find tree of %s"),
                            oid_to_hex(&head_oid));
                goto leave_reset_head;
        }
  
 -      if (!fill_tree_descriptor(&desc[nr++], oid)) {
 +      if (!fill_tree_descriptor(the_repository, &desc[nr++], oid)) {
                ret = error(_("failed to find tree of %s"), oid_to_hex(oid));
                goto leave_reset_head;
        }
@@@ -1163,6 -1153,10 +1163,6 @@@ static int run_specific_rebase(struct r
        }
  
        switch (opts->type) {
 -      case REBASE_AM:
 -              backend = "git-rebase--am";
 -              backend_func = "git_rebase__am";
 -              break;
        case REBASE_PRESERVE_MERGES:
                backend = "git-rebase--preserve-merges";
                backend_func = "git_rebase__preserve_merges";
        }
  
        strbuf_addf(&script_snippet,
 -                  ". git-sh-setup && . git-rebase--common &&"
 -                  " . %s && %s", backend, backend_func);
 +                  ". git-sh-setup && . %s && %s", backend, backend_func);
        argv[0] = script_snippet.buf;
  
        status = run_command_v_opt(argv, RUN_USING_SHELL);
@@@ -1389,7 -1384,6 +1389,7 @@@ int cmd_rebase(int argc, const char **a
        struct string_list strategy_options = STRING_LIST_INIT_NODUP;
        struct object_id squash_onto;
        char *squash_onto_name = NULL;
 +      int reschedule_failed_exec = -1;
        struct option builtin_rebase_options[] = {
                OPT_STRING(0, "onto", &options.onto_name,
                           N_("revision"),
                OPT_BOOL(0, "root", &options.root,
                         N_("rebase all reachable commits up to the root(s)")),
                OPT_BOOL(0, "reschedule-failed-exec",
 -                       &options.reschedule_failed_exec,
 +                       &reschedule_failed_exec,
                         N_("automatically re-schedule any `exec` that fails")),
                OPT_END(),
        };
                usage_with_options(builtin_rebase_usage,
                                   builtin_rebase_options);
  
-       prefix = setup_git_directory();
-       trace_repo_setup(prefix);
-       setup_work_tree();
        options.allow_empty_message = 1;
        git_config(rebase_config, &options);
  
                if (reset_head(NULL, "reset", NULL, RESET_HEAD_HARD,
                               NULL, NULL) < 0)
                        die(_("could not discard worktree changes"));
 -              remove_branch_state(the_repository);
 +              remove_branch_state(the_repository, 0);
                if (read_basic_state(&options))
                        exit(1);
                goto run_rebase;
                               NULL, NULL) < 0)
                        die(_("could not move back to %s"),
                            oid_to_hex(&options.orig_head));
 -              remove_branch_state(the_repository);
 -              ret = finish_rebase(&options);
 +              remove_branch_state(the_repository, 0);
 +              ret = !!finish_rebase(&options);
                goto cleanup;
        }
        case ACTION_QUIT: {
 -              strbuf_reset(&buf);
 -              strbuf_addstr(&buf, options.state_dir);
 -              ret = !!remove_dir_recursively(&buf, 0);
 -              if (ret)
 -                      die(_("could not remove '%s'"), options.state_dir);
 +              if (options.type == REBASE_INTERACTIVE) {
 +                      struct replay_opts replay = REPLAY_OPTS_INIT;
 +
 +                      replay.action = REPLAY_INTERACTIVE_REBASE;
 +                      ret = !!sequencer_remove_state(&replay);
 +              } else {
 +                      strbuf_reset(&buf);
 +                      strbuf_addstr(&buf, options.state_dir);
 +                      ret = !!remove_dir_recursively(&buf, 0);
 +                      if (ret)
 +                              error(_("could not remove '%s'"),
 +                                     options.state_dir);
 +              }
                goto cleanup;
        }
        case ACTION_EDIT_TODO:
                break;
        }
  
 -      if (options.reschedule_failed_exec && !is_interactive(&options))
 -              die(_("%s requires an interactive rebase"), "--reschedule-failed-exec");
 +      if (reschedule_failed_exec > 0 && !is_interactive(&options))
 +              die(_("--reschedule-failed-exec requires "
 +                    "--exec or --interactive"));
 +      if (reschedule_failed_exec >= 0)
 +              options.reschedule_failed_exec = reschedule_failed_exec;
  
        if (options.git_am_opts.argc) {
                /* all am options except -q are compatible only with --am */
        strbuf_addf(&msg, "%s: checkout %s",
                    getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
        if (reset_head(&options.onto->object.oid, "checkout", NULL,
-                      RESET_HEAD_DETACH | RESET_ORIG_HEAD | 
+                      RESET_HEAD_DETACH | RESET_ORIG_HEAD |
                       RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
                       NULL, msg.buf))
                die(_("Could not detach HEAD"));
@@@ -2163,7 -2142,6 +2159,7 @@@ run_rebase
        ret = !!run_specific_rebase(&options, action);
  
  cleanup:
 +      strbuf_release(&buf);
        strbuf_release(&revisions);
        free(options.head_name);
        free(options.gpg_sign_opt);
diff --combined git.c
index a9604768578f608ea5268365d2006b57c1f73d86,1461e819c32b43160b50bbcf2eb84ea3ecb983df..74ad85535696939db14e77e12da5bffdce77f525
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -33,8 -33,7 +33,8 @@@ const char git_usage_string[] 
  const char git_more_info_string[] =
        N_("'git help -a' and 'git help -g' list available subcommands and some\n"
           "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 -         "to read about a specific subcommand or concept.");
 +         "to read about a specific subcommand or concept.\n"
 +         "See 'git help git' for an overview of the system.");
  
  static int use_pager = -1;
  
@@@ -500,7 -499,6 +500,7 @@@ static struct cmd_struct commands[] = 
        { "diff-index", cmd_diff_index, RUN_SETUP | NO_PARSEOPT },
        { "diff-tree", cmd_diff_tree, RUN_SETUP | NO_PARSEOPT },
        { "difftool", cmd_difftool, RUN_SETUP_GENTLY },
 +      { "env--helper", cmd_env__helper },
        { "fast-export", cmd_fast_export, RUN_SETUP },
        { "fetch", cmd_fetch, RUN_SETUP },
        { "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },
        { "push", cmd_push, RUN_SETUP },
        { "range-diff", cmd_range_diff, RUN_SETUP | USE_PAGER },
        { "read-tree", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},
-       /*
-        * NEEDSWORK: Until the rebase is independent and needs no redirection
-        * to rebase shell script this is kept as is, then should be changed to
-        * RUN_SETUP | NEED_WORK_TREE
-        */
-       { "rebase", cmd_rebase },
+       { "rebase", cmd_rebase, RUN_SETUP | NEED_WORK_TREE },
        { "rebase--interactive", cmd_rebase__interactive, RUN_SETUP | NEED_WORK_TREE },
        { "receive-pack", cmd_receive_pack },
        { "reflog", cmd_reflog, RUN_SETUP },
        { "replace", cmd_replace, RUN_SETUP },
        { "rerere", cmd_rerere, RUN_SETUP },
        { "reset", cmd_reset, RUN_SETUP },
 +      { "restore", cmd_restore, RUN_SETUP | NEED_WORK_TREE },
        { "rev-list", cmd_rev_list, RUN_SETUP | NO_PARSEOPT },
        { "rev-parse", cmd_rev_parse, NO_PARSEOPT },
        { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
        { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
        { "stripspace", cmd_stripspace },
        { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
 +      { "switch", cmd_switch, RUN_SETUP | NEED_WORK_TREE },
        { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
        { "tag", cmd_tag, RUN_SETUP | DELAY_PAGER_CONFIG },
        { "unpack-file", cmd_unpack_file, RUN_SETUP | NO_PARSEOPT },