git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "Ben Keene via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Ben Keene <seraphire@gmail.com>
Subject: Re: [PATCH v2 2/4] git-p4: create new method gitRunHook
Date: Tue, 04 Feb 2020 12:40:28 -0800	[thread overview]
Message-ID: <xmqqr1za6q83.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <f1f9fdc542353196612f8dd6b996d4fbd1f76c73.1580507895.git.gitgitgadget@gmail.com> (Ben Keene via GitGitGadget's message of "Fri, 31 Jan 2020 21:58:13 +0000")

"Ben Keene via GitGitGadget" <gitgitgadget@gmail.com> writes:

> diff --git a/git-p4.py b/git-p4.py
> index 7d8a5ee788..4e481b3b55 100755
> --- a/git-p4.py
> +++ b/git-p4.py
> @@ -4125,6 +4125,35 @@ def printUsage(commands):
>      "unshelve" : P4Unshelve,
>  }
>  
> +def gitRunHook(cmd, param=[]):
> +    """Execute a hook if the hook exists."""
> +    if verbose:
> +        sys.stderr.write("Looking for hook: %s\n" % cmd)
> +        sys.stderr.flush()
> +
> +    hooks_path = gitConfig("core.hooksPath")
> +    if len(hooks_path) <= 0:
> +        hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), "hooks")

This assumes that the process when his function is called (by the
way, even though the title of the patch uses the word "method", this
is not a method but a function, no?), it is always at the top level
of the working tree.  Is that a good assumption?  I don't know the
code well, so "yes it is good because a very early thing we do is to
go up to the top" is a good answer.

> +    hook_file = os.path.join(hooks_path, cmd)
> +    if isinstance(param,basestring):
> +        param=[param]
> +
> +    if platform.system() == 'Windows':
> +        exepath = os.environ.get("EXEPATH")
> +        if exepath is None:
> +            exepath = ""
> +        shexe = os.path.join(exepath, "bin", "sh.exe")
> +        if os.path.isfile(shexe) \
> +            and os.path.isfile(hook_file) \
> +            and os.access(hook_file, os.X_OK) \
> +            and subprocess.call([shexe, hook_file] + param) != 0:
> +            return False
> +
> +    else:
> +        if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and subprocess.call([hook_file] + param) != 0:
> +            return False

Doesn't this mean that on Windows, a hook MUST be written as a shell
script, but on other platforms, a hook can be any executable?

I am not sure if it is necessary to penalize Windows users this way.
How do other parts of the system run hooks on Windows?  E.g. can
"pre-commit" hook be an executable Python script on Windows?

Even if it is needed to have different implementations (and possibly
reduced capabilities) for "we found this file is a hook, now run it
with these parameters" on different platform, the above looks a bit
inverted.  If the code in this function were

    if os.path.isfile(hook_file) and
       os.access(hook_file, os.X_OK) and
       run_hook_command(hook_file, param) != 0:
	return False
    else:
	return True

and a thin helper function whose only task is "now run it with these
parameters" is separately written, e.g.

    def run_hook_command(hook_file, params):
	if Windows:
		... do things in Windows specific way ...
	else:
		return subprocess.call([hook_file] + param)

That would have been 100% better, as it would have made it clear
that logically gitRunHook() does exactly the same thing on all
platforms (i.e. find where the hook is, normalize param, check if
the hook file is actually enabled, and finally execute the hook with
the param), while the details of how the "execute" part (and only
that part) works may be different.

