David Turner <dturner@xxxxxxxxxxxx> writes: > If you have ever initialized a submodule, open_submodule will open it. > If you then delete the submodule's worktree directory (but don't > remove it from .gitmodules), git diff --submodule=diff would error out > as it attempted to chdir into the now-deleted working tree directory. > > Instead, we chdir into the submodule's git directory and run the diff > from there. > > Signed-off-by: David Turner <dturner@xxxxxxxxxxxx> > --- > submodule.c | 10 ++ > t/t4060-diff-submodule-option-diff-format.sh | 157 +++++++++++++++++++++++++-- > 2 files changed, 160 insertions(+), 7 deletions(-) > > diff --git a/submodule.c b/submodule.c > index 0b1d9c1dde..d13d103975 100644 > --- a/submodule.c > +++ b/submodule.c > @@ -710,6 +710,16 @@ void show_submodule_inline_diff(struct diff_options *o, const char *path, > strvec_push(&cp.args, oid_to_hex(new_oid)); > > prepare_submodule_repo_env(&cp.env_array); > + > + if (!is_directory(path)) { > + // fall back to absorbed git dir, if any I'll locally amend this comment style. If there is no other comments, that would be sufficient. > + if (!sub) > + goto done; > + cp.dir = sub->gitdir; > + strvec_push(&cp.env_array, GIT_DIR_ENVIRONMENT "=."); > + strvec_push(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT "=."); > + } > + > if (start_command(&cp)) > diff_emit_submodule_error(o, "(diff failed)\n");