{"thread":{"id":"62762","subject":"[PATCH] RFC: git-request-get maintainer receiving from git-request-pull","startedAt":"2025-01-07T18:57:25Z","lastAt":"2025-01-07T21:05:42Z","messageCount":4,"participants":["Matěj Cepl","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"510109","messageId":"20250107185716.1562311-1-mcepl@cepl.eu","threadId":"62762","inReplyTo":null,"subject":"[PATCH] RFC: git-request-get maintainer receiving from git-request-pull","fromName":"Matěj Cepl","fromEmail":"mcepl@cepl.eu","sentAt":"2025-01-07T18:56:35Z","receivedAt":"2025-01-07T18:57:25Z","isPatch":true,"sender":{"key":"mcepl@cepl.eu","avatar":"https://avatars.githubusercontent.com/u/198999?v=4"},"body":"This should be fulfilment of my comment on the GitLab bug [1] from 2016-05-01:\n\n> Well, the minimal solution would be a parser for the\n> git-request-pull(1), which would check every comment and if recognized\n> the comment as the pull request, it would add button for the owner of\n> the repo (e.g., [Create Pull Request]). After pressing that (so it is\n> constantly under the control of the owner repo), gitlab would setup\n> new remote (if doesn't exist still), fetch it, and create a merge\n> request.\n\nIn the end, the best UI I could come up with is to pull all\ncommits to the new review branch and send all of them via\ngit-send-email(1) to the review email list.\n\nThe script can either receive git-request-pull(1) output on\nstdin, or it can be driven by the command line arguments with URL\nand (optionally) branch names for all those “I have some commits\non SOMEWHERE, but I don’t want to fiddle with git-send-email(1)\njust because of that.”\n\n[1] https://gitlab.com/gitlab-org/gitlab/-/issues/14116\n---\n\nI would like to get these types of comments (before I finalize\na proper commit for git):\n\n* whether the idea of the script makes sense at all (or\n  suggestions on the UI improvement),\n* a general code review\n* advice how to proceed with testing before rewriting it into the\n  proper git test harness: is there only way to add those ugly\n  `if test -z \"$DEBUG\"` constructs everywhere, or there is some\n  better way?\n\nThank you for any reply,\n\nMatěj\n\n Makefile        |   8 +++\n git-request-get | 186 ++++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 194 insertions(+)\n create mode 100644 Makefile\n create mode 100755 git-request-get\n\ndiff --git a/Makefile b/Makefile\nnew file mode 100644\nindex 0000000..4d686f5\n--- /dev/null\n+++ b/Makefile\n@@ -0,0 +1,8 @@\n+export DEBUG := true\n+export WANT_REMOTE := 1\n+\n+test:\n+\t./git-request-get < gitk-email.mbx 2>&1 | \\\n+\tgrep -e \"ensure_remote: getting REMOTE = j6t and URL = https://github.com/j6t/gitk.git\" \\\n+\t\t-e \"make_branch: getting BRANCH_NAME = mcepl-07012025 and HEAD = master\" \\\n+\t\t-e \"main: DEST_ADDR= ~mcepl/git-test@lists.sr.ht, AUTHOR=Matěj Cepl <mcepl@cepl.eu>, BASE=c18400c6bb04f4e8875c1930db72ddd9b94649ca, HEAD=master\"\ndiff --git a/git-request-get b/git-request-get\nnew file mode 100755\nindex 0000000..1f6edfa\n--- /dev/null\n+++ b/git-request-get\n@@ -0,0 +1,186 @@\n+#!/bin/sh\n+# Requires: perl, sed, awk\n+set -eux\n+\n+# Initialize internal variables\n+DEBUG=\"${DEBUG:-}\"\n+WANT_REMOTE=\"${WANT_REMOTE:-\"$(git config get --type int --default=0 git-request-get.wantRemote)\"}\"\n+BASE=\"\"\n+HEAD=\"\"\n+DEST_ADDR=\"\"\n+\n+usage() {\n+    echo \"usage: $(basename \"$0\") [-t ADDRTO] [-s] [-h] URL [HEAD] [BASE]\" >&2\n+    echo \"Generate git-send-email messages from remote URL or from the email message\"\n+    echo \"formatted by git-request-pull\"\n+    echo\n+    echo \"-t ADDRTO send emails to this email address\"\n+    exit 1\n+}\n+\n+die() {\n+    echo \"$1\" >&2\n+    if test $# -gt 1\n+    then\n+        exit \"$2\"\n+    else\n+        exit 1\n+    fi\n+}\n+\n+log() {\n+    echo \"$1\" >&2\n+}\n+\n+parse_message() {\n+    STR=\"$(perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);')\"\n+    # Collect URL of the incoming repo\n+    USTR=\"$(echo \"$STR\" | sed -n -e '/^are available in the Git repository at:/{n;n;p}')\"\n+    U=\"$(echo \"$USTR\" | awk '{print $1}')\"\n+\n+    # Find the tip of the offered branch\n+    # for you to fetch changes up to 102cd4d5c1818ecb5926dd538962f8b42c43b022:\n+    B=\"$(echo \"$STR\" | awk '/^The following changes since commit / { print $NF }' | sed -e 's/[=:]*$//')\"\n+\n+    E=\"$(echo \"$USTR\" | awk '{print $2}')\"\n+    if test -z \"$E\"\n+    then\n+        E=\"$(echo \"$STR\" | awk '/^for you to fetch changes up to / { print $NF }' | sed -e 's/[=:]*$//')\"\n+    fi\n+    printf \"%s^%s^%s\" \"$U\" \"$B\" \"$E\"\n+}\n+\n+ensure_remote () {\n+    URL=\"$1\"\n+    REMSTR=\"$(git remote -v | awk -v url=\"$1\" '(NR%2 == 1) && index($0, url) {print $1, $2}')\"\n+\n+    if test -n \"$REMSTR\"\n+    then\n+        log \"REMSTR found: ${REMSTR}\\n\"\n+        REMOTE=\"$(echo \"$REMSTR\"|cut -d ' ' -f 1)\"\n+    else\n+        # try to generate some good name for the remote\n+        case \"$URL\" in\n+        *github.com*|*gitlab.com*)\n+            REMOTE=\"$(echo \"$URL\"|cut -d/ -f 4)\"\n+            ;;\n+        *sr.ht*)\n+            REMOTE=\"$(echo \"$URL\"|awk -F'[~/]' '{print $5}')\"\n+            ;;\n+        *)\n+            REMOTE=\"_4review\"\n+            ;;\n+        esac\n+        if test -z \"$DEBUG\"\n+        then\n+            git remote add \"$REMOTE\" \"$URL\"\n+            git remote update \"$REMOTE\"\n+        else\n+            printf \"ensure_remote: getting REMOTE = %s and URL = %s\\n\" \"$REMOTE\" \"$URL\" >&2\n+        fi\n+    fi\n+\n+    printf \"%s\" \"$REMOTE\"\n+}\n+\n+#### main\n+while getopts \":dht:\" arg ; do\n+    case $arg in\n+        h)\n+            usage\n+            ;;\n+        t)\n+            DEST_ADDR=\"$OPTARG\"\n+            ;;\n+        ?)\n+            die \"Invalid option: -${OPTARG}.\" 5\n+            ;;\n+    esac\n+done\n+\n+shift $((OPTIND - 1))\n+\n+MASTER=\"master\"\n+if git rev-parse -q --verify main >/dev/null 2>&1\n+then\n+    MASTER=\"main\"\n+fi\n+\n+if test $# -lt 1\n+then\n+    PARSED_STR=\"$(parse_message)\"\n+    test -n \"$PARSED_STR\" || die \"Not enough arguments and no message in stdin!\" 2\n+    URL=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 1)\"\n+    BASE=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 2)\"\n+    HEAD=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 3)\"\n+# Ignore all command line arguments when stdin parsed\n+else\n+    if test $# -ge 1\n+    then\n+        URL=\"$1\"\n+    fi\n+\n+    if test -z \"$URL\"\n+    then\n+        die \"Insufficient input: no parseable input or command line arguments.\" 3\n+    fi\n+\n+    if test $# -ge 2\n+    then\n+        HEAD=\"$2\"\n+    else\n+        HEAD=\"FETCH_HEAD\"\n+    fi\n+\n+    # find the base commit where PR roots in the default branch\n+    if test $# -ge 3\n+    then\n+        BASE=\"$3\"\n+    fi\n+fi\n+\n+if test \"$WANT_REMOTE\" -eq 1\n+then\n+    REMOTE=\"$(ensure_remote \"$URL\")\"\n+    if test -n \"$HEAD\" && ! git rev-parse -q --verify \"$HEAD\"\n+    then\n+        git rev-parse -q --verify \"$REMOTE/$HEAD\" || die \"Cannot find $HEAD branch on the remote $REMOTE!\" 4\n+        HEAD=\"${REMOTE}/${HEAD}\"\n+    fi\n+\n+    BRANCH_NAME=\"$(git log --pretty=\"%aL\" -1)-$(date '+%d%m%Y')\"\n+\n+    if test -z \"$DEBUG\"\n+    then\n+        git branch \"$BRANCH_NAME\" \"$HEAD\"\n+    else\n+        printf \"make_branch: getting BRANCH_NAME = %s and HEAD = %s\\n\" \"$BRANCH_NAME\" \"$HEAD\" >&2\n+    fi\n+else\n+    git fetch \"$URL\"\n+fi\n+\n+if test -z \"$DEST_ADDR\"\n+then\n+    DEST_ADDR=\"$(git config --default='' sendemail.to)\"\n+    test -z \"$DEST_ADDR\" && die \"Unknown destination for the emails\" 4\n+fi\n+\n+test \"$HEAD\" = \"FETCH_HEAD\" && HEAD=\"$(git rev-parse -q --verify FETCH_HEAD)\"\n+\n+ROOT=\"$(git merge-base \"$MASTER\" \"$HEAD\")\"\n+\n+# commit is not part of our tree\n+test \"$ROOT\" = \"$HEAD\" && die \"Final commit cannot be included in our tree\" 4\n+\n+test -z \"$BASE\" && BASE=\"$ROOT\"\n+\n+test \"$BASE\" = \"$HEAD\" && die \"No change observed\" 1\n+\n+AUTHOR=\"$(git log --pretty=\"%an <%ae>\" -1)\"\n+if test -z \"$DEBUG\"\n+then\n+    git send-email --to=\"$DEST_ADDR\" --from=\"$AUTHOR\" --no-annotate --no-cc --no-bcc --no-identity --quiet \"${BASE}..${HEAD}\"\n+else\n+    printf \"main: DEST_ADDR= %s, AUTHOR=%s, BASE=%s, HEAD=%s\\n\" \"$DEST_ADDR\" \"$AUTHOR\" \"$BASE\" \"$HEAD\" \n+fi\n-- \n2.47.1\n\n"},{"id":"510110","messageId":"xmqqcygys9e3.fsf@gitster.g","threadId":"62762","inReplyTo":"20250107185716.1562311-1-mcepl@cepl.eu","subject":"Re: [PATCH] RFC: git-request-get maintainer receiving from git-request-pull","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2025-01-07T19:37:24Z","receivedAt":"2025-01-07T19:37:27Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Matěj Cepl <mcepl@cepl.eu> writes:\n\n> This should be fulfilment of my comment on the GitLab bug [1] from 2016-05-01:\n>\n>> Well, the minimal solution would be a parser for the\n>> git-request-pull(1), which would check every comment and if recognized\n>> the comment as the pull request, it would add button for the owner of\n>> the repo (e.g., [Create Pull Request]). After pressing that (so it is\n>> constantly under the control of the owner repo), gitlab would setup\n>> new remote (if doesn't exist still), fetch it, and create a merge\n>> request.\n>\n> In the end, the best UI I could come up with is to pull all\n> commits to the new review branch and send all of them via\n> git-send-email(1) to the review email list.\n>\n> The script can either receive git-request-pull(1) output on\n> stdin, or it can be driven by the command line arguments with URL\n> and (optionally) branch names for all those “I have some commits\n> on SOMEWHERE, but I don’t want to fiddle with git-send-email(1)\n> just because of that.”\n>\n> [1] https://gitlab.com/gitlab-org/gitlab/-/issues/14116\n> ---\n>\n> I would like to get these types of comments (before I finalize\n> a proper commit for git):\n>\n> * whether the idea of the script makes sense at all (or\n>   suggestions on the UI improvement),\n\nYou'd have much better chance if you made the patch standalone,\ninstead of discouraging those who might be interested by forcing\nthem to first visit an external website for 8-year old \"bug\" that\nmay or may not be interesting to them.  From the above, I am not\nsure if people can guess what problem is being solved, and without\nknowing that, they cannot judge if script makes sense in the first\nplace.\n\n> * a general code review\n\nThere are a handful of scripts written in Perl still in our\ncodebase; study the way how their sources are written (e.g., notice\nthat they all end with \".perl\") and are made into executables by\nMakefile rules, and mimick them.\n\n> * advice how to proceed with testing before rewriting it into the\n>   proper git test harness: is there only way to add those ugly\n>   `if test -z \"$DEBUG\"` constructs everywhere, or there is some\n>   better way?\n\nAlso send the e-mailed patch to yourself, and then run \"git am\" to\nmake sure it applies cleanly.  It seems the patch is creating a new\nMakefile, but our project already has one, so I do not see how this\npatch would apply.\n\nThanks for your interest in our project.\n\n> Thank you for any reply,\n>\n> Matěj\n>\n>  Makefile        |   8 +++\n>  git-request-get | 186 ++++++++++++++++++++++++++++++++++++++++++++++++\n>  2 files changed, 194 insertions(+)\n>  create mode 100644 Makefile\n>  create mode 100755 git-request-get\n>\n> diff --git a/Makefile b/Makefile\n> new file mode 100644\n> index 0000000..4d686f5\n> --- /dev/null\n> +++ b/Makefile\n> @@ -0,0 +1,8 @@\n> +export DEBUG := true\n> +export WANT_REMOTE := 1\n> +\n> +test:\n> +\t./git-request-get < gitk-email.mbx 2>&1 | \\\n> +\tgrep -e \"ensure_remote: getting REMOTE = j6t and URL = https://github.com/j6t/gitk.git\" \\\n> +\t\t-e \"make_branch: getting BRANCH_NAME = mcepl-07012025 and HEAD = master\" \\\n> +\t\t-e \"main: DEST_ADDR= ~mcepl/git-test@lists.sr.ht, AUTHOR=Matěj Cepl <mcepl@cepl.eu>, BASE=c18400c6bb04f4e8875c1930db72ddd9b94649ca, HEAD=master\"\n> diff --git a/git-request-get b/git-request-get\n> new file mode 100755\n> index 0000000..1f6edfa\n> --- /dev/null\n> +++ b/git-request-get\n> @@ -0,0 +1,186 @@\n> +#!/bin/sh\n> +# Requires: perl, sed, awk\n> +set -eux\n> +\n> +# Initialize internal variables\n> +DEBUG=\"${DEBUG:-}\"\n> +WANT_REMOTE=\"${WANT_REMOTE:-\"$(git config get --type int --default=0 git-request-get.wantRemote)\"}\"\n> +BASE=\"\"\n> +HEAD=\"\"\n> +DEST_ADDR=\"\"\n> +\n> +usage() {\n> +    echo \"usage: $(basename \"$0\") [-t ADDRTO] [-s] [-h] URL [HEAD] [BASE]\" >&2\n> +    echo \"Generate git-send-email messages from remote URL or from the email message\"\n> +    echo \"formatted by git-request-pull\"\n> +    echo\n> +    echo \"-t ADDRTO send emails to this email address\"\n> +    exit 1\n> +}\n> +\n> +die() {\n> +    echo \"$1\" >&2\n> +    if test $# -gt 1\n> +    then\n> +        exit \"$2\"\n> +    else\n> +        exit 1\n> +    fi\n> +}\n> +\n> +log() {\n> +    echo \"$1\" >&2\n> +}\n> +\n> +parse_message() {\n> +    STR=\"$(perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);')\"\n> +    # Collect URL of the incoming repo\n> +    USTR=\"$(echo \"$STR\" | sed -n -e '/^are available in the Git repository at:/{n;n;p}')\"\n> +    U=\"$(echo \"$USTR\" | awk '{print $1}')\"\n> +\n> +    # Find the tip of the offered branch\n> +    # for you to fetch changes up to 102cd4d5c1818ecb5926dd538962f8b42c43b022:\n> +    B=\"$(echo \"$STR\" | awk '/^The following changes since commit / { print $NF }' | sed -e 's/[=:]*$//')\"\n> +\n> +    E=\"$(echo \"$USTR\" | awk '{print $2}')\"\n> +    if test -z \"$E\"\n> +    then\n> +        E=\"$(echo \"$STR\" | awk '/^for you to fetch changes up to / { print $NF }' | sed -e 's/[=:]*$//')\"\n> +    fi\n> +    printf \"%s^%s^%s\" \"$U\" \"$B\" \"$E\"\n> +}\n> +\n> +ensure_remote () {\n> +    URL=\"$1\"\n> +    REMSTR=\"$(git remote -v | awk -v url=\"$1\" '(NR%2 == 1) && index($0, url) {print $1, $2}')\"\n> +\n> +    if test -n \"$REMSTR\"\n> +    then\n> +        log \"REMSTR found: ${REMSTR}\\n\"\n> +        REMOTE=\"$(echo \"$REMSTR\"|cut -d ' ' -f 1)\"\n> +    else\n> +        # try to generate some good name for the remote\n> +        case \"$URL\" in\n> +        *github.com*|*gitlab.com*)\n> +            REMOTE=\"$(echo \"$URL\"|cut -d/ -f 4)\"\n> +            ;;\n> +        *sr.ht*)\n> +            REMOTE=\"$(echo \"$URL\"|awk -F'[~/]' '{print $5}')\"\n> +            ;;\n> +        *)\n> +            REMOTE=\"_4review\"\n> +            ;;\n> +        esac\n> +        if test -z \"$DEBUG\"\n> +        then\n> +            git remote add \"$REMOTE\" \"$URL\"\n> +            git remote update \"$REMOTE\"\n> +        else\n> +            printf \"ensure_remote: getting REMOTE = %s and URL = %s\\n\" \"$REMOTE\" \"$URL\" >&2\n> +        fi\n> +    fi\n> +\n> +    printf \"%s\" \"$REMOTE\"\n> +}\n> +\n> +#### main\n> +while getopts \":dht:\" arg ; do\n> +    case $arg in\n> +        h)\n> +            usage\n> +            ;;\n> +        t)\n> +            DEST_ADDR=\"$OPTARG\"\n> +            ;;\n> +        ?)\n> +            die \"Invalid option: -${OPTARG}.\" 5\n> +            ;;\n> +    esac\n> +done\n> +\n> +shift $((OPTIND - 1))\n> +\n> +MASTER=\"master\"\n> +if git rev-parse -q --verify main >/dev/null 2>&1\n> +then\n> +    MASTER=\"main\"\n> +fi\n> +\n> +if test $# -lt 1\n> +then\n> +    PARSED_STR=\"$(parse_message)\"\n> +    test -n \"$PARSED_STR\" || die \"Not enough arguments and no message in stdin!\" 2\n> +    URL=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 1)\"\n> +    BASE=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 2)\"\n> +    HEAD=\"$(echo \"$PARSED_STR\"|cut -d '^' -f 3)\"\n> +# Ignore all command line arguments when stdin parsed\n> +else\n> +    if test $# -ge 1\n> +    then\n> +        URL=\"$1\"\n> +    fi\n> +\n> +    if test -z \"$URL\"\n> +    then\n> +        die \"Insufficient input: no parseable input or command line arguments.\" 3\n> +    fi\n> +\n> +    if test $# -ge 2\n> +    then\n> +        HEAD=\"$2\"\n> +    else\n> +        HEAD=\"FETCH_HEAD\"\n> +    fi\n> +\n> +    # find the base commit where PR roots in the default branch\n> +    if test $# -ge 3\n> +    then\n> +        BASE=\"$3\"\n> +    fi\n> +fi\n> +\n> +if test \"$WANT_REMOTE\" -eq 1\n> +then\n> +    REMOTE=\"$(ensure_remote \"$URL\")\"\n> +    if test -n \"$HEAD\" && ! git rev-parse -q --verify \"$HEAD\"\n> +    then\n> +        git rev-parse -q --verify \"$REMOTE/$HEAD\" || die \"Cannot find $HEAD branch on the remote $REMOTE!\" 4\n> +        HEAD=\"${REMOTE}/${HEAD}\"\n> +    fi\n> +\n> +    BRANCH_NAME=\"$(git log --pretty=\"%aL\" -1)-$(date '+%d%m%Y')\"\n> +\n> +    if test -z \"$DEBUG\"\n> +    then\n> +        git branch \"$BRANCH_NAME\" \"$HEAD\"\n> +    else\n> +        printf \"make_branch: getting BRANCH_NAME = %s and HEAD = %s\\n\" \"$BRANCH_NAME\" \"$HEAD\" >&2\n> +    fi\n> +else\n> +    git fetch \"$URL\"\n> +fi\n> +\n> +if test -z \"$DEST_ADDR\"\n> +then\n> +    DEST_ADDR=\"$(git config --default='' sendemail.to)\"\n> +    test -z \"$DEST_ADDR\" && die \"Unknown destination for the emails\" 4\n> +fi\n> +\n> +test \"$HEAD\" = \"FETCH_HEAD\" && HEAD=\"$(git rev-parse -q --verify FETCH_HEAD)\"\n> +\n> +ROOT=\"$(git merge-base \"$MASTER\" \"$HEAD\")\"\n> +\n> +# commit is not part of our tree\n> +test \"$ROOT\" = \"$HEAD\" && die \"Final commit cannot be included in our tree\" 4\n> +\n> +test -z \"$BASE\" && BASE=\"$ROOT\"\n> +\n> +test \"$BASE\" = \"$HEAD\" && die \"No change observed\" 1\n> +\n> +AUTHOR=\"$(git log --pretty=\"%an <%ae>\" -1)\"\n> +if test -z \"$DEBUG\"\n> +then\n> +    git send-email --to=\"$DEST_ADDR\" --from=\"$AUTHOR\" --no-annotate --no-cc --no-bcc --no-identity --quiet \"${BASE}..${HEAD}\"\n> +else\n> +    printf \"main: DEST_ADDR= %s, AUTHOR=%s, BASE=%s, HEAD=%s\\n\" \"$DEST_ADDR\" \"$AUTHOR\" \"$BASE\" \"$HEAD\" \n> +fi\n"},{"id":"510113","messageId":"D6W4BSVAQ3VY.1GWVRAIDTBX3W@cepl.eu","threadId":"62762","inReplyTo":"xmqqcygys9e3.fsf@gitster.g","subject":"Re: [PATCH] RFC: git-request-get maintainer receiving from git-request-pull","fromName":"Matěj Cepl","fromEmail":"mcepl@cepl.eu","sentAt":"2025-01-07T20:20:28Z","receivedAt":"2025-01-07T20:20:31Z","isPatch":true,"sender":{"key":"mcepl@cepl.eu","avatar":"https://avatars.githubusercontent.com/u/198999?v=4"},"body":"On Tue Jan 7, 2025 at 8:37 PM CET, Junio C Hamano wrote:\n> There are a handful of scripts written in Perl still in our\n> codebase; study the way how their sources are written (e.g., notice\n> that they all end with \".perl\") and are made into executables by\n> Makefile rules, and mimick them.\n\nOK, no shell scripts any more. Got it. I will have to rewrite the\nthing, and I will eventually try again.\n\n> Also send the e-mailed patch to yourself, and then run \"git am\" to\n> make sure it applies cleanly.  It seems the patch is creating a new\n> Makefile, but our project already has one, so I do not see how this\n> patch would apply.\n\nOK, no RFCs any more, just submission-ready contributions. Got it.\n\nSee you later!\n\nMatěj\n\n-- \nhttp://matej.ceplovi.cz/blog/, @mcepl@en.osm.town\nGPG Finger: 3C76 A027 CA45 AD70 98B5  BC1D 7920 5802 880B C9D8\n \nOpportunity is missed by most people because it is dressed in\noveralls and looks like work.\n  -- Thomas A. Edison\n\n"},{"id":"510117","messageId":"xmqqr05eqqqk.fsf@gitster.g","threadId":"62762","inReplyTo":"D6W4BSVAQ3VY.1GWVRAIDTBX3W@cepl.eu","subject":"Re: [PATCH] RFC: git-request-get maintainer receiving from git-request-pull","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2025-01-07T21:05:39Z","receivedAt":"2025-01-07T21:05:42Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Matěj Cepl <mcepl@cepl.eu> writes:\n\n> On Tue Jan 7, 2025 at 8:37 PM CET, Junio C Hamano wrote:\n>> There are a handful of scripts written in Perl still in our\n>> codebase; study the way how their sources are written (e.g., notice\n>> that they all end with \".perl\") and are made into executables by\n>> Makefile rules, and mimick them.\n>\n> OK, no shell scripts any more. Got it.\n\nSorry, no, we do have shell scripts.  The story is the same, though.\nLook for SCRIPT_SH in the Makefile (instead of SCRIPT_PERL).  I\nsimply thought you had a perl script but what you had was a bash\nscript, I think.\n\n> OK, no RFCs any more, just submission-ready contributions. Got it.\n\nThat is not what I meant, either.  [PATCH/RFC] is just fine.  But\nmake sure what you are sending can be applied cleanly by those who\nreceive to avoid wasting their time.\n\nTHanks.\n\n"}]}