REQUEST FOR HELP - SEE END Our company's workflow requires that our P4 check-in messages have a specific format. A helpful feature in the GIT-P4 program would be a hook that occurs after the P4 change list is created but before it is displayed in the editor that would allow an external program to possibly edit the changelist text. v1:My suggestion for the hook name is p4-pre-edit-changelist. It would take a single parameter, the full path of the temporary file. If the hook returns a non-zero exit code, it would cancel the current P4 submit. The hook should be optional. v2:Instead of a single hook, p4-pre-edit-changelist, follow the git convention for hook names and add the trio of hooks that work together, similar to git commit. The hook names are: * p4-prepare-changelist * p4-changelist * p4-post-changelist The hooks should follow the same convention as git commit, so a new command line option for the git-p4 submit function --no-verify should also be added. v3:2-Feb-2020 This version reorganizes the commits to be easier to read. The function for running the git hook has been rewritten to include suggestions. This version no longer restricts the executable supported by windows for the hook. It will first look for a file with the hook name without an extension and if found, it will pass it to sh.exe (Git for Window's MINGW shell) Otherwise it will take the file with the lowest alphabetical extension and ask Windows to execute the program. v3:10-Feb-2020 Integrated the suggested changes from the mailing list into this release. The changes are: * Restructure the commits to pull the p4-pre-submit hook changes into the commit for adding git_run_hook. * Update the git_run_hook to include additional tests for GIT_DIR being set if getting the environment returns no value. * Updated the windows file resolution to ensure that the script to be run is NOT the .SAMPLE version of the hooks. * Split the RCS keyword cleanup message into its own commit. Request for helpThere are 2 areas that I am requesting help with: 1. Validating code - if there are any experts with python and Windows, I would appreciate a review of the changes that I have presented here. 2. Git documentation - On my latest commit, I am getting an error with `test-documentation.sh . Searching for a fix, I see this thread: https://patchwork.kernel.org/patch/11136547/ that points to an update for the documentation checking, but this is out of scope for the work I can put to this patch. The actual error can be seen here: https://dev.azure.com/git/git/_build/results?buildId=1705&view=logs&j=bbfa2fa6-a202-51ab-3559-6013e9e5f686&t=c5c726a2-e78b-50d9-5d91-f31f918b4814&l=2688 [https://dev.azure.com/git/git/_build/results?buildId=1705&view=logs&j=bbfa2fa6-a202-51ab-3559-6013e9e5f686&t=c5c726a2-e78b-50d9-5d91-f31f918b4814&l=2688] Thank you in advance! Ben Keene (6): git-p4: rewrite prompt to be Windows compatible git-p4: create new function run_git_hook git-p4: add --no-verify option git-p4: restructure code in submit git-p4: add p4 submit hooks git-4: add RCS keyword status message Documentation/git-p4.txt | 45 ++++++- Documentation/githooks.txt | 51 +++++++- git-p4.py | 233 ++++++++++++++++++++++++++++--------- 3 files changed, 272 insertions(+), 57 deletions(-) base-commit: de93cc14ab7e8db7645d8dbe4fd2603f76d5851f Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-698%2Fseraphire%2Fseraphire%2Fp4-hook-v4 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-698/seraphire/seraphire/p4-hook-v4 Pull-Request: https://github.com/git/git/pull/698 Range-diff vs v3: 1: 8881d76c46 ! 1: 71c51ccfb0 git-p4: rewrite prompt to be Windows compatible @@ -27,7 +27,6 @@ + sys.stderr.flush() + sys.stdout.write(prompt_text) + sys.stdout.flush() -+ sys.stdin.flush() + response=sys.stdin.readline().strip().lower() if not response: continue 2: 85918a7edb ! 2: 596b18e5e5 git-p4: create new function run_git_hook @@ -80,7 +80,7 @@ + + hooks_path = gitConfig("core.hooksPath") + if len(hooks_path) <= 0: -+ hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), "hooks") ++ hooks_path = os.path.join(os.environ["GIT_DIR"], "hooks") + + if not isinstance(param, list): + param=[param] @@ -94,7 +94,13 @@ + if not files: + return True + files.sort() -+ hook_file = files[0] ++ hook_file = files.pop() ++ while hook_file.upper().endswith(".SAMPLE"): ++ # The file is a sample hook. We don't want it ++ if len(files) > 0: ++ hook_file = files.pop() ++ else: ++ return True + + if not os.path.isfile(hook_file) or not os.access(hook_file, os.X_OK): + return True @@ -136,6 +142,28 @@ def write_pipe(c, stdin): if verbose: sys.stderr.write('Writing pipe: %s\n' % str(c)) +@@ + sys.exit("number of commits (%d) must match number of shelved changelist (%d)" % + (len(commits), num_shelves)) + +- hooks_path = gitConfig("core.hooksPath") +- if len(hooks_path) <= 0: +- hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), "hooks") +- +- hook_file = os.path.join(hooks_path, "p4-pre-submit") +- if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and subprocess.call([hook_file]) != 0: ++ try: ++ if not run_git_hook("p4-pre-submit"): ++ print("\nThe p4-pre-submit hook failed, aborting the submit.\n\nYou can skip " \ ++ "this pre-submission check by adding\nthe command line option '--no-verify', " \ ++ "however,\nthis will also skip the p4-changelist hook as well.") ++ sys.exit(1) ++ except Exception as e: ++ print("\nThe p4-pre-submit hook failed, aborting the submit.\n\nThe hook failed "\ ++ "with the error '{0}'".format(e.message) ) + sys.exit(1) + + # @@ "unshelve" : P4Unshelve, } 3: b538ad08b6 ! 3: 57a6166ed1 git-p4: add --no-verify option @@ -95,41 +95,3 @@ if gitConfig('git-p4.largeFileSystem'): die("Large file system not supported for git-p4 submit command. Please remove it from config.") -@@ - applyPatchCmd = patchcmd + "--check --apply -" - patch_succeeded = True - -+ if verbose: -+ print("TryPatch: %s" % tryPatchCmd) -+ - if os.system(tryPatchCmd) != 0: - fixed_rcs_keywords = False - patch_succeeded = False -@@ - print("Retrying the patch with RCS keywords cleaned up") - if os.system(tryPatchCmd) == 0: - patch_succeeded = True -+ print("Patch succeesed this time") - - if not patch_succeeded: - for f in editedFiles: -@@ - sys.exit("number of commits (%d) must match number of shelved changelist (%d)" % - (len(commits), num_shelves)) - -- hooks_path = gitConfig("core.hooksPath") -- if len(hooks_path) <= 0: -- hooks_path = os.path.join(os.environ.get("GIT_DIR", ".git"), "hooks") -- -- hook_file = os.path.join(hooks_path, "p4-pre-submit") -- if os.path.isfile(hook_file) and os.access(hook_file, os.X_OK) and subprocess.call([hook_file]) != 0: -- sys.exit(1) -+ if not self.no_verify: -+ if not run_git_hook("p4-pre-submit"): -+ print("\nThe p4-pre-submit hook failed, aborting the submit.\n\nYou can skip " \ -+ "this pre-submission check by adding\nthe command line option '--no-verify', " \ -+ "however,\nthis will also skip the p4-changelist hook as well.") -+ sys.exit(1) - - # - # Apply the commits, one at a time. On failure, ask if should 4: 662b864d70 = 4: d17e032767 git-p4: restructure code in submit 5: e34c377066 = 5: ceb2b0aff6 git-p4: add p4 submit hooks -: ---------- > 6: b92e017cb1 git-4: add RCS keyword status message -- gitgitgadget