Hi Thomas,

On Mon, 11 Mar 2019, Thomas Gummerer wrote:

> Passing the pathspec by value is potentially confusing, as the copy is
> only a shallow copy, so save the overhead of the copy, and pass the
> pathspec struct as a pointer.

Not only confusing, but also wasteful ;-)

> In addition use copy_pathspec to copy the pathspec into
> rev.prune_data, so the copy is a proper deep copy, and owned by the
> revision API, as that's what the API expects.

Good.

> [...]
> diff --git a/builtin/stash.c b/builtin/stash.c
> index 2f29d037c8..e0528d4cc8 100644
> --- a/builtin/stash.c
> +++ b/builtin/stash.c
> @@ -826,11 +826,11 @@ static int store_stash(int argc, const char **argv, 
> const char *prefix)
>  }
>  
>  static void add_pathspecs(struct argv_array *args,
> -                       struct pathspec ps) {
> +                       const struct pathspec *ps) {

I see that you added the `const` keyword. While it does not hurt, I would
probably not have bothered...

> [...]
> @@ -1042,6 +1049,7 @@ static int stash_working_tree(struct stash_info *info, 
> struct pathspec ps)
>       struct index_state istate = { NULL };
>  
>       init_revisions(&rev, NULL);
> +     copy_pathspec(&rev.prune_data, ps);

This moved here... because...

>  
>       set_alternate_index_output(stash_index_path.buf);
>       if (reset_tree(&info->i_tree, 0, 0)) {

... this `if` block could jump to...


> @@ -1050,7 +1058,6 @@ static int stash_working_tree(struct stash_info *info, 
> struct pathspec ps)
>       }
>       set_alternate_index_output(NULL);
>  
> -     rev.prune_data = ps;
>       rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
>       rev.diffopt.format_callback = add_diff_to_buf;
>       rev.diffopt.format_callback_data = &diff_output;
> @@ -1089,12 +1096,13 @@ static int stash_working_tree(struct stash_info 
> *info, struct pathspec ps)

... this point (the `done:` label is *just* one line further up, and this
is a static diff, so we cannot just increase the context when we need to
see more, unlike, say, GitHub PRs) and...

>       discard_index(&istate);
>       UNLEAK(rev);
>       object_array_clear(&rev.pending);
> +     clear_pathspec(&rev.prune_data);

... we add this call here.

However, we would not have needed to move the initialization of
`rev.prune_data`, I don't think, because `init_revision()` zeros the
entire struct, including `prune_data`, which would have made
`clear_pathspec()` safe to call, too.

Both of my comments need no action, and the rest of the patch looks good
to me.

Thank you for going through this!
Dscho

Reply via email to