[PATCH] git: move non-kallithea hooks and execute other hooks
Tim Ooms
tim.ooms at aeronomie.be
Tue Oct 20 19:12:01 UTC 2020
Hi Thomas,
Yes, I did.
The goal of the patch is to not break the non-kallithea hook scripts
that may be present when doing a rescan and reinstall (after an update
for example) and at the same time supporting the execution of
third-party hook scripts next to the kallithea ones.
When using the force parameter, instead of overwriting the non-kallithea
hook script, it renames the script by adding .<date>.<kallithea-version>
to it (can off course be something else).
The new version of the kallithea hook script will execute all scripts in
the hook-directory matching <hook-name>.*.* (should just match previous
pattern). This way, it executes the previously installed hook script and
possible other hook scripts the admin added matching the pattern.
--
kind regards,
Tim
On 20/10/2020 20:43, Thomas De Schampheleire wrote:
> Hi Tim,
>
> Did you intend to submit this patch?
> If so, please clarify the goal and context of this patch more clearly.
>
> Thanks,
> Thomas
>
> El mar., 20 oct. 2020 a las 17:51, Tim Ooms (<tim.ooms at aeronomie.be
> <mailto:tim.ooms at aeronomie.be>>) escribió:
>
> # HG changeset patch
> # User Tim Ooms <tatankat at users.noreply.github.com
> <mailto:tatankat at users.noreply.github.com>>
> # Date 1603201903 -7200
> # Tue Oct 20 15:51:43 2020 +0200
> # Node ID 672e57b165d0c1774b692b5706a174bf98f42e4c
> # Parent b9b53e25a08d3714c54d82641b419e6d01820e12
> git: move non-kallithea hooks and execute other hooks
>
> diff -r b9b53e25a08d -r 672e57b165d0 kallithea/model/scm.py
> --- a/kallithea/model/scm.py Mon Oct 19 12:18:28 2020 +0200
> +++ b/kallithea/model/scm.py Tue Oct 20 15:51:43 2020 +0200
> @@ -25,10 +25,12 @@
> :license: GPLv3, see LICENSE.md for more details.
> """
>
> +import datetime
> import logging
> import os
> import posixpath
> import re
> +import stat
> import sys
> import traceback
>
> @@ -694,7 +696,7 @@
> Creates a kallithea hook inside a git repository
>
> :param repo: Instance of VCS repo
> - :param force: Overwrite existing non-Kallithea hooks
> + :param force: Move existing non-Kallithea hooks
> """
>
> hooks_path = os.path.join(repo.path, 'hooks')
> @@ -730,14 +732,46 @@
> other_hook = True
>
> if other_hook and not force:
> - log.warning('skipping overwriting hook file %s',
> hook_file)
> + log.warning('skip moving non-Kallithea hook file %s',
> + hook_file)
> else:
> + # if we want to write the hook,
> + # we move the other hook out of the way
> + if other_hook:
> + # existing non-kallithea hook script will be
> renamed
> + # additional scripts can be named like:
> + # "%s-receive.kallithea-extern.YYYYmmdd.manual
> + # all "%s-receive.kallithea-extern.*.*" hook
> scripts
> + # will be executed in order
> + moved_hook_file = '%s.kallithea-extern.%s.%s' % (
> + hook_file,
> +
> datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"),
> + kallithea.__version__)
> + log.warning('moving hook file %s to %s',
> + hook_file, moved_hook_file)
> + # least chances to break an existing script by
> renaming
> + # moving to a subdir may break scripts due to
> changed paths
> + os.rename(hook_file, moved_hook_file)
> + # now we can write our hook
> log.debug('writing %s hook file !', h_type)
> try:
> with open(hook_file, 'wb') as f:
> tmpl = tmpl.replace(b'_TMPL_',
> safe_bytes(kallithea.__version__))
> f.write(tmpl)
> - os.chmod(hook_file, 0o755)
> + try:
> + if not os.path.islink(hook_file):
> + # add permissions we (may) need
> + # other bits are up to umask/inherited
> permissions
> + os.chmod(
> + hook_file, os.stat(hook_file).st_mode
> + | stat.S_IRUSR | stat.S_IWUSR |
> stat.S_IXUSR
> + | stat.S_IRGRP | stat.S_IXGRP
> + | stat.S_IROTH | stat.S_IXOTH)
> + # else this will throw a permission error
> + # but someone choose to create a symlink
> + except IOError as e:
> + log.error('error changing permissions on
> hoook %s: %s',
> + hook_file, e)
> except IOError as e:
> log.error('error writing hook %s: %s',
> hook_file, e)
>
> diff -r b9b53e25a08d -r 672e57b165d0
> kallithea/templates/py/git_post_receive_hook.py
> --- a/kallithea/templates/py/git_post_receive_hook.py Mon Oct 19
> 12:18:28 2020 +0200
> +++ b/kallithea/templates/py/git_post_receive_hook.py Tue Oct 20
> 15:51:43 2020 +0200
> @@ -9,6 +9,8 @@
> """
>
> import os
> +import pathlib
> +import subprocess
> import sys
>
> import kallithea.lib.hooks
> @@ -30,6 +32,11 @@
> def main():
> repo_path = os.path.abspath('.')
> git_stdin_lines = sys.stdin.readlines()
> + full_stdin = ''.join(git_stdin_lines)
> +
> + for file in
> sorted(pathlib.Path('hooks').glob('post-receive.kallithea-extern.*.*')):
> + subprocess.run([file], input=full_stdin,
> universal_newlines=True)
> +
>
> sys.exit(kallithea.lib.hooks.handle_git_post_receive(repo_path,
> git_stdin_lines))
>
>
> diff -r b9b53e25a08d -r 672e57b165d0
> kallithea/templates/py/git_pre_receive_hook.py
> --- a/kallithea/templates/py/git_pre_receive_hook.py Mon Oct 19
> 12:18:28 2020 +0200
> +++ b/kallithea/templates/py/git_pre_receive_hook.py Tue Oct 20
> 15:51:43 2020 +0200
> @@ -9,6 +9,8 @@
> """
>
> import os
> +import pathlib
> +import subprocess
> import sys
>
> import kallithea.lib.hooks
> @@ -30,6 +32,11 @@
> def main():
> repo_path = os.path.abspath('.')
> git_stdin_lines = sys.stdin.readlines()
> + full_stdin = ''.join(git_stdin_lines)
> +
> + for file in
> sorted(pathlib.Path('hooks').glob('pre-receive.kallithea-extern.*.*')):
> + subprocess.run([file], input=full_stdin,
> universal_newlines=True)
> +
> sys.exit(kallithea.lib.hooks.handle_git_pre_receive(repo_path,
> git_stdin_lines))
>
>
>
> _______________________________________________
> kallithea-general mailing list
> kallithea-general at sfconservancy.org
> <mailto:kallithea-general at sfconservancy.org>
> https://lists.sfconservancy.org/mailman/listinfo/kallithea-general
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: tim_ooms.vcf
Type: text/x-vcard
Size: 4 bytes
Desc: not available
URL: <http://lists.sfconservancy.org/pipermail/kallithea-general/attachments/20201020/5c5db1b9/attachment.vcf>
More information about the kallithea-general
mailing list