All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alban Gruin <alban.gruin@gmail.com>
To: git@vger.kernel.org
Cc: Stefan Beller <sbeller@google.com>,
	Christian Couder <christian.couder@gmail.com>,
	Pratik Karki <predatoramigo@gmail.com>,
	Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	phillip.wood@dunelm.org.uk, Elijah Newren <newren@gmail.com>,
	Alban Gruin <alban.gruin@gmail.com>
Subject: [GSoC][PATCH 2/3] rebase -i: rewrite setup_reflog_action() in C
Date: Mon, 18 Jun 2018 15:18:43 +0200	[thread overview]
Message-ID: <20180618131844.13408-3-alban.gruin@gmail.com> (raw)
In-Reply-To: <20180618131844.13408-1-alban.gruin@gmail.com>

This rewrites setup_reflog_action() from shell to C.

A new command is added to rebase--helper.c, “setup-reflog”, as such as a
new flag, “verbose”, to silence the output of the checkout operation
called by setup_reflog_action().

The shell version is then stripped in favour of a call to the helper. As
$GIT_REFLOG_ACTION is not longer set at the first call of
checkout_onto(), a call to comment_for_reflog() is added at the
beginning of this function.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
---
 builtin/rebase--helper.c   |  9 +++++++--
 git-rebase--interactive.sh | 16 ++--------------
 sequencer.c                | 31 +++++++++++++++++++++++++++++++
 sequencer.h                |  3 +++
 4 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c
