diff --git a/docs/setup.rst b/docs/setup.rst --- a/docs/setup.rst +++ b/docs/setup.rst @@ -348,8 +348,10 @@ can be found in ``kallithea.lib.hooks``. Kallithea will also use some hooks internally. They cannot be modified, but some of them can be enabled or disabled in the *VCS* section. -Kallithea has no support for custom Git hooks. Kallithea will install and use -Git hooks internally, and they might collide with manually installed hooks. +Kallithea does not actively support custom Git hooks, but hooks can be installed +manually in the file system. Kallithea will install and use the +``post-receive`` Git hook internally, but it will then invoke +``post-receive-custom`` if present. Changing default encoding diff --git a/docs/upgrade.rst b/docs/upgrade.rst --- a/docs/upgrade.rst +++ b/docs/upgrade.rst @@ -236,6 +236,9 @@ To update the hooks of your Git reposito kallithea-cli repo-scan -c my.ini --install-git-hooks +Watch out for warnings like ``skipping overwriting hook file X``, then fix it +and rerun, or consider using ``--overwrite-git-hooks`` instead. + Or: * Go to *Admin > Settings > Remap and Rescan* diff --git a/docs/usage/troubleshooting.rst b/docs/usage/troubleshooting.rst --- a/docs/usage/troubleshooting.rst +++ b/docs/usage/troubleshooting.rst @@ -52,6 +52,7 @@ Troubleshooting Note that Kallithea uses the ``post-receive`` hook internally. Kallithea will not work properly if another post-receive hook is installed instead. You might also accidentally overwrite your own post-receive hook with the Kallithea hook. + Instead, put your post-receive hook in ``post-receive-custom``, and the Kallithea hook will invoke it. You can also use Kallithea-extensions to connect to callback hooks, for both Git and Mercurial. diff --git a/kallithea/templates/py/git_post_receive_hook.py b/kallithea/templates/py/git_post_receive_hook.py --- a/kallithea/templates/py/git_post_receive_hook.py +++ b/kallithea/templates/py/git_post_receive_hook.py @@ -9,6 +9,7 @@ hook will use. """ import os +import subprocess import sys import kallithea.bin.vcs_hooks @@ -30,7 +31,15 @@ os.environ['KALLITHEA_HOOK_VER'] = KALLI def main(): repo_path = os.path.abspath('.') git_stdin_lines = sys.stdin.readlines() - sys.exit(kallithea.bin.vcs_hooks.post_receive(repo_path, git_stdin_lines)) + status = kallithea.bin.vcs_hooks.post_receive(repo_path, git_stdin_lines) + + custom_hook = os.path.join(repo_path, 'hooks', 'post-receive-custom') + custom_status = None + if os.access(custom_hook, os.X_OK): + result = subprocess.run([custom_hook], input=''.join(git_stdin_lines), universal_newlines=True) + custom_status = result.returncode + + sys.exit(status or custom_status) if __name__ == '__main__':