On Tue, Mar 14, 2017 at 3:11 PM, Brandon Williams <bmwill@xxxxxxxxxx> wrote: > When using the --recurse-submodules flag with a relative pathspec which > includes "..", an error is produced inside the child process spawned for a > submodule. When creating the pathspec struct in the child, the ".." is > interpreted to mean "go up a directory" which causes an error stating that the > path ".." is outside of the repository. > > While it is true that ".." is outside the scope of the submodule, it is > confusing to a user who originally invoked the command where ".." was indeed > still inside the scope of the superproject. Since the child process launched > for the submodule has some context that it is operating underneath a > superproject, this error could be avoided. > > This patch fixes the bug by passing the 'prefix' to the child process. Now > each child process that works on a submodule has two points of reference to the > superproject: (1) the 'super_prefix' which is the path from the root of the > superproject down to root of the submodule and (2) the 'prefix' which is the > path from the root of the superproject down to the directory where the user > invoked the git command. > > With these two pieces of information a child process can correctly interpret > the pathspecs provided by the user as well as being able to properly format its > output relative to the directory the user invoked the original command from. > > Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> > --- > builtin/ls-files.c | 41 +++++++++++++++++----------------- > t/t3007-ls-files-recurse-submodules.sh | 39 ++++++++++++++++++++++++++++++++ > 2 files changed, 60 insertions(+), 20 deletions(-) > > diff --git a/builtin/ls-files.c b/builtin/ls-files.c > index 1c0f057d0..d449e46db 100644 > --- a/builtin/ls-files.c > +++ b/builtin/ls-files.c > @@ -30,7 +30,7 @@ static int line_terminator = '\n'; > static int debug_mode; > static int show_eol; > static int recurse_submodules; > -static struct argv_array submodules_options = ARGV_ARRAY_INIT; > +static struct argv_array submodule_options = ARGV_ARRAY_INIT; > > static const char *prefix; > static const char *super_prefix; > @@ -172,20 +172,27 @@ static void show_killed_files(struct dir_struct *dir) > /* > * Compile an argv_array with all of the options supported by --recurse_submodules > */ > -static void compile_submodule_options(const struct dir_struct *dir, int show_tag) > +static void compile_submodule_options(const char **argv, > + const struct dir_struct *dir, > + int show_tag) > { > if (line_terminator == '\0') > - argv_array_push(&submodules_options, "-z"); > + argv_array_push(&submodule_options, "-z"); > if (show_tag) > - argv_array_push(&submodules_options, "-t"); > + argv_array_push(&submodule_options, "-t"); > if (show_valid_bit) > - argv_array_push(&submodules_options, "-v"); > + argv_array_push(&submodule_options, "-v"); > if (show_cached) > - argv_array_push(&submodules_options, "--cached"); > + argv_array_push(&submodule_options, "--cached"); > if (show_eol) > - argv_array_push(&submodules_options, "--eol"); > + argv_array_push(&submodule_options, "--eol"); > if (debug_mode) > - argv_array_push(&submodules_options, "--debug"); > + argv_array_push(&submodule_options, "--debug"); Up to here we only rename a variable? If you want to help reviewers, please separate this into two patches. One refactoring, stating it doesn't change behavior; and the other adding the behavioral changes. > + > + /* Add Pathspecs */ > + argv_array_push(&submodule_options, "--"); > + for (; *argv; argv++) > + argv_array_push(&submodule_options, *argv); > }