index d2990b210..d677fb663 100644
--- a/builtin/rebase--helper.c
+++ b/builtin/rebase--helper.c
@@ -12,12 +12,12 @@ static const char * const builtin_rebase_helper_usage[] = {
 int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
 {
 	struct replay_opts opts = REPLAY_OPTS_INIT;
-	unsigned flags = 0, keep_empty = 0, rebase_merges = 0;
+	unsigned flags = 0, keep_empty = 0, rebase_merges = 0, verbose = 0;
 	int abbreviate_commands = 0, rebase_cousins = -1;
 	enum {
 		CONTINUE = 1, ABORT, MAKE_SCRIPT, SHORTEN_OIDS, EXPAND_OIDS,
 		CHECK_TODO_LIST, SKIP_UNNECESSARY_PICKS, REARRANGE_SQUASH,
-		ADD_EXEC, APPEND_TODO_HELP, EDIT_TODO
+		ADD_EXEC, APPEND_TODO_HELP, EDIT_TODO, SETUP_REFLOG
 	} command = 0;
 	struct option options[] = {
 		OPT_BOOL(0, "ff", &opts.allow_ff, N_("allow fast-forward")),
@@ -27,6 +27,7 @@ int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
 		OPT_BOOL(0, "rebase-merges", &rebase_merges, N_("rebase merge commits")),
 		OPT_BOOL(0, "rebase-cousins", &rebase_cousins,
 			 N_("keep original branch points of cousins")),
+		OPT_BOOL(0, "verbose", &verbose, N_("verbose")),
 		OPT_CMDMODE(0, "continue", &command, N_("continue rebase"),
 				CONTINUE),
 		OPT_CMDMODE(0, "abort", &command, N_("abort rebase"),
@@ -50,6 +51,8 @@ int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
 		OPT_CMDMODE(0, "edit-todo", &command,
 			    N_("edit the todo list during an interactive rebase"),
 			    EDIT_TODO),
+		OPT_CMDMODE(0, "setup-reflog", &command,
+			    N_("setup the reflog action"), SETUP_REFLOG),
 		OPT_END()
 	};
 
@@ -93,5 +96,7 @@ int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
 		return !!append_todo_help(0, keep_empty);
 	if (command == EDIT_TODO && argc == 1)
 		return !!edit_todo_list(flags);
+	if (command == SETUP_REFLOG && argc == 2)
+		return !!setup_reflog_action(&opts, argv[1], verbose);
 	usage_with_options(builtin_rebase_helper_usage, options);
 }
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 2defe607f..048bbf041 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -72,6 +72,7 @@ collapse_todo_ids() {
 
 # Switch to the branch in $into and notify it in the reflog
 checkout_onto () {
+	comment_for_reflog start
 	GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
 	output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
 	git update-ref ORIG_HEAD $orig_head
@@ -119,19 +120,6 @@ initiate_action () {
 	esac
 }
 
-setup_reflog_action () {
-	comment_for_reflog start
-
-	if test ! -z "$switch_to"
-	then
-		GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
-		output git checkout "$switch_to" -- ||
-			die "$(eval_gettext "Could not checkout \$switch_to")"
-
-		comment_for_reflog start
-	fi
-}
-
 init_basic_state () {
 	orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
 	mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
@@ -211,7 +199,7 @@ git_rebase__interactive () {
 		return 0
 	fi
 
-	setup_reflog_action
+	git rebase--helper --setup-reflog "$switch_to" ${verbose:+--verbose}
 	init_basic_state
 
 	init_revisions_and_shortrevisions
diff --git a/sequencer.c b/sequencer.c
index 3437673d2..4bfe29c7b 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -3131,6 +3131,37 @@ static const char *reflog_message(struct replay_opts *opts,
 	return buf.buf;
 }
 
+static int checkout_base_commit(struct replay_opts *opts, const char *commit,
+				int verbose, const char *action)
+{
+	struct child_process cmd = CHILD_PROCESS_INIT;
+
+	cmd.git_cmd = 1;
+
+	argv_array_push(&cmd.args, "checkout");
+	argv_array_push(&cmd.args, commit);
+	argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
+
+	if (verbose)
+		return run_command(&cmd);
+	else
+		return run_command_silent_on_success(&cmd);
+}
+
+int setup_reflog_action(struct replay_opts *opts, const char *commit,
+			int verbose)
+{
+	const char *action;
+
+	if (commit && *commit) {
+		action = reflog_message(opts, "start", "checkout %s", commit);
+		if (checkout_base_commit(opts, commit, verbose, action))
+			die(_("Could not checkout %s"), commit);
+	}
+
+	return 0;
+}
+
 static const char rescheduled_advice[] =
 N_("Could not execute the todo command\n"
 "\n"
diff --git a/sequencer.h b/sequencer.h
index 35730b13e..55e4057d8 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -100,6 +100,9 @@ int update_head_with_reflog(const struct commit *old_head,
 void commit_post_rewrite(const struct commit *current_head,
 			 const struct object_id *new_head);
 
+int setup_reflog_action(struct replay_opts *opts, const char *commit,
+			int verbose);
+
 #define SUMMARY_INITIAL_COMMIT   (1 << 0)
 #define SUMMARY_SHOW_AUTHOR_DATE (1 << 1)
 void print_commit_summary(const char *prefix, const struct object_id *oid,
-- 
2.16.4


  parent reply	other threads:[~2018-06-18 13:19 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-18 13:18 [GSoC][PATCH 0/3] rebase -i: rewrite reflog operations in C Alban Gruin
2018-06-18 13:18 ` [GSoC][PATCH 1/3] sequencer: add a new function to silence a command, except if it fails Alban Gruin
2018-06-18 15:26   ` Phillip Wood
2018-06-18 16:46     ` Alban Gruin
2018-06-18 16:26   ` Christian Couder
2018-06-18 17:05     ` Alban Gruin
2018-06-18 13:18 ` Alban Gruin [this message]
2018-06-18 15:34   ` [GSoC][PATCH 2/3] rebase -i: rewrite setup_reflog_action() in C Phillip Wood
2018-06-18 17:04     ` Alban Gruin
2018-06-18 22:01   ` Stefan Beller
2018-06-19  6:51     ` Johannes Schindelin
2018-06-18 13:18 ` [GSoC][PATCH 3/3] rebase -i: rewrite checkout_onto() " Alban Gruin
2018-06-18 16:09   ` Phillip Wood
2018-06-18 17:04     ` Alban Gruin
2018-06-19 15:44 ` [GSoC][PATCH v2 0/3] rebase -i: rewrite reflog operations " Alban Gruin
2018-06-19 15:44   ` [GSoC][PATCH v2 1/3] sequencer: add a new function to silence a command, except if it fails Alban Gruin
2018-06-21  9:37     ` Johannes Schindelin
2018-06-21 11:53       ` Alban Gruin
2018-06-19 15:44   ` [GSoC][PATCH v2 2/3] rebase -i: rewrite setup_reflog_action() in C Alban Gruin
2018-06-21 10:34     ` Johannes Schindelin
2018-06-19 15:44   ` [GSoC][PATCH v2 3/3] rebase -i: rewrite checkout_onto() " Alban Gruin
2018-06-21 10:38     ` Johannes Schindelin
2018-06-19 18:35   ` [GSoC][PATCH v2 0/3] rebase -i: rewrite reflog operations " Stefan Beller
2018-06-21  8:39   ` Johannes Schindelin
2018-06-21 14:17   ` [GSoC][PATCH v3 " Alban Gruin
2018-06-21 14:17     ` [GSoC][PATCH v3 1/3] sequencer: add a new function to silence a command, except if it fails Alban Gruin
2018-06-21 22:03       ` Junio C Hamano
2018-06-22 20:47         ` Alban Gruin
2018-06-21 14:17     ` [GSoC][PATCH v3 2/3] rebase -i: rewrite setup_reflog_action() in C Alban Gruin
2018-06-22 16:27       ` Junio C Hamano
2018-06-22 20:48         ` Alban Gruin
2018-06-25 15:34           ` Junio C Hamano
2018-06-25 18:21             ` Alban Gruin
2018-06-25 21:14               ` Johannes Schindelin
2018-06-26  9:13                 ` Pratik Karki
2018-06-26 17:44               ` Junio C Hamano
2018-06-21 14:17     ` [GSoC][PATCH v3 3/3] rebase -i: rewrite checkout_onto() " Alban Gruin
2018-06-25 13:44     ` [GSoC][PATCH v4 0/3] rebase -i: rewrite reflog operations " Alban Gruin
2018-06-25 13:44       ` [GSoC][PATCH v4 1/3] sequencer: extract a function to silence a command, except if it fails Alban Gruin
2018-06-25 13:44       ` [GSoC][PATCH v4 2/3] rebase -i: rewrite checkout_onto() in C Alban Gruin
2018-06-26 17:35         ` Junio C Hamano
2018-06-25 13:44       ` [GSoC][PATCH v4 3/3] rebase -i: rewrite setup_reflog_action() " Alban Gruin
2018-06-29 15:14       ` [GSoC][PATCH v5 0/3] rebase -i: rewrite reflog operations " Alban Gruin
2018-06-29 15:14         ` [GSoC][PATCH v5 1/3] sequencer: add a new function to silence a command, except if it fails Alban Gruin
2018-06-29 15:14         ` [GSoC][PATCH v5 2/3] rebase -i: rewrite setup_reflog_action() in C Alban Gruin
2018-06-29 16:50           ` Junio C Hamano
2018-06-29 15:14         ` [GSoC][PATCH v5 3/3] rebase -i: rewrite checkout_onto() " Alban Gruin
2018-06-29 16:55         ` [GSoC][PATCH v5 0/3] rebase -i: rewrite reflog operations " Junio C Hamano
2018-06-29 18:23           ` Junio C Hamano
2018-07-02 10:36             ` Alban Gruin
2018-07-03 18:15               ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180618131844.13408-3-alban.gruin@gmail.com \
    --to=alban.gruin@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=newren@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=predatoramigo@gmail.com \
    --cc=sbeller@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.