[PATCH v2] dim: Check that patches have git-format-patch default prefixes
Daniel Vetter
daniel at ffwll.ch
Thu Jan 27 08:00:36 UTC 2022
On Sat, Jan 15, 2022 at 12:33:29PM +0100, Javier Martinez Canillas wrote:
> By default the git-format-patch command generates patches with prefixes
> for the source and destination (-p1), and is also what git-am uses as a
> default. The command strips the first leading path component when patch
> is applied (unless a different -p<num> argument is used).
>
> But the patch generating behaviour can be changed with git-format-patch
> --no-prefix argument (or setting 'diff.noprefix = true' in .gitconfig).
>
> Patches with no source and destination prefixes can confuse the git-am
> 3-way merge logic, since stripping the first path component will lead
> to wrong paths for newly added files.
>
> To avoid this, check that patches to apply are using git-format-patch's
> defaults prefixes to make sure that git-am defaults are safe to use too.
>
> Since there are developers that generate patches without using git, make
> this an error but allow to still continue when using the dim -f option.
>
> Signed-off-by: Javier Martinez Canillas <javierm at redhat.com>
> ---
>
> Changes in v2:
> - Use warn_or_fail instead of always making this an error (Daniel).
Pushed, thanks for respinning.
-Daniel
>
> dim | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/dim b/dim
> index fb0dce98fb5c..1193fe056bce 100755
> --- a/dim
> +++ b/dim
> @@ -1113,6 +1113,18 @@ function check_merge_baseline
> fi
> }
>
> +# ensure the patch has prefixes (-p1), since otherwise it can confuse the git am
> +# 3-way merge logic. check the default source (a/) and destination (b/) prefixes.
> +function check_diff_prefix
> +{
> + local rv
> + patch="$1"
> +
> + rv=$(grep -q -E "^diff --git a\/.+ b\/.+$" $patch)
> +
> + return $rv
> +}
> +
> # ensure we're on branch $1, and apply patches. the rest of the arguments are
> # passed to git am.
> dim_alias_ab=apply-branch
> @@ -1139,6 +1151,11 @@ function dim_apply_branch
> git mailsplit -b -o$dir $file > /dev/null
>
> for patch in "$dir"/*; do
> +
> + if ! check_diff_prefix "$patch"; then
> + warn_or_fail "Patch does not contain prefixes in its diff and can confuse git-am when applying"
> + fi
> +
> if ! apply_patch $patch "$@"; then
> rv=1
> fi
> --
> 2.33.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the dim-tools
mailing list