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