Mercurial > kallithea
changeset 7633:1bafb2d07709 stable
hooks: make the Python interpreter for Git hooks configurable as 'git_hook_interpreter' (Issue #333)
Commit 5e501b6ee639 introduced the use of 'sys.executable' as interpreter
for git hooks instead of 'python2' with the following argument:
"Windows doesn't necessarily have "python2" available in $PATH, but we
still want to make sure we don't end up invoking a python3. Using the
absolute path seems more safe."
But, sys.executable does not necessarily point to Python. When Kallithea is
started under uWSGI, sys.executable points to the uwsgi executable. As a
result, the interpreter encoded in the git hooks on the server repositories
would be:
#!/path/to/uwsgi
And pushing to such repo would result in following client errors:
$ git push
Password for 'http://user@localhost:5050':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 241 bytes | 241.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: unable to load configuration from hooks/pre-receive
To http://localhost:5050/gitrepo-new
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://user@localhost:5050/gitrepo-new'
Fix this problem by introducing a configuration setting 'git_hook_interpreter'
that allow administrators to specify which Python interpreter to use.
A subsequent commit will cause its value to be filled in automatically when
generating a new ini file, but an administrator can always override it.
author | Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> |
---|---|
date | Mon, 08 Apr 2019 21:32:57 +0200 |
parents | dd88fd3a45cc |
children | 6df08d78f8e7 |
files | development.ini kallithea/lib/paster_commands/template.ini.mako kallithea/model/scm.py |
diffstat | 3 files changed, 25 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/development.ini Mon Apr 08 22:06:12 2019 +0200 +++ b/development.ini Mon Apr 08 21:32:57 2019 +0200 @@ -117,6 +117,15 @@ ## number of commits stats will parse on each iteration commit_parse_limit = 25 +## Path to Python executable to be used for git hooks. +## This value will be written inside the git hook scripts as the text +## after '#!' (shebang). When empty or not defined, the value of +## 'sys.executable' at the time of installation of the git hooks is +## used, which is correct in many cases but for example not when using uwsgi. +## If you change this setting, you should reinstall the Git hooks via +## Admin > Settings > Remap and Rescan. +# git_hook_interpreter = /srv/kallithea/venv/bin/python2 + ## path to git executable git_path = git
--- a/kallithea/lib/paster_commands/template.ini.mako Mon Apr 08 22:06:12 2019 +0200 +++ b/kallithea/lib/paster_commands/template.ini.mako Mon Apr 08 21:32:57 2019 +0200 @@ -211,6 +211,18 @@ <%text>## number of commits stats will parse on each iteration</%text> commit_parse_limit = 25 +<%text>## Path to Python executable to be used for git hooks.</%text> +<%text>## This value will be written inside the git hook scripts as the text</%text> +<%text>## after '#!' (shebang). When empty or not defined, the value of</%text> +<%text>## 'sys.executable' at the time of installation of the git hooks is</%text> +<%text>## used, which is correct in many cases but for example not when using uwsgi.</%text> +<%text>## If you change this setting, you should reinstall the Git hooks via</%text> +<%text>## Admin > Settings > Remap and Rescan.</%text> +# git_hook_interpreter = /srv/kallithea/venv/bin/python2 +%if git_hook_interpreter: +git_hook_interpreter = ${git_hook_interpreter} +%endif + <%text>## path to git executable</%text> git_path = git
--- a/kallithea/model/scm.py Mon Apr 08 22:06:12 2019 +0200 +++ b/kallithea/model/scm.py Mon Apr 08 21:32:57 2019 +0200 @@ -727,8 +727,11 @@ Git hook scripts so they invoke Kallithea code with the right Python interpreter and in the right environment. """ + # Note: sys.executable might not point at a usable Python interpreter. For + # example, when using uwsgi, it will point at the uwsgi program itself. # FIXME This may not work on Windows and may need a shell wrapper script. - return (sys.executable + return (kallithea.CONFIG.get('git_hook_interpreter') + or sys.executable or '/usr/bin/env python2') def install_git_hooks(self, repo, force_create=False):