From 94762b1356ebdcb8ec486a86f45e69ef77a69465 Mon Sep 17 00:00:00 2001
From: Jerome Reybert <jreybert@gmail.com>
Date: Wed, 24 Jul 2019 10:30:41 +0200
Subject: [PATCH] Use --no-prefix to generate diff

It fixes the issue #176 and the PR #177.

PR #177 was almost fine. The idea of the PR was to force src and dst
prefix. The problem was that, to generate patch for new files, we diff
the new file against /dev/null. git does not like prefix for out of
repository files.

The simple fix is to always force --no-prefix. To make it work, git
apply must use -p0 option: this option tells that there is no prefix in
the src dst files paths.
---
 autoload/magit/git.vim | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/autoload/magit/git.vim b/autoload/magit/git.vim
index df36d9f..27cd507 100644
--- a/autoload/magit/git.vim
+++ b/autoload/magit/git.vim
@@ -102,14 +102,11 @@ function! magit#git#git_dir()
 	return b:magit_git_dir
 endfunction
 
-" Use explicit prefixes to avoid issues when the user has configured the
-" diff.noprefix option.  The actual prefix values are arbitrary and just
-" stripped internally by the commands invoking diff / show.
-let s:diff_prefix = "--src-prefix a/ --dst-prefix b/"
-
 " magit#git#git_diff: helper function to get diff of a file
 " nota: when git fail (due to misformated patch for example), an error
 " message is raised.
+" WARNING: diff is generated without prefix. To apply this diff, git apply
+" must use the option -p0.
 " param[in] filemane: it must be quoted if it contains spaces
 " param[in] status: status of the file (see g:magit_git_status_code)
 " param[in] mode: can be staged or unstaged
@@ -120,8 +117,7 @@ function! magit#git#git_diff(filename, status, mode)
 	let dev_null = ( a:status == '?' ) ? "/dev/null " : ""
 	let staged_flag = ( a:mode == 'staged' ) ? "--staged" : ""
 	let git_cmd=g:magit_git_cmd . " diff --no-ext-diff " . staged_flag .
-				\ " " . s:diff_prefix .
-				\ " --no-color -p -U" . b:magit_diff_context .
+				\ " --no-prefix --no-color -p -U" . b:magit_diff_context .
 				\ " -- " . dev_null . " " . a:filename
 
 	if ( a:status != '?' )
@@ -237,7 +233,7 @@ function! magit#git#git_apply(header, selection)
 	if ( selection[-1] !~ '^$' )
 		let selection += [ '' ]
 	endif
-	let git_cmd=g:magit_git_cmd . " apply --recount --no-index --cached -"
+	let git_cmd=g:magit_git_cmd . " apply --recount --no-index --cached -p0 -"
 	try
 		silent let git_result=magit#sys#system(git_cmd, selection)
 	catch 'shell_error'
@@ -265,8 +261,8 @@ function! magit#git#git_unapply(header, selection, mode)
 	endif
 	try
 		silent let git_result=magit#sys#system(
-			\ g:magit_git_cmd . " apply --recount --no-index " . cached_flag . " --reverse - ",
-			\ selection)
+			\ g:magit_git_cmd . " apply --recount --no-index -p0 --reverse " .
+			\ cached_flag . " - ", selection)
 	catch 'shell_error'
 		call magit#sys#print_shell_error()
 		echom "Tried to unaply this"
@@ -323,8 +319,7 @@ endfunction
 function! magit#git#get_commit_subject(ref)
 	try
 		return magit#utils#strip(magit#sys#system(g:magit_git_cmd . " show " .
-					\ " " . s:diff_prefix .
-					\" --no-patch --format=\"%s\" " . a:ref))
+					\" --no-prefix --no-patch --format=\"%s\" " . a:ref))
 	catch 'shell_error'
 		return ""
 	endtry
-- 
GitLab