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 <javi...@redhat.com> --- Changes in v2: - Use warn_or_fail instead of always making this an error (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