Re: [PATCH v4] [GSOC]trailer: pass arg as positional parameter
- From
ZheNing Hu <adlternative@gmail.com>
- Date
- Mar 30, 2021, 11:22 UTC
- Message-ID
- <CAOLTT8SfOKS41uJDHAMAmhWZXc3qZsngfFtsbzXxdNP1cEObzg@mail.gmail.com>
- In-Reply-To
- <CAP8UFD1XSTAq28LrBe-q+M_Vs78gZhr58mHM6EgYt9g3pPuPDg@mail.gmail.com>
Christian Couder <christian.couder@gmail.com> 于2021年3月30日周二 下午4:45写道:
Show 72 quoted lines
>
> On Mon, Mar 29, 2021 at 3:44 PM ZheNing Hu <adlternative@gmail.com> wrote:
> >
> > Christian Couder <christian.couder@gmail.com> 于2021年3月29日周一 下午5:05写道:
> > >
> > > >
> > > > Yes, $ARG or $1 are always exist because of:
> > > >
> > > > arg = xstrdup("");
> > > >
> > > > so I think maybe we don't even need this judge in `apply_command`?
> > > > + if (arg)
> > > > + strvec_push(&cp.args, arg);
> > >
> > > Yeah, I haven't looked at the code, but that might be a good
> > > simplification. If you work on this, please submit it in a separate
> > > commit.
> >
> > Well, if necessary, I'll put it in another commit, maybe I should double check
> > to see if there's anything special going on.
> >
> > > > > Another way to do it would be to have another config option called
> > > > > `trailer.<token>.alwaysRunCmd` to tell if the cmd specified by
> > > > > `trailer.<token>.cmd` should be run even if no '<token>=<value>'
> > > > > argument is passed on the command line. As we are introducing
> > > > > `trailer.<token>.cmd`, it's a good time to wonder if this would be a
> > > > > better design. But this issue is quite complex, because of the fact
> > > > > that 'trailer.<token>.ifMissing' and 'trailer.<token>.ifExists' also
> > > > > take a part in deciding if the command will be run.
> > >
> > > Actually after thinking about it, I think it might be better, instead
> > > of `trailer.<token>.alwaysRunCmd`, to add something like
> > > `trailer.<token>.runMode` that could take multiple values like:
> >
> > If really can achieve it is certainly better than 'alwaysRunCmd'.
> > The following three small configuration options look delicious.
> > But I think it needs to be discussed in more detail:
> >
> > > - "beforeCLI": would make it run once, like ".command" does now before
> > > any CLI trailer are processed
> >
> > Does "beforeCLI" handle all trailers? Or is it just doing something to add empty
> > value trailers?
>
> I am not sure what you mean by "handle all trailers". What I mean is
> that it would just work like ".command" does right now before the
> "--trailers ..." options are processed.
>
> Let's suppose the "trailer.foo.command" config option is set to "bar".
> Then the "bar" command will be run just before the "--trailers ..."
> options are processed and the output of that, let's say "baz" will be
> used to add a new "foo: baz" trailer to the ouput of `git
> interpret-trailers`.
>
> For example:
>
> -------
> $ git -c trailer.foo.command='echo baz' interpret-trailers<<EOF
> EOF
>
> foo: baz
> -------
>
> In other words an empty value trailer is just a special case when the
> command that is run does not output anything. But such commands are
> expected to output something not trivial at least in some cases.
>
> See also the example in the doc that uses:
>
> $ git config trailer.sign.command 'echo "$(git config user.name)
> <$(git config user.email)>"'
>I see what you mean, which is to provide a default value for any trailers that haven't been run command yet.
Show 47 quoted lines
> > > - "forEachCLIToken": would make it run once for each trailer that has > > > the token, like ".command" also does now, the difference would be that > > > the value for the token would be passed in the $1 argument > > > > This is exactly same as before. > > Yeah it is the same as before when the "--trailers ..." options are > processed, but not before that. > > To get exactly the same as before one would need to configure both > "beforeCLI" _and_ "forEachCLIToken", for example like this (note that > we use "--add" when adding "forEachCLIToken"): > > $ git config trailer.foo.runMode beforeCLI > $ git config --add trailer.foo.runMode forEachCLIToken > $ git config -l | grep foo > trailer.foo.runmode=beforeCLI > trailer.foo.runmode=forEachCLIToken > > > > - "afterCLI": would make it run once after all the CLI trailers have > > > been processed and it could pass the different values for the token if > > > any in different arguments: $1, $2, $3, ... > > > > I might get a little confused here: What's the input for $1,$2,$3? > > The input would be the different values that are used for the token in > the "--trailer ..." CLI arguments. > > For (an hypothetical) example: > > ------ > $ git config trailer.foo.runMode afterCLI > $ git config trailer.foo.cmd 'echo $@' > $ git interpret-trailers --trailer foo=a --trailer foo=b --trailer foo=c<<EOF > EOF > > foo: a b c > $ git interpret-trailers<<EOF > EOF > > foo: > ------ > > I am not sure "afterCLI" would be useful, but we might not want to > implement it right now. It's just an example to show that we could add > other modes to run the configured ".cmd" (and maybe ".command" too). >
Yes, not so useful.
Show 9 quoted lines
> > Is users more interested in dealing with trailers value or a line of the > > trailer? > > I am not sure what you mean here. If "a line of the trailer" means a > trailer that is already in the input file that is passed to `git > interpret-trailers`, and if "trailers value" means a "--trailer ..." > argument, then I would say that users could be interested in dealing > with both. >
Sorry, I mean after we running those command, a line trailer is "foo: bar" and trailers value will be "bar".
Show 5 quoted lines
> It's true that right now the command configured by a ".command" is not > run when `git interpret-trailers` processes in input file that > contains a trailer with the corresponding token. So new values for > ".runMode" could be implemented to make that happen. >
Sure.
Show 18 quoted lines
> > > > But as you said, to disable the automatic addition in the original .command > > > > and use the new .alwaysRunCmd, I’m afraid there are a lot of things to consider. > > > > Perhaps future series of patches can be considered to do it. > > > > > > Yeah, support for `trailer.<token>.runMode` might be added in > > > different commits at least and possibly later in a different patch > > > series. There are the following issues to resolve, though, if we want > > > to focus only on a new ".cmd" config option: > > > > > > - how and when should it run by default, > > > > Do you mean that ".cmd" can get rid of the ".command" auto-add problem > > in this patch series? > > I am not sure what you mean with "auto-add". Do you mean that fact > that the ".command" runs once before the CLI "--trailer ..." options > are processed? >
I'm talking about the empty values $ARG passing to the user's command, those command at least run once, You say "how and when should it run by default", I was wondering if I could not run .cmd without passing trailer.
Show 9 quoted lines
> > This might be a good idea if I can add the three modes you mentioned above > > in the later patch series. > > I like that your are interested in improving trailer handling in Git, > but I must say that if you intend to apply for the GSoC, you might > want to work on your application document first, as it will need to be > discussed on the mailing list too and it will take some time. You are > also free to work on this too, but that shouldn't be your priority. >
In fact, I had written the proposal carefully. I have been studying what went wrong with OIga's improvement of cat-file recently.
I may have thought of some ideas, and has been written in Proposal, I will submit it in about two days :)
Show 8 quoted lines
> By the way if this (or another Git related) subject is more > interesting to you than the project ideas we propose on > https://git.github.io/SoC-2021-Ideas/, then you are welcome to write a > proposal about working on this (improving trailer handling) rather > than on a project idea from that page. You might want to make sure > that some people would be willing to (co-)mentor you working on it > though. >
Aha, for the time being, you are the most suitable mentor, But I might just take improvement of `interpret-tarilers` as my interest to do something. I will choice the project of "git cat-file" .
Show 33 quoted lines
> [...] > > > > Another way to work on all this, would be to first work on adding > > > support for `trailer.<token>.runMode` and on improving existing > > > documentation, and then to add ".cmd", which could then by default use > > > a different ".runMode" than ".command". > > > > I think the task can be put off until April. > > Deal with the easier ".cmd" first. > > Ok for me, but see above about GSoC application. > > > > > > > > This, too, but until ".command" is removed, wouldn't it be better > > > > > > for readers to keep both variants, as the distinction between $ARG > > > > > > and $1 needs to be illustrated? > > > > > > > > So the correct solution should be to keep the original .command Examples, > > > > and then give the .cmd examples again. > > > > > > Maybe we could take advantage of ".cmd" to show other nice > > > possibilities to use all of this. Especially if support for `git > > > commit --trailer ...` is already merged, we might be able to use it in > > > those examples, or perhaps add some examples to the git commit doc. > > > > Oh, the 'commit --trailer' may still be queuing, It may take a while. > > You might want to check if it needs another reroll or if there are > other reasons (like no reviews) why it's not listed in the last > "What's cooking ..." email from Junio. If you think it is ready and > has been forgotten, you can ping reviewers (including me), to ask them > to review it one more time, or Junio if the last version you sent has > already been reviewed.
It should still be in "seen" inheritance, Junio is advancing it. Maybe you think it has something to improve, please feel free to tell me.
In addition, I now found a small bug in ".cmd",
git config -l |grep bug trailer.bug.key=bug-descibe: trailer.bug.ifexists=replace trailer.bug.cmd=echo 123
see what will happen:
git interpret-trailers --trailer="bug:text" <<-EOF `heredocd> EOF
bug-descibe:123 text
"text" seem print to stdout.
I'm looking at what's going on here.
-- ZheNing Hu