Re: [PATCH] Do not record unstaged deleted file upon recursive merge if file was moved outside of working tree with enabled sparse-checkout.
>> +test_expect_success 'move file/sparse-checkout/merge should not delete >> moved file' ' >> + git rm -rf . && >> + git clean -fdqx && >> + rm -rf .git && >> + git init && > > Yuck. This is inherited from existing tests but I think they need > to be cleaned up. It is not your fault, and it is not in the scope > of this change. It's part need for cleanup repository from the previous case.
Re: [PATCH] Do not record unstaged deleted file upon recursive merge if file was moved outside of working tree with enabled sparse-checkout.
It's a very unexpected behaviour when a user sees a deleted file after a merge with enabled sparse-checkout. Moreover, when the user resolves merge conflicts and commits the changes with the command "git commit -am xxx", a repository can be broken because all the moved files will be deleted. Finally, it's really hard to find a user who deleted these files because "git log file" doesn't show any merge commits by default. I'm not sure that my fix is correct but I checked all tests and I didn't find a better way to prevent files deleting. 12.09.2016, 02:24, "Junio C Hamano": > Mikhail Filippov writes: > >> --- > > You'd need a lot more explanation on why this is needed > (i.e. without it what behaviour you would get, and why that > behaviour is wrong). > >> merge-recursive.c | 9 +--- >> t/t6042-merge-rename-corner-cases.sh | 42 >> >> 2 files changed, 48 insertions(+), 3 deletions(-) >> >> diff --git a/merge-recursive.c b/merge-recursive.c >> index e349126..25dc701 100644 >> --- a/merge-recursive.c >> +++ b/merge-recursive.c >> @@ -1724,9 +1724,12 @@ static int merge_content(struct merge_options *o, >> */ >> path_renamed_outside_HEAD = !path2 || !strcmp(path, >> path2); >> if (!path_renamed_outside_HEAD) { >> - add_cacheinfo(o, mfi.mode, , path, >> - 0, (!o->call_depth), 0); >> - return mfi.clean; >> + struct stat st; >> + if (lstat(path, ) == 0) { >> + add_cacheinfo(o, mfi.mode, , path, >> + 0, (!o->call_depth), 0); >> + return mfi.clean; >> + } > > I cannot guess what you are trying to achieve without explanation in > the proposed log message, but I can say that this unconditional > checking of a working tree file cannot be correct (there may or may > not be other things that are wrong with this change, which cannot be > judged without more information). > > Imagine your o->call_depth is not zero, i.e. we are making a virtual > common ancestor with this merge, in which case any of the three > trees involved may have nothing to do with the current working tree > files. > >> +test_expect_success 'move file/sparse-checkout/merge should not delete >> moved file' ' >> + git rm -rf . && >> + git clean -fdqx && >> + rm -rf .git && >> + git init && > > Yuck. This is inherited from existing tests but I think they need > to be cleaned up. It is not your fault, and it is not in the scope > of this change. > >> + git status >output && >> + cp output /tmp/a && > > Huh? > >> + test_i18ngrep "nothing to commit" output >> +' >> + >> test_done -- Mikhail Filippov Software Developer JetBrains http://jetbrains.com “The Drive To Develop"
Re: [PATCH] Do not record unstaged deleted file upon recursive merge if file was moved outside of working tree with enabled sparse-checkout.
Mikhail Filippovwrites: > --- You'd need a lot more explanation on why this is needed (i.e. without it what behaviour you would get, and why that behaviour is wrong). > merge-recursive.c| 9 +--- > t/t6042-merge-rename-corner-cases.sh | 42 > > 2 files changed, 48 insertions(+), 3 deletions(-) > > diff --git a/merge-recursive.c b/merge-recursive.c > index e349126..25dc701 100644 > --- a/merge-recursive.c > +++ b/merge-recursive.c > @@ -1724,9 +1724,12 @@ static int merge_content(struct merge_options *o, >*/ > path_renamed_outside_HEAD = !path2 || !strcmp(path, path2); > if (!path_renamed_outside_HEAD) { > - add_cacheinfo(o, mfi.mode, , path, > - 0, (!o->call_depth), 0); > - return mfi.clean; > + struct stat st; > + if (lstat(path, ) == 0) { > + add_cacheinfo(o, mfi.mode, , path, > + 0, (!o->call_depth), 0); > + return mfi.clean; > + } I cannot guess what you are trying to achieve without explanation in the proposed log message, but I can say that this unconditional checking of a working tree file cannot be correct (there may or may not be other things that are wrong with this change, which cannot be judged without more information). Imagine your o->call_depth is not zero, i.e. we are making a virtual common ancestor with this merge, in which case any of the three trees involved may have nothing to do with the current working tree files. > +test_expect_success 'move file/sparse-checkout/merge should not delete moved > file' ' > + git rm -rf . && > + git clean -fdqx && > + rm -rf .git && > + git init && Yuck. This is inherited from existing tests but I think they need to be cleaned up. It is not your fault, and it is not in the scope of this change. > + git status >output && > + cp output /tmp/a && Huh? > + test_i18ngrep "nothing to commit" output > +' > + > test_done