All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Denton Liu <liu.denton@gmail.com>,
	Git Mailing List <git@vger.kernel.org>
Cc: Alban Gruin <alban.gruin@gmail.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v5 00/22] merge: learn --autostash
Date: Fri, 10 Apr 2020 16:34:46 +0100	[thread overview]
Message-ID: <eaf864e6-8441-c5a6-3c15-b71c522ec43d@gmail.com> (raw)
In-Reply-To: <cover.1586269542.git.liu.denton@gmail.com>

Hi Denton

On 07/04/2020 15:27, Denton Liu wrote:
 > [...]
> Chagnes since v4:
> 
> * Drop 'sequencer: reuse strbuf_trim() in read_oneliner()'
> 
> * Fix commit message in 'sequencer: make apply_autostash() accept a path'
> 
> * Add more detail in commit message 'sequencer: implement save_autostash()'
> 
> * In 'merge: teach --autostash option', improve documentation, remove
>    builtin/reset.c changes, add a `git merge --quit` test case
> [...]
> Range-diff against v4:
>   1:  c26771e934 =  1:  c26771e934 Makefile: ASCII-sort += lists
>   2:  059e0e8e43 =  2:  059e0e8e43 t7600: use test_write_lines()
>   3:  76585e5b13 =  3:  76585e5b13 sequencer: stop leaking buf
>   4:  c7a3cfa200 <  -:  ---------- sequencer: reuse strbuf_trim() in read_oneliner()

I think it makes sense to drop that one, it was more trouble than it was 
worth in the end

