diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 166746c09..4ffa70a2f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,6 @@ +# *.fsx,*.fs: formatting F# files using fantomless +df5cfb143c4efe73806ead91e5cddf4e133be0a8 + # commitlint.config: split helper funcs and plugins 3008d6578aa484ae776b29c9246dca4eeae3418a diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 28af6800c..b89c840b2 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -141,6 +141,9 @@ jobs: run: dotnet fsi scripts/unpinnedDotnetPackageVersions.fsx - name: Check there are no unpinned nuget package reference versions in F# scripts run: dotnet fsi scripts/unpinnedNugetPackageReferenceVersions.fsx + - name: compares commit-msg with PR in case there is only one commit in the PR + if: github.event_name == 'pull_request' + run: dotnet fsi scripts/compareCommitMsgWithPR.fsx - name: Check if gitPush1by1 was used if: github.event_name == 'pull_request' run: dotnet fsi scripts/detectNotUsingGitPush1by1.fsx diff --git a/ReadMe.md b/ReadMe.md index 35503052a..7205b87b1 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -9,6 +9,7 @@ This is a repository that contains several useful things that other `nblockchain * [F# scripts compilation](scripts/compileFSharpScripts.fsx). * [EOF without EOL detection](scripts/eofConvention.fsx). * [Mixed line-endings detection](scripts/mixedLineEndings.fsx). + * [Compare commit-msg with PR (Making sure the commit message title and body are the same as PR title and description in case there is only one commit in the PR)](scripts/compareCommitMsgWithPR.fsx). * Use of unpinned versions: * [Use of `-latest` suffix in `runs-on:` GitHubCI tags](scripts/unpinnedGitHubActionsImageVersions.fsx). * [Use of asterisk (*) in `PackageReference` items of .NET projects](scripts/unpinnedDotnetPackageVersions.fsx). diff --git a/WorkflowGuidelines.md b/WorkflowGuidelines.md index 379e5be7f..a68b14c3b 100644 --- a/WorkflowGuidelines.md +++ b/WorkflowGuidelines.md @@ -1,5 +1,84 @@ # Workflow guidelines +* Avoid typical bad practices like: + + * Magic numbers: + + Avoid using unnamed numerical constants in software code, this practice makes code hard to understand and maintain. + + Example: + ``` + var distance = GpsUtil.GetDistance() + if (distance < 100) + throw new NotImplementedException(); + ``` + ``` + private const int MinimumSupportedDistanceToNotifyKillerDrones = 100; + + ... + + var distance = GpsUtil.GetDistance() + if (distance < MinimumSupportedDistanceToNotifyKillerDrones) + throw new NotImplementedException(); + ``` + + * DRY (Don't Repeat Yourself): + + The DRY principle suggests that a piece of information should only be stored once in a project and should be referenced as needed, rather than being copied and pasted multiple times throughout the codebase. + + It has several benefits, including reducing the amount of code that needs to be written and maintained, improving the consistency and quality of the code, and reducing the risk of introducing errors and bugs when the information changes. + + Example: + ``` + let preAuthInputMac = + CalculateMacWithSHA3256 + preAuthInput + ":hs_mac" + + ... + + let authInputMac = + CalculateMacWithSHA3256 + authInput + ":hs_mac" + ``` + ``` + let AuthenticationDigestCalculationKey = ":hs_mac" + + ... + + let preAuthInputMac = + CalculateMacWithSHA3256 + preAuthInput + AuthenticationDigestCalculationKey + + ... + + let authInputMac = + CalculateMacWithSHA3256 + authInput + AuthenticationDigestCalculationKey + ``` + + * Primitive Obsession: + + Primitive Obsession is a situation where simple data types such as strings, integers, or arrays are overused in place of more appropriate objects. + + Example: + ``` + let saveFilePath = System.Console.ReadLine() + + let savedData = System.IO.File.ReadAllText saveFilePath + ``` + ``` + let saveFilePath = + let saveFilePathInString = + System.Console.ReadLine() + System.IO.FileInfo saveFilePathInString + + let savedData = System.IO.File.ReadAllText saveFilePath.FullName + ``` + * When contributing a PullRequest, separate your commits in units of work (don't mix changes that have different concerns in the same commit). Don't forget to include all explanations and reasonings in the commit messages, @@ -75,3 +154,4 @@ closed after the commit lands, then you would use the word `Closes` instead of Do not use long lines (manually crop them with EOLs because git doesn't do this automatically). + diff --git a/scripts/compareCommitMsgWithPR.fsx b/scripts/compareCommitMsgWithPR.fsx new file mode 100644 index 000000000..3c7b0ce9d --- /dev/null +++ b/scripts/compareCommitMsgWithPR.fsx @@ -0,0 +1,613 @@ +#!/usr/bin/env -S dotnet fsi + +open System +open System.IO + +#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +open Fsdk +#r "nuget: FSharp.Data, Version=5.0.2" +open FSharp.Data + +let githubEventPath = Environment.GetEnvironmentVariable "GITHUB_EVENT_PATH" + +if String.IsNullOrEmpty githubEventPath then + Console.Error.WriteLine + "This script is meant to be used only within a GitHubCI pipeline" + + Environment.Exit 2 + +let currentBranch = + Process + .Execute( + { + Command = "git" + Arguments = "rev-parse --abbrev-ref HEAD" + }, + Process.Echo.Off + ) + .UnwrapDefault() + .Trim() + +let prCommits = + Process + .Execute( + { + Command = "git" + Arguments = + sprintf "rev-list %s~..%s" currentBranch currentBranch + }, + Process.Echo.Off + ) + .UnwrapDefault() + .Trim() + .Split "\n" + |> Seq.tail + +type githubEventType = + JsonProvider<""" +{ + "action": "opened", + "number": 4, + "pull_request": { + "_links": { + "comments": { + "href": "https://api.github.com/repos/realmarv/conventions/issues/4/comments" + }, + "commits": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4/commits" + }, + "html": { + "href": "https://github.com/realmarv/conventions/pull/4" + }, + "issue": { + "href": "https://api.github.com/repos/realmarv/conventions/issues/4" + }, + "review_comment": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/comments{/number}" + }, + "review_comments": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4/comments" + }, + "self": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4" + }, + "statuses": { + "href": "https://api.github.com/repos/realmarv/conventions/statuses/c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133" + } + }, + "active_lock_reason": null, + "additions": 21, + "assignee": null, + "assignees": [], + "author_association": "OWNER", + "auto_merge": null, + "base": { + "label": "realmarv:master", + "ref": "master", + "repo": { + "allow_auto_merge": false, + "allow_forking": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_squash_merge": true, + "allow_update_branch": false, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "delete_branch_on_merge": false, + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE", + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "use_squash_pr_title_as_default": false, + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sha": "0be2f2d608cdf893e146db1296dee750a2a54cfc", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "body": null, + "changed_files": 2, + "closed_at": null, + "comments": 0, + "comments_url": "https://api.github.com/repos/realmarv/conventions/issues/4/comments", + "commits": 2, + "commits_url": "https://api.github.com/repos/realmarv/conventions/pulls/4/commits", + "created_at": "2023-03-23T09:00:26Z", + "deletions": 0, + "diff_url": "https://github.com/realmarv/conventions/pull/4.diff", + "draft": false, + "head": { + "label": "realmarv:fixGitPush1by1Check", + "ref": "fixGitPush1by1Check", + "repo": { + "allow_auto_merge": false, + "allow_forking": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_squash_merge": true, + "allow_update_branch": false, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "delete_branch_on_merge": false, + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE", + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "use_squash_pr_title_as_default": false, + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sha": "c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "html_url": "https://github.com/realmarv/conventions/pull/4", + "id": 1287033164, + "issue_url": "https://api.github.com/repos/realmarv/conventions/issues/4", + "labels": [], + "locked": false, + "maintainer_can_modify": false, + "merge_commit_sha": null, + "mergeable": null, + "mergeable_state": "unknown", + "merged": false, + "merged_at": null, + "merged_by": null, + "milestone": null, + "node_id": "PR_kwDOIMpMhM5MtpFM", + "number": 4, + "patch_url": "https://github.com/realmarv/conventions/pull/4.patch", + "rebaseable": null, + "requested_reviewers": [], + "requested_teams": [], + "review_comment_url": "https://api.github.com/repos/realmarv/conventions/pulls/comments{/number}", + "review_comments": 0, + "review_comments_url": "https://api.github.com/repos/realmarv/conventions/pulls/4/comments", + "state": "open", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133", + "title": "Fix git push1by1 check", + "updated_at": "2023-03-23T09:00:26Z", + "url": "https://api.github.com/repos/realmarv/conventions/pulls/4", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "repository": { + "allow_forking": true, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sender": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + } +"""> + +printfn "prCommits: %A" prCommits + +if Seq.length prCommits > 1 then + Environment.Exit 0 +else + let prCommit = Seq.nth 0 prCommits + printfn "prCommit: %A" prCommit + + let jsonString = File.ReadAllText githubEventPath + let parsedJsonObj = githubEventType.Parse jsonString + + let prTitle = parsedJsonObj.PullRequest.Title + let prBody = parsedJsonObj.PullRequest.Body.ToString() + printfn "prTitle: %A" prTitle + printfn "prBody: %A" prBody + + let lastCommitMessage = + Process + .Execute( + { + Command = "git" + Arguments = "log -1 --pretty=%B" + }, + Process.Echo.Off + ) + .UnwrapDefault() + .Trim() + + let newLineIndex = lastCommitMessage.IndexOf("\n") + + let commitMsgTitle = + if newLineIndex > 0 then + lastCommitMessage.[0..newLineIndex].Trim() + else + lastCommitMessage.Trim() + + let commitMsgBody = + if newLineIndex > 0 then + lastCommitMessage.[newLineIndex..].Trim() + else + null + + printfn "commitMsgTitle: %A" commitMsgTitle + printfn "commitMsgBody: %A" commitMsgBody + + if commitMsgTitle <> prTitle then + let errMsg = + "When there is only one commit in the PR, the PR title and the commit message title shouldn't differ." + + Console.Error.WriteLine errMsg + Environment.Exit 1 + + if commitMsgBody <> prBody then + let errMsg = + "When there is only one commit in the PR, the PR description and the commit message body shouldn't differ." + + Console.Error.WriteLine errMsg + Environment.Exit 1 diff --git a/scripts/detectNotUsingGitPush1by1.fsx b/scripts/detectNotUsingGitPush1by1.fsx index 02196d9fd..0e5d03cf1 100644 --- a/scripts/detectNotUsingGitPush1by1.fsx +++ b/scripts/detectNotUsingGitPush1by1.fsx @@ -1,21 +1,541 @@ #!/usr/bin/env -S dotnet fsi open System +open System.IO open System.Net.Http open System.Net.Http.Headers +#r "nuget: FSharp.Data, Version=5.0.2" +open FSharp.Data + #r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" open Fsdk +let githubEventPath = Environment.GetEnvironmentVariable "GITHUB_EVENT_PATH" -let gitRepo = Environment.GetEnvironmentVariable "GITHUB_REPOSITORY" - -if String.IsNullOrEmpty gitRepo then +if String.IsNullOrEmpty githubEventPath then Console.Error.WriteLine "This script is meant to be used only within a GitHubCI pipeline" Environment.Exit 2 +type githubEventType = + JsonProvider<""" +{ + "action": "opened", + "number": 4, + "pull_request": { + "_links": { + "comments": { + "href": "https://api.github.com/repos/realmarv/conventions/issues/4/comments" + }, + "commits": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4/commits" + }, + "html": { + "href": "https://github.com/realmarv/conventions/pull/4" + }, + "issue": { + "href": "https://api.github.com/repos/realmarv/conventions/issues/4" + }, + "review_comment": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/comments{/number}" + }, + "review_comments": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4/comments" + }, + "self": { + "href": "https://api.github.com/repos/realmarv/conventions/pulls/4" + }, + "statuses": { + "href": "https://api.github.com/repos/realmarv/conventions/statuses/c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133" + } + }, + "active_lock_reason": null, + "additions": 21, + "assignee": null, + "assignees": [], + "author_association": "OWNER", + "auto_merge": null, + "base": { + "label": "realmarv:master", + "ref": "master", + "repo": { + "allow_auto_merge": false, + "allow_forking": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_squash_merge": true, + "allow_update_branch": false, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "delete_branch_on_merge": false, + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE", + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "use_squash_pr_title_as_default": false, + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sha": "0be2f2d608cdf893e146db1296dee750a2a54cfc", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "body": null, + "changed_files": 2, + "closed_at": null, + "comments": 0, + "comments_url": "https://api.github.com/repos/realmarv/conventions/issues/4/comments", + "commits": 2, + "commits_url": "https://api.github.com/repos/realmarv/conventions/pulls/4/commits", + "created_at": "2023-03-23T09:00:26Z", + "deletions": 0, + "diff_url": "https://github.com/realmarv/conventions/pull/4.diff", + "draft": false, + "head": { + "label": "realmarv:fixGitPush1by1Check", + "ref": "fixGitPush1by1Check", + "repo": { + "allow_auto_merge": false, + "allow_forking": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_squash_merge": true, + "allow_update_branch": false, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "delete_branch_on_merge": false, + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE", + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "use_squash_pr_title_as_default": false, + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sha": "c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "html_url": "https://github.com/realmarv/conventions/pull/4", + "id": 1287033164, + "issue_url": "https://api.github.com/repos/realmarv/conventions/issues/4", + "labels": [], + "locked": false, + "maintainer_can_modify": false, + "merge_commit_sha": null, + "mergeable": null, + "mergeable_state": "unknown", + "merged": false, + "merged_at": null, + "merged_by": null, + "milestone": null, + "node_id": "PR_kwDOIMpMhM5MtpFM", + "number": 4, + "patch_url": "https://github.com/realmarv/conventions/pull/4.patch", + "rebaseable": null, + "requested_reviewers": [], + "requested_teams": [], + "review_comment_url": "https://api.github.com/repos/realmarv/conventions/pulls/comments{/number}", + "review_comments": 0, + "review_comments_url": "https://api.github.com/repos/realmarv/conventions/pulls/4/comments", + "state": "open", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/c5eb50ea6c5a72d61ab85d96ffc66cc4741d3133", + "title": "Fix git push1by1 check", + "updated_at": "2023-03-23T09:00:26Z", + "url": "https://api.github.com/repos/realmarv/conventions/pulls/4", + "user": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + }, + "repository": { + "allow_forking": true, + "archive_url": "https://api.github.com/repos/realmarv/conventions/{archive_format}{/ref}", + "archived": false, + "assignees_url": "https://api.github.com/repos/realmarv/conventions/assignees{/user}", + "blobs_url": "https://api.github.com/repos/realmarv/conventions/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/realmarv/conventions/branches{/branch}", + "clone_url": "https://github.com/realmarv/conventions.git", + "collaborators_url": "https://api.github.com/repos/realmarv/conventions/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/realmarv/conventions/comments{/number}", + "commits_url": "https://api.github.com/repos/realmarv/conventions/commits{/sha}", + "compare_url": "https://api.github.com/repos/realmarv/conventions/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/realmarv/conventions/contents/{+path}", + "contributors_url": "https://api.github.com/repos/realmarv/conventions/contributors", + "created_at": "2022-10-12T08:48:57Z", + "default_branch": "master", + "deployments_url": "https://api.github.com/repos/realmarv/conventions/deployments", + "description": null, + "disabled": false, + "downloads_url": "https://api.github.com/repos/realmarv/conventions/downloads", + "events_url": "https://api.github.com/repos/realmarv/conventions/events", + "fork": true, + "forks": 0, + "forks_count": 0, + "forks_url": "https://api.github.com/repos/realmarv/conventions/forks", + "full_name": "realmarv/conventions", + "git_commits_url": "https://api.github.com/repos/realmarv/conventions/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/realmarv/conventions/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/realmarv/conventions/git/tags{/sha}", + "git_url": "git://github.com/realmarv/conventions.git", + "has_discussions": false, + "has_downloads": true, + "has_issues": false, + "has_pages": false, + "has_projects": true, + "has_wiki": true, + "homepage": null, + "hooks_url": "https://api.github.com/repos/realmarv/conventions/hooks", + "html_url": "https://github.com/realmarv/conventions", + "id": 550128772, + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/realmarv/conventions/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/realmarv/conventions/issues/events{/number}", + "issues_url": "https://api.github.com/repos/realmarv/conventions/issues{/number}", + "keys_url": "https://api.github.com/repos/realmarv/conventions/keys{/key_id}", + "labels_url": "https://api.github.com/repos/realmarv/conventions/labels{/name}", + "language": "TypeScript", + "languages_url": "https://api.github.com/repos/realmarv/conventions/languages", + "license": { + "key": "mit", + "name": "MIT License", + "node_id": "MDc6TGljZW5zZTEz", + "spdx_id": "MIT", + "url": "https://api.github.com/licenses/mit" + }, + "merges_url": "https://api.github.com/repos/realmarv/conventions/merges", + "milestones_url": "https://api.github.com/repos/realmarv/conventions/milestones{/number}", + "mirror_url": null, + "name": "conventions", + "node_id": "R_kgDOIMpMhA", + "notifications_url": "https://api.github.com/repos/realmarv/conventions/notifications{?since,all,participating}", + "open_issues": 4, + "open_issues_count": 4, + "owner": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + }, + "private": false, + "pulls_url": "https://api.github.com/repos/realmarv/conventions/pulls{/number}", + "pushed_at": "2023-03-23T09:00:26Z", + "releases_url": "https://api.github.com/repos/realmarv/conventions/releases{/id}", + "size": 2395, + "ssh_url": "git@github.com:realmarv/conventions.git", + "stargazers_count": 0, + "stargazers_url": "https://api.github.com/repos/realmarv/conventions/stargazers", + "statuses_url": "https://api.github.com/repos/realmarv/conventions/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/realmarv/conventions/subscribers", + "subscription_url": "https://api.github.com/repos/realmarv/conventions/subscription", + "svn_url": "https://github.com/realmarv/conventions", + "tags_url": "https://api.github.com/repos/realmarv/conventions/tags", + "teams_url": "https://api.github.com/repos/realmarv/conventions/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/realmarv/conventions/git/trees{/sha}", + "updated_at": "2022-10-13T08:53:39Z", + "url": "https://api.github.com/repos/realmarv/conventions", + "visibility": "public", + "watchers": 0, + "watchers_count": 0, + "web_commit_signoff_required": false + }, + "sender": { + "avatar_url": "https://avatars.githubusercontent.com/u/50144546?v=4", + "events_url": "https://api.github.com/users/realmarv/events{/privacy}", + "followers_url": "https://api.github.com/users/realmarv/followers", + "following_url": "https://api.github.com/users/realmarv/following{/other_user}", + "gists_url": "https://api.github.com/users/realmarv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/realmarv", + "id": 50144546, + "login": "realmarv", + "node_id": "MDQ6VXNlcjUwMTQ0NTQ2", + "organizations_url": "https://api.github.com/users/realmarv/orgs", + "received_events_url": "https://api.github.com/users/realmarv/received_events", + "repos_url": "https://api.github.com/users/realmarv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/realmarv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/realmarv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/realmarv" + } + } +"""> + +let jsonString = File.ReadAllText githubEventPath +let parsedJsonObj = githubEventType.Parse jsonString + +let gitForkUser = parsedJsonObj.PullRequest.Head.User.Login +let gitForkRepo = parsedJsonObj.PullRequest.Head.Repo.Name +let gitRepo = $"{gitForkUser}/{gitForkRepo}" + let currentBranch = Process .Execute(