On 03/14, Stefan Beller wrote: > 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. I can do that. > > > + > > + /* Add Pathspecs */ > > + argv_array_push(&submodule_options, "--"); > > + for (; *argv; argv++) > > + argv_array_push(&submodule_options, *argv); > > } -- Brandon Williams