> +    return True
>  
>  def main():
>      if len(sys.argv[1:]) == 0:

  reply	other threads:[~2020-02-04 20:40 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-20 21:17 [PATCH] git-p4: Add hook p4-pre-pedit-changelist Ben Keene via GitGitGadget
2020-01-21 23:05 ` Junio C Hamano
2020-01-29 10:13   ` Luke Diamand
2020-01-29 19:05     ` Junio C Hamano
2020-01-29 21:23       ` Luke Diamand
2020-01-30  1:37       ` Junio C Hamano
2020-01-30 14:20         ` Ben Keene
2020-01-30 18:39           ` Junio C Hamano
2020-01-30  1:51 ` Bryan Turner
2020-01-30 13:45   ` Ben Keene
2020-01-31 21:58 ` [PATCH v2 0/4] git-p4: add hook p4-pre-edit-changelist Ben Keene via GitGitGadget
2020-01-31 21:58   ` [PATCH v2 1/4] git-p4: rewrite prompt to be Windows compatible Ben Keene via GitGitGadget
2020-01-31 21:58   ` [PATCH v2 2/4] git-p4: create new method gitRunHook Ben Keene via GitGitGadget
2020-02-04 20:40     ` Junio C Hamano [this message]
2020-02-05 19:56       ` Ben Keene
2020-02-05 21:42         ` Junio C Hamano
2020-02-06 14:00           ` Ben Keene
2020-02-06 18:26             ` Junio C Hamano
2020-01-31 21:58   ` [PATCH v2 3/4] git-p4: add hook p4-pre-edit-changelist Ben Keene via GitGitGadget
2020-01-31 21:58   ` [PATCH v2 4/4] git-p4: add p4 submit hooks Ben Keene via GitGitGadget
2020-02-04 20:50     ` Junio C Hamano
2020-02-06 15:15   ` [PATCH v3 0/5] git-p4: add hook p4-pre-edit-changelist Ben Keene via GitGitGadget
2020-02-06 15:15     ` [PATCH v3 1/5] git-p4: rewrite prompt to be Windows compatible Ben Keene via GitGitGadget
2020-02-06 19:28       ` Junio C Hamano
2020-02-10 15:49         ` Ben Keene
2020-02-06 15:15     ` [PATCH v3 2/5] git-p4: create new function run_git_hook Ben Keene via GitGitGadget
2020-02-06 19:42       ` Junio C Hamano
2020-02-10 19:03         ` Ben Keene
2020-02-06 15:15     ` [PATCH v3 3/5] git-p4: add --no-verify option Ben Keene via GitGitGadget
2020-02-06 19:42       ` Junio C Hamano
2020-02-10 16:21         ` Ben Keene
2020-02-06 15:15     ` [PATCH v3 4/5] git-p4: restructure code in submit Ben Keene via GitGitGadget
2020-02-06 15:15     ` [PATCH v3 5/5] git-p4: add p4 submit hooks Ben Keene via GitGitGadget
2020-02-10 22:06     ` [PATCH v4 0/6] git-p4: add hooks for p4-changelist Ben Keene via GitGitGadget
2020-02-10 22:06       ` [PATCH v4 1/6] git-p4: rewrite prompt to be Windows compatible Ben Keene via GitGitGadget
2020-02-10 22:06       ` [PATCH v4 2/6] git-p4: create new function run_git_hook Ben Keene via GitGitGadget
2020-02-10 22:24         ` Junio C Hamano
2020-02-10 22:06       ` [PATCH v4 3/6] git-p4: add --no-verify option Ben Keene via GitGitGadget
2020-02-10 22:06       ` [PATCH v4 4/6] git-p4: restructure code in submit Ben Keene via GitGitGadget
2020-02-10 22:06       ` [PATCH v4 5/6] git-p4: add p4 submit hooks Ben Keene via GitGitGadget
2020-02-10 22:06       ` [PATCH v4 6/6] git-4: add RCS keyword status message Ben Keene via GitGitGadget
2020-02-11 18:57       ` [PATCH v5 0/7] git-p4: add hooks for p4-changelist Ben Keene via GitGitGadget
2020-02-11 18:57         ` [PATCH v5 1/7] git-p4: rewrite prompt to be Windows compatible Ben Keene via GitGitGadget
2020-02-11 18:57         ` [PATCH v5 2/7] git-p4: create new function run_git_hook Ben Keene via GitGitGadget
2020-02-11 18:58         ` [PATCH v5 3/7] git-p4: add p4-pre-submit exit text Ben Keene via GitGitGadget
2020-02-11 18:58         ` [PATCH v5 4/7] git-p4: add --no-verify option Ben Keene via GitGitGadget
2020-02-11 18:58         ` [PATCH v5 5/7] git-p4: restructure code in submit Ben Keene via GitGitGadget
2020-02-11 18:58         ` [PATCH v5 6/7] git-p4: add p4 submit hooks Ben Keene via GitGitGadget
2020-02-11 18:58         ` [PATCH v5 7/7] git-p4: add RCS keyword status message Ben Keene via GitGitGadget
2020-02-14 14:44         ` [PATCH v6 0/7] git-p4: add hooks for p4-changelist Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 1/7] git-p4: rewrite prompt to be Windows compatible Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 2/7] git-p4: create new function run_git_hook Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 3/7] git-p4: add p4-pre-submit exit text Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 4/7] git-p4: add --no-verify option Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 5/7] git-p4: restructure code in submit Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 6/7] git-p4: add p4 submit hooks Ben Keene via GitGitGadget
2020-02-14 14:44           ` [PATCH v6 7/7] git-p4: add RCS keyword status message Ben Keene via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqr1za6q83.fsf@gitster-ct.c.googlers.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=seraphire@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).