git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH/GSoC] pull: implement --[no-]autostash for usage when rebasing

From
Chirayu Desai <chirayudesai1@gmail.com>
Date
Mar 19, 2016, 13:57 UTC
Message-ID
<1458395862-5113-1-git-send-email-chirayudesai1@gmail.com>

Since 53c76dc0 pull understands the "rebase.autoStash" configuration option, which was added to rebase in 58794775

This allows usage of the same option when running 'git pull --rebase', passing it on to 'git rebase'

Signed-off-by: Chirayu Desai <chirayudesai1@gmail.com>
---
 Documentation/git-pull.txt |  7 +++++++
 builtin/pull.c             | 10 ++++++++++
 t/t5544-pull-autostash.sh  | 37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+)
 create mode 100755 t/t5544-pull-autostash.sh
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index a62a2a615d..24db186c50 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -128,6 +128,13 @@ unless you have read linkgit:git-rebase[1] carefully.
 --no-rebase::
 	Override earlier --rebase.
 
+--[no-]autostash::
+	Automatically create a temporary stash before the operation
+	begins, and apply it after the operation ends.  This means
+	that you can run pull & rebase on a dirty worktree.  However,
+	use with care: the final stash application after a successful
+	rebase might result in non-trivial conflicts.
+
 Options related to fetching
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/builtin/pull.c b/builtin/pull.c
index 10eff03967..c22ce737ce 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -89,6 +89,7 @@ static char *opt_verify_signatures;
 static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
 static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
 static char *opt_gpg_sign;
+static char *opt_autostash;
 
 /* Options passed to git-fetch */
 static char *opt_all;
@@ -159,6 +160,8 @@ static struct option pull_options[] = {
 	OPT_PASSTHRU('S', "gpg-sign", &opt_gpg_sign, N_("key-id"),
 		N_("GPG sign commit"),
 		PARSE_OPT_OPTARG),
+	OPT_PASSTHRU(0, "autostash", &opt_autostash, NULL,
+		N_("automatically stash before pull, and apply it after rebase"), PARSE_OPT_NOARG),
 
 	/* Options passed to git-fetch */
 	OPT_GROUP(N_("Options related to fetching")),
@@ -798,6 +801,9 @@ static int run_rebase(const unsigned char *curr_head,
 	else
 		argv_array_push(&args, sha1_to_hex(merge_head));
 
+	if (opt_autostash)
+		argv_array_push(&args, opt_autostash);
+
 	ret = run_command_v_opt(args.argv, RUN_GIT_CMD);
 	argv_array_clear(&args);
 	return ret;
@@ -841,6 +847,10 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 			die(_("Updating an unborn branch with changes added to the index."));
 
 		git_config_get_bool("rebase.autostash", &autostash);
+		if (!strcmp(opt_autostash, "--autostash"))
+			autostash = 1;
+		if (!strcmp(opt_autostash, "--no-autostash"))
+			autostash = 0;
 		if (!autostash)
 			die_on_unclean_work_tree(prefix);
 
diff --git a/t/t5544-pull-autostash.sh b/t/t5544-pull-autostash.sh
new file mode 100755
index 0000000000..7f8309ef43
--- /dev/null
+++ b/t/t5544-pull-autostash.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+test_description='git pull --[no-]autostash tests'
+. ./test-lib.sh
+
+test_expect_success setup '
+	echo file >file &&
+	git add file &&
+	git commit -a -m original &&
+	git checkout -b test master &&
+	echo modified file >file &&
+	git commit -m file file
+'
+
+test_expect_success 'pull --rebase --autostash succeeds with dirty working directory' '
+	git checkout -b test1 master &&
+	git reset --hard master &&
+	git log -1 &&
+	echo dirty >new_file &&
+	git add new_file &&
+	git pull --rebase --autostash . test &&
+	test "$(cat new_file)" = dirty &&
+	test "$(cat file)" = "modified file"
+'
+
+test_expect_success 'pull --rebase --no-autostash fails with dirty working directory' '
+	git checkout -b test2 master &&
+	git reset --hard master &&
+	git log -1 &&
+	echo dirty >new_file &&
+	git add new_file &&
+	test_must_fail git pull --rebase --no-autostash . test &&
+	test "$(cat new_file)" = dirty &&
+	test "$(cat file)" = "file"
+'
+
+test_done
\ No newline at end of file
-- 
2.7.4
Next: Chirayu Desai
Message 1 of 4 in “pull: implement --[no-]autostash for usage when rebasing”
  1. pull: implement --[no-]autostash for usage when rebasingChirayu Desai, Mar 19, 2016
  2. Chirayu DesaiMar 19, 2016
  3. Sidhant SharmaMar 19, 2016
  4. Chirayu DesaiMar 19, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.