>   5:  58da8e9555 !  4:  dc4674d222 sequencer: make file exists check more efficient
>      @@ Commit message
>           check `errno` to see if the file doesn't exist.
>       
>        ## sequencer.c ##
>      -@@ sequencer.c: static int write_message(const void *buf, size_t len, const char *filename,
>      - static int read_oneliner(struct strbuf *buf,
>      - 	const char *path, int skip_if_empty)
>      +@@ sequencer.c: static int read_oneliner(struct strbuf *buf,
>        {
>      --
>      + 	int orig_len = buf->len;
>      +
>       -	if (!file_exists(path))
>       -		return 0;
>       -
>      - 	strbuf_reset(buf);
>        	if (strbuf_read_file(buf, path, 0) < 0) {
>       -		warning_errno(_("could not read '%s'"), path);
>       +		if (errno != ENOENT && errno != ENOTDIR)
>   6:  6ead240957 !  5:  f30ad07823 sequencer: make read_oneliner() accept flags
>      @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *f
>       +#define READ_ONELINER_SKIP_IF_EMPTY (1 << 0)
>       +
>        /*
>      -  * Resets a strbuf then reads a file that was presumably written by a shell
>      -  * script, i.e. with an end-of-line marker that needs to be stripped.
>      +  * Reads a file that was presumably written by a shell script, i.e. with an
>      +  * end-of-line marker that needs to be stripped.
>       @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *filename,
>         * Returns 1 if the file was read, 0 if it could not be read or does not exist.
>         */
>      @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *f
>       -	const char *path, int skip_if_empty)
>       +	const char *path, unsigned flags)
>        {
>      - 	strbuf_reset(buf);
>      - 	if (strbuf_read_file(buf, path, 0) < 0) {
>      + 	int orig_len = buf->len;
>      +
>       @@ sequencer.c: static int read_oneliner(struct strbuf *buf,
>      + 		buf->buf[buf->len] = '\0';
>      + 	}
>        
>      - 	strbuf_trim(buf);
>      -
>      --	if (skip_if_empty && !buf->len)
>      -+	if ((flags & READ_ONELINER_SKIP_IF_EMPTY) && !buf->len)
>      +-	if (skip_if_empty && buf->len == orig_len)
>      ++	if ((flags & READ_ONELINER_SKIP_IF_EMPTY) && buf->len == orig_len)
>        		return 0;
>        
>        	return 1;
>      @@ sequencer.c: static int read_populate_opts(struct replay_opts *opts)
>        				strbuf_reset(&buf);
>        			else {
>       @@ sequencer.c: static int read_populate_opts(struct replay_opts *opts)
>      - 			}
>      + 			strbuf_reset(&buf);
>        		}
>        
>       -		if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
>      @@ sequencer.c: static int read_populate_opts(struct replay_opts *opts)
>        				opts->allow_rerere_auto = RERERE_AUTOUPDATE;
>        			else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
>       @@ sequencer.c: static int read_populate_opts(struct replay_opts *opts)
>      - 		read_strategy_opts(opts, &buf);
>      + 		strbuf_reset(&buf);
>        
>        		if (read_oneliner(&opts->current_fixups,
>       -				  rebase_path_current_fixups(), 1)) {
>   7:  2e7922b259 !  6:  8c504427e3 sequencer: configurably warn on non-existent files
>      @@ Commit message
>           read_oneliner() will want the ability to output warnings in the event
>           that the `path` doesn't exist. Introduce the
>           `READ_ONELINER_WARN_MISSING` flag which, if active, would issue a
>      -    warning when a file doesn't exist by skipping the `!file_exists()` check
>      -    and letting `strbuf_read_file()` handle that case.
>      +    warning when a file doesn't exist by always executing warning_errno()
>      +    in the case where strbuf_read_file() fails.
>       
>        ## sequencer.c ##
>       @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *filename,
>      @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *f
>       +#define READ_ONELINER_WARN_MISSING (1 << 1)
>        
>        /*
>      -  * Resets a strbuf then reads a file that was presumably written by a shell
>      +  * Reads a file that was presumably written by a shell script, i.e. with an
>       @@ sequencer.c: static int read_oneliner(struct strbuf *buf,
>      - {
>      - 	strbuf_reset(buf);
>      + 	int orig_len = buf->len;
>      +
>        	if (strbuf_read_file(buf, path, 0) < 0) {
>       -		if (errno != ENOENT && errno != ENOTDIR)
>       +		if ((flags & READ_ONELINER_WARN_MISSING) ||
>      -+				(errno != ENOENT && errno != ENOTDIR))
>      ++		    (errno != ENOENT && errno != ENOTDIR))
>        			warning_errno(_("could not read '%s'"), path);
>        		return 0;
>        	}
>   8:  6c3c37994b !  7:  50e93770e7 sequencer: make read_oneliner() extern
>      @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *f
>       -#define READ_ONELINER_WARN_MISSING (1 << 1)
>       -
>       -/*
>      -- * Resets a strbuf then reads a file that was presumably written by a shell
>      -- * script, i.e. with an end-of-line marker that needs to be stripped.
>      +- * Reads a file that was presumably written by a shell script, i.e. with an
>      +- * end-of-line marker that needs to be stripped.
>       - *
>       - * Note that only the last end-of-line marker is stripped, consistent with the
>       - * behavior of "$(cat path)" in a shell script.
>      @@ sequencer.c: static int write_message(const void *buf, size_t len, const char *f
>       +int read_oneliner(struct strbuf *buf,
>        	const char *path, unsigned flags)
>        {
>      - 	strbuf_reset(buf);
>      + 	int orig_len = buf->len;
>       
>        ## sequencer.h ##
>       @@ sequencer.h: void print_commit_summary(struct repository *repo,
>      @@ sequencer.h: void print_commit_summary(struct repository *repo,
>       +#define READ_ONELINER_WARN_MISSING (1 << 1)
>       +
>       +/*
>      -+ * Resets a strbuf then reads a file that was presumably written by a shell
>      -+ * script, i.e. with an end-of-line marker that needs to be stripped.
>      ++ * Reads a file that was presumably written by a shell script, i.e. with an
>      ++ * end-of-line marker that needs to be stripped.
>       + *
>       + * Note that only the last end-of-line marker is stripped, consistent with the
>       + * behavior of "$(cat path)" in a shell script.
>   9:  689f34a2a5 !  8:  0cc279fc14 rebase: use read_oneliner()
>      @@ Commit message
>       
>           Since in sequencer.c, read_one() basically duplicates the functionality
>           of read_oneliner(), reduce code duplication by replacing read_one() with
>      -    read_oneliner(). Also, delete strbuf_reset() calls prior to
>      -    read_oneliner() as read_oneliner() already resets the strbuf.
>      +    read_oneliner().
>       
>      -    This was mostly done with the following Coccinelle script
>      +    This was done with the following Coccinelle script
>       
>                   @@
>                   expression a, b;
>      @@ Commit message
>                   - read_one(a, b)
>                   + !read_oneliner(b, a, READ_ONELINER_WARN_NON_EXISTENCE)
>       
>      -    Long lines were broken up and strbuf_reset()s were deleted manually.
>      +    and long lines were manually broken up.
>       
>        ## builtin/rebase.c ##
>       @@ builtin/rebase.c: static const char *state_dir_path(const char *filename, struct rebase_options *o
>      @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        	opts->head_name = starts_with(head_name.buf, "refs/") ?
>        		xstrdup(head_name.buf) : NULL;
>       @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>      - 	 * head. Fall back to reading from head to cover for the case that the
>      - 	 * user upgraded git with an ongoing interactive rebase.
>        	 */
>      --	strbuf_reset(&buf);
>      + 	strbuf_reset(&buf);
>        	if (file_exists(state_dir_path("orig-head", opts))) {
>       -		if (read_one(state_dir_path("orig-head", opts), &buf))
>       +		if (!read_oneliner(&buf, state_dir_path("orig-head", opts),
>      @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        	if (get_oid(buf.buf, &opts->orig_head))
>        		return error(_("invalid orig-head: '%s'"), buf.buf);
>       @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>      - 	}
>        
>        	if (file_exists(state_dir_path("allow_rerere_autoupdate", opts))) {
>      --		strbuf_reset(&buf);
>      + 		strbuf_reset(&buf);
>       -		if (read_one(state_dir_path("allow_rerere_autoupdate", opts),
>       -			    &buf))
>       +		if (!read_oneliner(&buf, state_dir_path("allow_rerere_autoupdate", opts),
>      @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        		if (!strcmp(buf.buf, "--rerere-autoupdate"))
>        			opts->allow_rerere_autoupdate = RERERE_AUTOUPDATE;
>       @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>      - 	}
>        
>        	if (file_exists(state_dir_path("gpg_sign_opt", opts))) {
>      --		strbuf_reset(&buf);
>      + 		strbuf_reset(&buf);
>       -		if (read_one(state_dir_path("gpg_sign_opt", opts),
>       -			    &buf))
>       +		if (!read_oneliner(&buf, state_dir_path("gpg_sign_opt", opts),
>      @@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        			return -1;
>        		free(opts->gpg_sign_opt);
>        		opts->gpg_sign_opt = xstrdup(buf.buf);
>      - 	}
>      +@@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        
>        	if (file_exists(state_dir_path("strategy", opts))) {
>      --		strbuf_reset(&buf);
>      + 		strbuf_reset(&buf);
>       -		if (read_one(state_dir_path("strategy", opts), &buf))
>       +		if (!read_oneliner(&buf, state_dir_path("strategy", opts),
>       +				   READ_ONELINER_WARN_MISSING))
>        			return -1;
>        		free(opts->strategy);
>        		opts->strategy = xstrdup(buf.buf);
>      - 	}
>      +@@ builtin/rebase.c: static int read_basic_state(struct rebase_options *opts)
>        
>        	if (file_exists(state_dir_path("strategy_opts", opts))) {
>      --		strbuf_reset(&buf);
>      + 		strbuf_reset(&buf);
>       -		if (read_one(state_dir_path("strategy_opts", opts), &buf))
>       +		if (!read_oneliner(&buf, state_dir_path("strategy_opts", opts),
>       +				   READ_ONELINER_WARN_MISSING))

So up to here I think all the changes since v4 are due to the dropped 
patch bar the rewording of the message in patch 7 that drops the 
reference to file_exists()

Junio pointed out a typo in the message to patch 9, apart from that it 
all looks good to me

> 10:  e0b8e409af !  9:  3dbed2a832 sequencer: make apply_rebase() accept a path
>      @@ Metadata
>       Author: Denton Liu <liu.denton@gmail.com>
>       
>        ## Commit message ##
>      -    sequencer: make apply_rebase() accept a path
>      +    sequencer: make apply_autostash() accept a path
>       
>      -    In order to make apply_rebase() more generic for future extraction, make
>      +    In order to make apply_autostash() more generic for future extraction, make

Thanks for fixing that

>           it accept a `path` argument so that the location from where to read the
>           reference to the autostash commit can be customized. Remove the `opts`
>           argument since it was unused before anyway.
> 11:  a52583beff = 10:  937b4964d1 sequencer: rename stash_sha1 to stash_oid
> 12:  389b17df33 = 11:  98a7f5280c rebase: use apply_autostash() from sequencer.c
> 13:  fe57e21dbc = 12:  67f3b5c225 rebase: generify reset_head()
> 14:  045668620d = 13:  af5e808667 reset: extract reset_head() from rebase
> 15:  d5f51cd80e = 14:  114d9a7655 rebase: extract create_autostash()
> 16:  9ab10d23d4 = 15:  c2ed4cd39d rebase: generify create_autostash()
> 17:  26cca49be6 = 16:  3be4a27dfe sequencer: extract perform_autostash() from rebase
> 18:  e703022fda = 17:  129d5d97ae sequencer: unlink autostash in apply_autostash()
> 19:  75dc3f10a1 ! 18:  7e04ce8d8e sequencer: implement save_autostash()
>      @@ Commit message
>           function will be used in a future commit.
>       
>           The difference between save_autostash() and apply_autostash() is that
>      -    the latter does not try to apply the stash. It skips that step and
>      +    the former does not try to apply the stash. It skips that step and
>           just stores the created entry in the stash reflog.
>       
>      +    This is useful in the case where we abort an operation when an autostash
>      +    is present but we don't want to dirty the worktree with the application
>      +    of the stash. For example, in a future commit, we will implement
>      +    `git merge --autostash`. Since merges can be aborted using
>      +    `git reset --hard`, we'd make use of save_autostash() to save the
>      +    autostash entry instead of applying it to the worktree thus keeping the
>      +    worktree undirtied.

The reason for the change is much clearer now thanks

>      +
>        ## sequencer.c ##
>       @@ sequencer.c: void create_autostash(struct repository *r, const char *path,
>        	strbuf_release(&buf);
> 20:  598ddea6c1 = 19:  732b3f9945 sequencer: implement apply_autostash_oid()
> 21:  7adf794192 ! 20:  f9f698b79a merge: teach --autostash option
>      @@ Commit message
>           `git reset --hard`, the autostash is saved into the stash reflog
>           instead keeping the worktree clean.
>       
>      +    Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
>           Suggested-by: Alban Gruin <alban.gruin@gmail.com>
>       
>        ## Documentation/config/merge.txt ##
>      @@ Documentation/git-merge.txt: will be appended to the specified message.
>        	Abort the current conflict resolution process, and
>       -	try to reconstruct the pre-merge state.
>       +	try to reconstruct the pre-merge state. If an autostash entry is
>      -+	present, apply it back to the worktree.
>      ++	present, apply it to the worktree.
>        +
>        If there were uncommitted worktree changes present when the merge
>        started, 'git merge --abort' will in some cases be unable to
>      @@ Documentation/git-merge.txt: reconstruct these changes. It is therefore recommen
>        +
>        'git merge --abort' is equivalent to 'git reset --merge' when
>       -`MERGE_HEAD` is present.
>      -+`MERGE_HEAD` is present unless `MERGE_AUTOSTASH` is also present where
>      -+the stash entry is applied to the worktree.
>      ++`MERGE_HEAD` is present unless `MERGE_AUTOSTASH` is also present in
>      ++which case 'git merge --abort' applies the stash entry to the worktree
>      ++whereas 'git reset --merge' will save the stashed changes in the stash
>      ++reflog.
>        
>        --quit::
>        	Forget about the current merge in progress. Leave the index
>      +-	and the working tree as-is.
>      ++	and the working tree as-is. If `MERGE_AUTOSTASH` is present, the
>      ++	stash entry will be saved to the stash reflog.

Thanks for adding that

>      +
>      + --continue::
>      + 	After a 'git merge' stops due to conflicts you can conclude the
>       
>        ## Documentation/merge-options.txt ##
>       @@ Documentation/merge-options.txt: ifndef::git-pull[]
>      @@ builtin/merge.c: int cmd_merge(int argc, const char **argv, const char *prefix)
>        			die(_("There is no merge to abort (MERGE_HEAD missing)."));
>        
>       +		if (read_oneliner(&stash_oid, git_path_merge_autostash(the_repository),
>      -+			   READ_ONELINER_SKIP_IF_EMPTY)) {
>      -+			strbuf_trim(&stash_oid);

Makes sense, we are in control of the file so don't need to trim the 
contents

>      ++		    READ_ONELINER_SKIP_IF_EMPTY))
>       +			unlink(git_path_merge_autostash(the_repository));
>      -+		}
>       +
>        		/* Invoke 'git reset --merge' */
>        		ret = cmd_reset(nargc, nargv, prefix);
>      @@ builtin/rebase.c: int cmd_rebase(int argc, const char **argv, const char *prefix
>        				N_("add exec lines after each commit of the "
>        				   "editable list")),
>       
>      - ## builtin/reset.c ##
>      -@@
>      - #include "cache-tree.h"
>      - #include "submodule.h"
>      - #include "submodule-config.h"
>      -+#include "sequencer.h"
>      -
>      - #define REFRESH_INDEX_DELAY_WARNING_IN_MS (2 * 1000)
>      -
>      -@@ builtin/reset.c: int cmd_reset(int argc, const char **argv, const char *prefix)
>      - 		if (reset_type == HARD && !update_ref_status && !quiet)
>      - 			print_new_head_line(lookup_commit_reference(the_repository, &oid));
>      - 	}
>      --	if (!pathspec.nr)
>      -+	if (!pathspec.nr) {
>      - 		remove_branch_state(the_repository, 0);
>      -+	}
>      -
>      - 	return update_ref_status;
>      - }
>      -
>        ## parse-options.h ##
>       @@ parse-options.h: int parse_opt_passthru_argv(const struct option *, const char *, int);
>        #define OPT_CLEANUP(v) OPT_STRING(0, "cleanup", v, N_("mode"), N_("how to strip spaces and #comments from message"))
>      @@ t/t7600-merge.sh: test_expect_success 'refresh the index before merging' '
>       +	git diff --exit-code
>       +'
>       +
>      ++test_expect_success 'quit merge with --no-commit and --autostash' '
>      ++	git reset --hard c1 &&
>      ++	git merge-file file file.orig file.9 &&
>      ++	git diff >expect &&
>      ++	git merge --no-commit --autostash c2 &&
>      ++	git stash show -p MERGE_AUTOSTASH >actual &&
>      ++	test_cmp expect actual &&
>      ++	git diff HEAD >expect &&
>      ++	git merge --quit 2>err &&
>      ++	test_i18ngrep "Autostash exists; creating a new stash entry." err &&
>      ++	git diff HEAD >actual &&
>      ++	test_cmp expect actual
>      ++'
>      ++

Thanks for the new test

Looking at the range-diff this series looks fine to me now apart from 
the typo Junio pointed out.

Thanks

Phillip

>       +test_expect_success 'merge with conflicted --autostash changes' '
>       +	git reset --hard c1 &&
>       +	git merge-file file file.orig file.9y &&
> 22:  f1e54622fb = 21:  13f3fadbef t5520: make test_pull_autostash() accept expect_parent_num
> 23:  177c7e537b = 22:  f4fec1e780 pull: pass --autostash to merge
> 

  parent reply	other threads:[~2020-04-10 15:34 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-16 17:26 [RFC PATCH 0/7] merge: learn --autostash Denton Liu
2019-10-16 17:26 ` [RFC PATCH 1/7] Makefile: alphabetically sort += lists Denton Liu
2019-10-17 18:07   ` Junio C Hamano
2019-10-21 18:44     ` Johannes Schindelin
2019-10-21 18:53       ` Denton Liu
2019-10-22 23:33         ` Johannes Schindelin
2019-10-21 19:49       ` Junio C Hamano
2019-10-21 19:54         ` Jeff King
2019-10-22 11:34           ` Junio C Hamano
2019-10-16 17:26 ` [RFC PATCH 2/7] autostash: extract read_one() from rebase Denton Liu
2019-10-18  9:04   ` Phillip Wood
2019-10-21 18:46     ` Johannes Schindelin
2019-10-16 17:26 ` [RFC PATCH 3/7] autostash: extract apply_autostash() " Denton Liu
2019-10-16 17:26 ` [RFC PATCH 4/7] autostash: extract reset_head() " Denton Liu
2019-10-18  9:37   ` Phillip Wood
2019-10-21 18:56     ` Johannes Schindelin
2019-10-16 17:26 ` [RFC PATCH 5/7] autostash: extract perform_autostash() " Denton Liu
2019-10-21 19:00   ` Johannes Schindelin
2019-10-16 17:26 ` [RFC PATCH 6/7] autostash.c: undefine USE_THE_INDEX_COMPATIBILITY_MACROS Denton Liu
2019-10-18  9:41   ` Phillip Wood
2019-10-16 17:26 ` [RFC PATCH 7/7] merge: teach --autostash option Denton Liu
2019-10-18  9:46   ` Phillip Wood
2019-12-24  9:58     ` Denton Liu
2019-10-21 19:10   ` Johannes Schindelin
2019-12-24 10:05     ` Denton Liu
2019-12-24 10:12       ` Denton Liu
2019-12-24 11:04 ` [PATCH v2 00/17] merge: learn --autostash Denton Liu
2019-12-24 11:04   ` [PATCH v2 01/17] Makefile: alphabetically sort += lists Denton Liu
2019-12-30 21:38     ` Junio C Hamano
2019-12-24 11:04   ` [PATCH v2 02/17] t7600: use test_write_lines() Denton Liu
2019-12-24 11:05   ` [PATCH v2 03/17] sequencer: use file strbuf for read_oneliner() Denton Liu
2019-12-24 11:05   ` [PATCH v2 04/17] sequencer: configurably warn on non-existent files Denton Liu
2019-12-26 20:39     ` Junio C Hamano
2019-12-24 11:05   ` [PATCH v2 05/17] sequencer: make read_oneliner() extern Denton Liu
2019-12-24 11:05   ` [PATCH v2 06/17] rebase: use read_oneliner() Denton Liu
2019-12-24 11:05   ` [PATCH v2 07/17] sequencer: make apply_rebase() accept a path Denton Liu
2019-12-24 11:05   ` [PATCH v2 08/17] rebase: use apply_autostash() from sequencer.c Denton Liu
2019-12-24 11:05   ` [PATCH v2 09/17] rebase: generify reset_head() Denton Liu
2019-12-24 11:05   ` [PATCH v2 10/17] reset: extract reset_head() from rebase Denton Liu
2019-12-24 11:05   ` [PATCH v2 11/17] rebase: extract create_autostash() Denton Liu
2019-12-24 11:05   ` [PATCH v2 12/17] rebase: generify create_autostash() Denton Liu
2019-12-24 11:05   ` [PATCH v2 13/17] sequencer: extract perform_autostash() from rebase Denton Liu
2019-12-24 11:05   ` [PATCH v2 14/17] sequencer: unlink autostash in apply_autostash() Denton Liu
2019-12-24 11:05   ` [PATCH v2 15/17] merge: teach --autostash option Denton Liu
2019-12-24 11:05   ` [PATCH v2 16/17] t5520: make test_pull_autostash() accept expect_parent_num Denton Liu
2019-12-24 11:05   ` [PATCH v2 17/17] pull: pass --autostash to merge Denton Liu
2019-12-30 21:49   ` [PATCH v2 00/17] merge: learn --autostash Junio C Hamano
2019-12-31 10:34     ` Phillip Wood
2020-01-08  6:08       ` Denton Liu
2020-01-10 14:44         ` Phillip Wood
2020-01-15 16:20           ` Denton Liu
2020-01-01  7:48     ` Denton Liu
2020-03-21  9:21   ` [PATCH v3 00/19] " Denton Liu
2020-03-21  9:21     ` [PATCH v3 01/19] Makefile: ASCII-sort += lists Denton Liu
2020-03-21  9:21     ` [PATCH v3 02/19] t7600: use test_write_lines() Denton Liu
2020-03-21  9:21     ` [PATCH v3 03/19] sequencer: use file strbuf for read_oneliner() Denton Liu
2020-04-02 13:34       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 04/19] sequencer: make read_oneliner() accept flags Denton Liu
2020-03-21  9:21     ` [PATCH v3 05/19] sequencer: configurably warn on non-existent files Denton Liu
2020-04-02 13:39       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 06/19] sequencer: make read_oneliner() extern Denton Liu
2020-03-21  9:21     ` [PATCH v3 07/19] rebase: use read_oneliner() Denton Liu
2020-04-02 13:41       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 08/19] sequencer: make apply_rebase() accept a path Denton Liu
2020-03-21  9:21     ` [PATCH v3 09/19] rebase: use apply_autostash() from sequencer.c Denton Liu
2020-04-02 14:59       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 10/19] rebase: generify reset_head() Denton Liu
2020-03-21  9:21     ` [PATCH v3 11/19] reset: extract reset_head() from rebase Denton Liu
2020-04-02 15:04       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 12/19] rebase: extract create_autostash() Denton Liu
2020-03-21  9:21     ` [PATCH v3 13/19] rebase: generify create_autostash() Denton Liu
2020-03-21  9:21     ` [PATCH v3 14/19] sequencer: extract perform_autostash() from rebase Denton Liu
2020-03-21  9:21     ` [PATCH v3 15/19] sequencer: unlink autostash in apply_autostash() Denton Liu
2020-03-21  9:21     ` [PATCH v3 16/19] sequencer: implement save_autostash() Denton Liu
2020-04-02 15:10       ` Phillip Wood
2020-03-21  9:21     ` [PATCH v3 17/19] merge: teach --autostash option Denton Liu
2020-04-02 15:24       ` Phillip Wood
2020-04-03 10:31         ` Denton Liu
2020-04-03 10:56           ` Denton Liu
2020-04-03 13:09             ` Phillip Wood
2020-04-03 21:14               ` Denton Liu
2020-04-03 13:34           ` Phillip Wood
2020-04-03 22:25             ` Denton Liu
2020-03-21  9:21     ` [PATCH v3 18/19] t5520: make test_pull_autostash() accept expect_parent_num Denton Liu
2020-03-21  9:21     ` [PATCH v3 19/19] pull: pass --autostash to merge Denton Liu
2020-04-02 16:07       ` Phillip Wood
2020-04-04  1:11     ` [PATCH v4 00/23] merge: learn --autostash Denton Liu
2020-04-04  1:11       ` [PATCH v4 01/23] Makefile: ASCII-sort += lists Denton Liu
2020-04-04  1:11       ` [PATCH v4 02/23] t7600: use test_write_lines() Denton Liu
2020-04-04  1:11       ` [PATCH v4 03/23] sequencer: stop leaking buf Denton Liu
2020-04-05 21:33         ` Junio C Hamano
2020-04-05 21:37           ` Junio C Hamano
2020-04-05 23:42           ` Denton Liu
2020-04-04  1:11       ` [PATCH v4 04/23] sequencer: reuse strbuf_trim() in read_oneliner() Denton Liu
2020-04-05 21:46         ` Junio C Hamano
2020-04-06  1:39           ` Denton Liu
2020-04-06 14:03         ` Phillip Wood
2020-04-06 14:42           ` Phillip Wood
2020-04-07 13:56             ` Denton Liu
2020-04-04  1:11       ` [PATCH v4 05/23] sequencer: make file exists check more efficient Denton Liu
2020-04-04  1:11       ` [PATCH v4 06/23] sequencer: make read_oneliner() accept flags Denton Liu
2020-04-04  1:11       ` [PATCH v4 07/23] sequencer: configurably warn on non-existent files Denton Liu
2020-04-06 14:45         ` Phillip Wood
2020-04-04  1:11       ` [PATCH v4 08/23] sequencer: make read_oneliner() extern Denton Liu
2020-04-04  1:11       ` [PATCH v4 09/23] rebase: use read_oneliner() Denton Liu
2020-04-04  1:11       ` [PATCH v4 10/23] sequencer: make apply_rebase() accept a path Denton Liu
2020-04-06 15:07         ` Phillip Wood
2020-04-04  1:11       ` [PATCH v4 11/23] sequencer: rename stash_sha1 to stash_oid Denton Liu
2020-04-04  1:11       ` [PATCH v4 12/23] rebase: use apply_autostash() from sequencer.c Denton Liu
2020-04-04  1:11       ` [PATCH v4 13/23] rebase: generify reset_head() Denton Liu
2020-04-04  1:11       ` [PATCH v4 14/23] reset: extract reset_head() from rebase Denton Liu
2020-04-04  1:11       ` [PATCH v4 15/23] rebase: extract create_autostash() Denton Liu
2020-04-04  1:11       ` [PATCH v4 16/23] rebase: generify create_autostash() Denton Liu
2020-04-04  1:11       ` [PATCH v4 17/23] sequencer: extract perform_autostash() from rebase Denton Liu
2020-04-04  1:11       ` [PATCH v4 18/23] sequencer: unlink autostash in apply_autostash() Denton Liu
2020-04-04  1:11       ` [PATCH v4 19/23] sequencer: implement save_autostash() Denton Liu
2020-04-06 15:15         ` Phillip Wood
2020-04-04  1:11       ` [PATCH v4 20/23] sequencer: implement apply_autostash_oid() Denton Liu
2020-04-04  1:11       ` [PATCH v4 21/23] merge: teach --autostash option Denton Liu
2020-04-06 15:20         ` Phillip Wood
2020-04-07 13:09           ` Denton Liu
2020-04-07 15:06             ` Phillip Wood
2020-04-04  1:11       ` [PATCH v4 22/23] t5520: make test_pull_autostash() accept expect_parent_num Denton Liu
2020-04-04  1:11       ` [PATCH v4 23/23] pull: pass --autostash to merge Denton Liu
2020-04-07 14:27       ` [PATCH v5 00/22] merge: learn --autostash Denton Liu
2020-04-07 14:27         ` [PATCH v5 01/22] Makefile: ASCII-sort += lists Denton Liu
2020-04-07 14:27         ` [PATCH v5 02/22] t7600: use test_write_lines() Denton Liu
2020-04-07 14:27         ` [PATCH v5 03/22] sequencer: stop leaking buf Denton Liu
2020-04-07 14:27         ` [PATCH v5 04/22] sequencer: make file exists check more efficient Denton Liu
2020-04-08  0:10           ` Junio C Hamano
2020-04-07 14:27         ` [PATCH v5 05/22] sequencer: make read_oneliner() accept flags Denton Liu
2020-04-08  0:11           ` Junio C Hamano
2020-04-07 14:27         ` [PATCH v5 06/22] sequencer: configurably warn on non-existent files Denton Liu
2020-04-07 14:27         ` [PATCH v5 07/22] sequencer: make read_oneliner() extern Denton Liu
2020-04-07 14:27         ` [PATCH v5 08/22] rebase: use read_oneliner() Denton Liu
2020-04-08  0:26           ` Junio C Hamano
2020-04-07 14:27         ` [PATCH v5 09/22] sequencer: make apply_autostash() accept a path Denton Liu
2020-04-07 14:27         ` [PATCH v5 10/22] sequencer: rename stash_sha1 to stash_oid Denton Liu
2020-04-07 14:27         ` [PATCH v5 11/22] rebase: use apply_autostash() from sequencer.c Denton Liu
2020-04-07 14:27         ` [PATCH v5 12/22] rebase: generify reset_head() Denton Liu
2020-04-07 14:28         ` [PATCH v5 13/22] reset: extract reset_head() from rebase Denton Liu
2020-04-07 14:28         ` [PATCH v5 14/22] rebase: extract create_autostash() Denton Liu
2020-04-07 14:28         ` [PATCH v5 15/22] rebase: generify create_autostash() Denton Liu
2020-04-07 14:28         ` [PATCH v5 16/22] sequencer: extract perform_autostash() from rebase Denton Liu
2020-04-07 14:28         ` [PATCH v5 17/22] sequencer: unlink autostash in apply_autostash() Denton Liu
2020-04-07 14:28         ` [PATCH v5 18/22] sequencer: implement save_autostash() Denton Liu
2020-04-07 14:28         ` [PATCH v5 19/22] sequencer: implement apply_autostash_oid() Denton Liu
2020-04-07 14:28         ` [PATCH v5 20/22] merge: teach --autostash option Denton Liu
2020-04-07 14:28         ` [PATCH v5 21/22] t5520: make test_pull_autostash() accept expect_parent_num Denton Liu
2020-04-07 14:28         ` [PATCH v5 22/22] pull: pass --autostash to merge Denton Liu
2020-04-10 15:34         ` Phillip Wood [this message]
2020-04-10 16:26           ` [PATCH v5 00/22] merge: learn --autostash 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=eaf864e6-8441-c5a6-3c15-b71c522ec43d@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=alban.gruin@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=liu.denton@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    /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.