Subject: Re: [PATCH v8 3/4] sequencer: teach autostash apply to take optional conflict marker labels

From: Phillip Wood <[email-masked]>
Date: Fri, 10 Apr 2026 16:39:34 +0100

Hi Harald

On 09/04/2026 20:17, Harald Nordgren via GitGitGadget wrote:
> From: Harald Nordgren <[email-masked]>
> 
> Add label1, label2, and label_ancestor parameters to the autostash
> apply machinery so callers can pass custom conflict marker labels
> through to "git stash apply --ours-label/--theirs-label/--base-label".
> Introduce apply_autostash_ref_with_labels() for callers that want
> to pass labels.

This looks good. In the future we could use this to set some better 
labels for "git rebase --autostash" but that does not need to be part of 
this series.

I'll leave it there for today and take a look at the last patch next 
week. It would be a good idea to wait a few days to see if anyone else 
has any comments before sending a new version.

Thanks

Phillip

> Signed-off-by: Harald Nordgren <[email-masked]>
> ---
>   sequencer.c | 34 +++++++++++++++++++++++++++-------
>   sequencer.h |  3 +++
>   2 files changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/sequencer.c b/sequencer.c
> index e500a94a59..e28d30ff7b 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -4729,7 +4729,9 @@ void create_autostash_ref_silent(struct repository *r, const char *refname)
>   	create_autostash_internal(r, NULL, refname, 1);
>   }
>   
> -static int apply_save_autostash_oid(const char *stash_oid, int attempt_apply)
> +static int apply_save_autostash_oid(const char *stash_oid, int attempt_apply,
> +				    const char *label_ours, const char *label_theirs,
> +				    const char *label_base)
>   {
>   	struct child_process child = CHILD_PROCESS_INIT;
>   	int ret = 0;
> @@ -4740,6 +4742,12 @@ static int apply_save_autostash_oid(const char *stash_oid, int attempt_apply)
>   		child.no_stderr = 1;
>   		strvec_push(&child.args, "stash");
>   		strvec_push(&child.args, "apply");
> +		if (label_ours)
> +			strvec_pushf(&child.args, "--ours-label=%s", label_ours);
> +		if (label_theirs)
> +			strvec_pushf(&child.args, "--theirs-label=%s", label_theirs);
> +		if (label_base)
> +			strvec_pushf(&child.args, "--base-label=%s", label_base);
>   		strvec_push(&child.args, stash_oid);
>   		ret = run_command(&child);
>   	}
> @@ -4784,7 +4792,8 @@ static int apply_save_autostash(const char *path, int attempt_apply)
>   	}
>   	strbuf_trim(&stash_oid);
>   
> -	ret = apply_save_autostash_oid(stash_oid.buf, attempt_apply);
> +	ret = apply_save_autostash_oid(stash_oid.buf, attempt_apply,
> +				      NULL, NULL, NULL);
>   
>   	unlink(path);
>   	strbuf_release(&stash_oid);
> @@ -4803,11 +4812,13 @@ int apply_autostash(const char *path)
>   
>   int apply_autostash_oid(const char *stash_oid)
>   {
> -	return apply_save_autostash_oid(stash_oid, 1);
> +	return apply_save_autostash_oid(stash_oid, 1, NULL, NULL, NULL);
>   }
>   
>   static int apply_save_autostash_ref(struct repository *r, const char *refname,
> -				    int attempt_apply)
> +				    int attempt_apply,
> +				    const char *label_ours, const char *label_theirs,
> +				    const char *label_base)
>   {
>   	struct object_id stash_oid;
>   	char stash_oid_hex[GIT_MAX_HEXSZ + 1];
> @@ -4823,7 +4834,8 @@ static int apply_save_autostash_ref(struct repository *r, const char *refname,
>   		return error(_("autostash reference is a symref"));
>   
>   	oid_to_hex_r(stash_oid_hex, &stash_oid);
> -	ret = apply_save_autostash_oid(stash_oid_hex, attempt_apply);
> +	ret = apply_save_autostash_oid(stash_oid_hex, attempt_apply,
> +				       label_ours, label_theirs, label_base);
>   
>   	refs_delete_ref(get_main_ref_store(r), "", refname,
>   			&stash_oid, REF_NO_DEREF);
> @@ -4833,12 +4845,20 @@ static int apply_save_autostash_ref(struct repository *r, const char *refname,
>   
>   int save_autostash_ref(struct repository *r, const char *refname)
>   {
> -	return apply_save_autostash_ref(r, refname, 0);
> +	return apply_save_autostash_ref(r, refname, 0, NULL, NULL, NULL);
>   }
>   
>   int apply_autostash_ref(struct repository *r, const char *refname)
>   {
> -	return apply_save_autostash_ref(r, refname, 1);
> +	return apply_save_autostash_ref(r, refname, 1, NULL, NULL, NULL);
> +}
> +
> +int apply_autostash_ref_with_labels(struct repository *r, const char *refname,
> +				    const char *label_ours, const char *label_theirs,
> +				    const char *label_base)
> +{
> +	return apply_save_autostash_ref(r, refname, 1,
> +					label_ours, label_theirs, label_base);
>   }
>   
>   static int checkout_onto(struct repository *r, struct replay_opts *opts,
> diff --git a/sequencer.h b/sequencer.h
> index 570f804457..2c4ff17c4e 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -236,6 +236,9 @@ int save_autostash_ref(struct repository *r, const char *refname);
>   int apply_autostash(const char *path);
>   int apply_autostash_oid(const char *stash_oid);
>   int apply_autostash_ref(struct repository *r, const char *refname);
> +int apply_autostash_ref_with_labels(struct repository *r, const char *refname,
> +				    const char *label_ours, const char *label_theirs,
> +				    const char *label_base);
>   
>   #define SUMMARY_INITIAL_COMMIT   (1 << 0)
>   #define SUMMARY_SHOW_AUTHOR_DATE (1 << 1)