[PATCH] git: move non-kallithea hooks and execute other hooks
Mads Kiilerich
mads at kiilerich.com
Mon Jan 11 23:10:12 UTC 2021
On 1/11/21 10:16 PM, Lance Edgar wrote:
>
> On 1/11/21 7:53 AM, Mads Kiilerich wrote:
>> As next step, I propose the changes in
>> https://kallithea-scm.org/repos/kallithea/pull-request/306/_/hooks .
>>
>> Some of it took a slightly different direction than Tim proposed. And
>> cleaning up many other related things. Please let us know if you
>> disagree with any of it.
>
>
> The only thing I spotted in the above PR was this bit where you would
> remove any existing pre-receive hook. Seems to me that the admin may
> well need to install pre-receive for their own needs and you should
> never delete it even when "force overwrite" is requested? Or maybe I
> read it wrong.
>
> https://kallithea-scm.org/repos/kallithea-incoming/changeset/e7acbdb8fd8ce7d520ce216b5baeb42a72dc7fdd#kallitheamodelscmpy_n717
>
Right, thanks. I propose
https://kallithea-scm.org/repos/kallithea-incoming/changeset/9522b915c913#kallitheamodelscmpy_n674
instead.
>> Finally, with these things out of the way, the core problem of
>> custom/multiple Git hooks is more clear.
>>
>> The way Kallithea use Git, I see no alternative to Kallithea
>> installing the post-receive hook to be able to detect what has been
>> pushed. (But it is possible we could come of with another scheme, and
>> thus completely avoid this problem?)
>
>
> Agreed, I see no reason not to use git hooks for Kallithea's own needs.
Well ... there is at least one good reason: it evidently conflicts with
admins who want other kinds of hooks ;-)
>> I don't like the idea of Kallithea having its own custom way of
>> allowing admins to install hooks. If admins want to install extra
>> hooks, they should do it in a "standard" way. Tim mentioned a couple
>> of examples of how it could be done, but nothing that was ready for
>> use, covered relevant concerns such as having a scheme that didn't
>> pick up backup files or non-executable files, with a convincing cross
>> platform story (covering Windows), or approximated a "standard".
>>
>> I think the best (and preferred) way forward for having custom and
>> multiple hooks for Git would be to have a "standard" dispatcher that
>> can be installed in hooks/HOOKNAME . That hook should be a separate
>> project, independent of Kallithea, and with a fair chance of being
>> used widely, also when not using Kallithea. Ideally, it should be
>> upstreamed in Git.
>>
>> The scheme could be that it runs all executable
>> hooks/HOOKNAME.d/*.hook (or some other scheme, such as
>> hooks/HOOKNAME.*.hook). It should have some meaningful handling of
>> stdin, stdout, exit code, and how they should be shared/chained when
>> multiple hooks run and might fail. And it should support both Linux,
>> Mac, and Windows (where there might be cmd/exe/whatever extensions
>> and no exe flag).
>>
>> When there is a good 3rd party solution to the problem, I will
>> implement support for it in Kallithea: detect if a hook from that
>> project is installed in hooks/HOOKNAME, and then write the Kallithea
>> hook to something like hooks/HOOKNAME.d/kallithea.hook instead.
>>
>> I suggest you team up to create that project. We will support you,
>> but Kallithea would not be a good owner of it.
>>
>> Does that make sense?
>
>
> All that does make sense. However I would like to propose yet another
> way of looking at it.
>
> We have been discussing "multiple post-receive hooks" but in reality
> there need only ever be 2: Kallithea's own "internal" hook script (in
> use today), and "some other" script as defined by admin.
>
> Git after all will only support one script out of the box, so any
> admin who needs "multiple" things to happen in a hook, normally must
> write one script which contains several steps. So then "all extra"
> steps needed beyond Kallithea could be represented as a single
> script. If the admin's needs are complex then maybe that script for
> them must have the "meaningful handling of stdin" etc. which you
> mentioned. (Perhaps with auto-discovery, like example at
> https://serverfault.com/a/909154 .) But there would be no true need
> for the "dispatcher" to have those smarts - it need only a) run the
> Kallithea hook, and then b) run the "other" hook script if present.
> (I guess, it *would* still need to correctly pass stdin at least.)
I do not like to see it as at most two hooks, Kallithea's and the
admins. That will force admins to solve the same problem as we have to:
Figure out a way to dispatch to multiple hooks. That is an artificial
and egoistic way to reduce a generic N problem to a "me vs everybody
else" 2 problem.
> I agree that a smarter dispatcher might be a nice gift to the Git
> world, beyond Kallithea. But I think it is not strictly necessary here.
>
> I was curious about what GitLab did for this. IIUC their Server Hooks
> doc (https://docs.gitlab.com/ee/administration/server_hooks.html)
> basically reduces the problem in the same way. They allow the admin
> to create a `custom_hooks` folder in the repo, and in it they can
> place a (single!) `post-receive` script for example. Presumably the
> "true" hook script from Git's perspective, is the one provided by
> GitLab itself, but as an optional last step it can fire off whatever
> is in `custom_hooks/post-receive` if present.
>
> So ultimately I agree that "Kallithea having its own custom way of
> allowing admins to install hooks" is not 100% ideal, but that "they
> should do it in a standard way" seems to me still possible and pretty
> low-hanging fruit, without adding in a 3rd party dispatcher.
> (Although by "standard" I am only referring to the "Kallithea standard
> way" here.) We need only define/document a single custom hook
> script/path which the admin must define, *should* they even need to
> bother.
>
> If some day Git is given native multi-hook support then obviously
> should revisit. But I suspect their approach will never change since
> end user can always make a wrapper script, e.g. also
> https://stackoverflow.com/a/30104427
So sad that the Git world seems to rely on hacks instead of solutions :-(
So how about something like
https://kallithea-scm.org/repos/kallithea-incoming/changeset/027e5f06c7e7 ?
/Mads
More information about the kallithea-general
mailing list