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 (<[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

Reply via email to