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, ThomasEl mar., 20 oct. 2020 a las 17:51, Tim Ooms (<[email protected] <mailto:[email protected]>>) escribió:# HG changeset patch # User Tim Ooms <[email protected] <mailto:[email protected]>> # 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 [email protected] <mailto:[email protected]> https://lists.sfconservancy.org/mailman/listinfo/kallithea-general
<<attachment: tim_ooms.vcf>>
_______________________________________________ kallithea-general mailing list [email protected] https://lists.sfconservancy.org/mailman/listinfo/kallithea-general
