From 11583750d55e2f5316577800358e80d3978b4ca8 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 01:23:25 +0530 Subject: [PATCH 01/18] Create merge_conflict_helpers.js Signed-off-by: cheese-cakee --- .github/scripts/merge_conflict_helpers.js | 92 +++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 .github/scripts/merge_conflict_helpers.js diff --git a/.github/scripts/merge_conflict_helpers.js b/.github/scripts/merge_conflict_helpers.js new file mode 100644 index 000000000..43b18bba3 --- /dev/null +++ b/.github/scripts/merge_conflict_helpers.js @@ -0,0 +1,92 @@ +// scripts/merge_conflict_helpers.js + +const BOT_SIGNATURE = ''; + +module.exports = async ({ github, context, core }) => { + const { owner, repo } = context.repo; + + // fetch PR with retry logic for unknown state + async function getPrWithRetry(prNumber) { + for (let i = 0; i < 10; i++) { + const { data: pr } = await github.rest.pulls.get({ + owner, repo, pull_number: prNumber + }); + + if (pr.mergeable_state !== 'unknown') return pr; + + console.log(`PR #${prNumber} state is 'unknown'. Retrying (${i+1}/10)...`); + await new Promise(r => setTimeout(r, 2000)); + } + const { data: pr } = await github.rest.pulls.get({ owner, repo, pull_number: prNumber }); + return pr; + } + + // post comment + async function notifyUser(prNumber) { + const { data: comments } = await github.rest.issues.listComments({ + owner, repo, issue_number: prNumber, + }); + + if (comments.some(c => c.body.includes(BOT_SIGNATURE))) { + console.log(`Already commented on PR #${prNumber}. Skipping.`); + return; + } + + const body = `Hi, this is MergeConflictBot.\nYour pull request cannot be merged because it contains **merge conflicts**.\n\nPlease resolve these conflicts locally and push the changes.\n\nTo assist you, please read:\n- [Resolving Merge Conflicts](docs/sdk_developers/merge_conflicts.md)\n- [Rebasing Guide](docs/sdk_developers/rebasing.md)\n\nThank you for contributing!\nFrom the Hiero Python SDK Team\n\n${BOT_SIGNATURE}`; + + await github.rest.issues.createComment({ + owner, repo, issue_number: prNumber, body: body + }); + } + + //set commit status + async function setCommitStatus(sha, state, description) { + await github.rest.repos.createCommitStatus({ + owner, repo, sha: sha, state: state, + context: 'Merge Conflict Detector', + description: description, + target_url: `${process.env.GITHUB_SERVER_URL}/${owner}/${repo}/actions/runs/${context.runId}` + }); + } + + //main + let prsToCheck = []; + + //push to main + if (context.eventName === 'push') { + console.log("Triggered by Push to Main. Fetching all open PRs..."); + const { data: openPrs } = await github.rest.pulls.list({ + owner, repo, state: 'open', base: 'main' + }); + prsToCheck = openPrs.map(pr => pr.number); + } + //PR update + else { + console.log("Triggered by PR update."); + prsToCheck.push(context.payload.pull_request.number); + } + + let hasFailure = false; + + for (const prNumber of prsToCheck) { + console.log(`Checking PR #${prNumber}...`); + const pr = await getPrWithRetry(prNumber); + + if (pr.mergeable_state === 'dirty') { + console.log(`Conflict detected in PR #${prNumber}`); + await notifyUser(prNumber); + + if (context.eventName === 'push') { + await setCommitStatus(pr.head.sha, 'failure', 'Conflicts detected with main'); + } else { + core.setFailed(`Merge conflicts detected in PR #${prNumber}.`); + hasFailure = true; + } + } else { + console.log(`PR #${prNumber} is clean.`); + if (context.eventName === 'push') { + await setCommitStatus(pr.head.sha, 'success', 'No conflicts detected'); + } + } + } +}; From 353fc4f3ea520526ad06f0b457e1557dc06ef4e5 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 01:24:33 +0530 Subject: [PATCH 02/18] Update merge-conflict-bot.yml Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 71 +++++++----------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index af6d61426..28a474cc1 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -1,71 +1,38 @@ -name: PythonBot - Check Merge Conflicts +name: Merge Conflict Bot on: pull_request_target: types: [opened, synchronize, reopened] + push: + branches: + - main permissions: contents: read pull-requests: write + issues: write + statuses: write concurrency: - group: "check-conflicts-${{ github.event.pull_request.number }}" + group: "check-conflicts-${{ github.event.pull_request.number || github.sha }}" cancel-in-progress: true jobs: check-conflicts: runs-on: ubuntu-latest - steps: - - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + - name: Checkout code + uses: actions/checkout@v4 + + - name: Harden the runner + uses: step-security/harden-runner@v2.10.2 with: egress-policy: audit - - - name: Check for merge conflicts - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - PR_NUMBER=${{ github.event.pull_request.number }} - REPO="${{ github.repository }}" - - echo "Checking merge status for PR #$PR_NUMBER in repository $REPO..." - - for i in {1..10}; do - PR_JSON=$(gh api repos/$REPO/pulls/$PR_NUMBER) - MERGEABLE_STATE=$(echo "$PR_JSON" | jq -r '.mergeable_state') - - echo "Attempt $i: Current mergeable state: $MERGEABLE_STATE" - - if [ "$MERGEABLE_STATE" != "unknown" ]; then - break - fi - echo "State is 'unknown', waiting 2 seconds..." - sleep 2 - done - - if [ "$MERGEABLE_STATE" = "dirty" ]; then - COMMENT=$(cat </dev/null || \ - (gh pr comment $PR_NUMBER --repo $REPO --body "$COMMENT" && echo "Comment added to PR #$PR_NUMBER") - - exit 1 - else - echo "No merge conflicts detected (State: $MERGEABLE_STATE)." - fi + - name: Check for merge conflicts + + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd + with: + script: | + const script = require('./scripts/merge_conflict_helpers.js') + await script({github, context, core}) From cde40937b5a0d4ff898ea21b8268525ef55a701c Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 01:35:53 +0530 Subject: [PATCH 03/18] Update merge-conflict-bot.yml Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 28a474cc1..7872f69d9 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -6,6 +6,7 @@ on: push: branches: - main + - merge-conflict-bot-main-trigger permissions: contents: read From dfdca52917ff7bb3a119c56f114efba561511614 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 01:39:28 +0530 Subject: [PATCH 04/18] Update README.md Signed-off-by: cheese-cakee --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a2b9de148..8f2ad84c2 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![License](https://img.shields.io/badge/license-apache2-blue.svg)](LICENSE) A Python SDK for interacting with the Hedera Hashgraph platform. +This is the BASE branch version ## Quick Start From 8fe94dea6111ee59610a6439810e6773c7d6a7bc Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 02:04:02 +0530 Subject: [PATCH 05/18] Create clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 clean.txt diff --git a/clean.txt b/clean.txt new file mode 100644 index 000000000..53e5f1738 --- /dev/null +++ b/clean.txt @@ -0,0 +1 @@ +This is the MAIN branch version that causes a crash From 5b5b068ed65868fde3e08c892636a86310f6408f Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 02:15:26 +0530 Subject: [PATCH 06/18] Delete clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 clean.txt diff --git a/clean.txt b/clean.txt deleted file mode 100644 index 53e5f1738..000000000 --- a/clean.txt +++ /dev/null @@ -1 +0,0 @@ -This is the MAIN branch version that causes a crash From 5ac50658a05a8a894bcfd90e3da434a43b8b8a3a Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 02:18:10 +0530 Subject: [PATCH 07/18] Update merge-conflict-bot.yml Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 7872f69d9..30e779323 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -31,9 +31,14 @@ jobs: egress-policy: audit - name: Check for merge conflicts - + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd with: script: | - const script = require('./scripts/merge_conflict_helpers.js') + const path = require('path') + // Fix: Use the workspace path to reliably find the script + const scriptPath = path.join(process.env.GITHUB_WORKSPACE, 'scripts/merge_conflict_helpers.js') + + console.log(`Loading script from: ${scriptPath}`) + const script = require(scriptPath) await script({github, context, core}) From 13880199437bb3d14aa64fbd27c272d72a6ef724 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 02:21:56 +0530 Subject: [PATCH 08/18] Create clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 clean.txt diff --git a/clean.txt b/clean.txt new file mode 100644 index 000000000..22725d52e --- /dev/null +++ b/clean.txt @@ -0,0 +1 @@ +will this break things hope it does, hope it does, oh i hope it does From c8fcec09a0f27113e51f7d9b37dd50bb8cbce7c7 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:04:01 +0530 Subject: [PATCH 09/18] Update merge-conflict-bot.yml Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 30e779323..1d6ed448d 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -31,13 +31,11 @@ jobs: egress-policy: audit - name: Check for merge conflicts - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd with: script: | const path = require('path') - // Fix: Use the workspace path to reliably find the script - const scriptPath = path.join(process.env.GITHUB_WORKSPACE, 'scripts/merge_conflict_helpers.js') + const scriptPath = path.join(process.env.GITHUB_WORKSPACE, '.github/scripts/merge_conflict_helpers.js') console.log(`Loading script from: ${scriptPath}`) const script = require(scriptPath) From 69f4371d7fc3d7fd1817d612cdb3e40831d27030 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:04:48 +0530 Subject: [PATCH 10/18] Delete clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 clean.txt diff --git a/clean.txt b/clean.txt deleted file mode 100644 index 22725d52e..000000000 --- a/clean.txt +++ /dev/null @@ -1 +0,0 @@ -will this break things hope it does, hope it does, oh i hope it does From 383e5eda692c35713119326e5c17ee7342bdd52a Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:07:44 +0530 Subject: [PATCH 11/18] Create clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 clean.txt diff --git a/clean.txt b/clean.txt new file mode 100644 index 000000000..02102dc9f --- /dev/null +++ b/clean.txt @@ -0,0 +1 @@ +hoping this will break stuff and stimulate the error i want to see From d01a4d9e2d9f43decd3c091224573c1dc35251ab Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:40:38 +0530 Subject: [PATCH 12/18] Delete clean.txt Signed-off-by: cheese-cakee --- clean.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 clean.txt diff --git a/clean.txt b/clean.txt deleted file mode 100644 index 02102dc9f..000000000 --- a/clean.txt +++ /dev/null @@ -1 +0,0 @@ -hoping this will break stuff and stimulate the error i want to see From f5f41f115fed3787f18c9ed94590ed49e6fbbf1b Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:41:34 +0530 Subject: [PATCH 13/18] cleanup after test Signed-off-by: cheese-cakee --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8f2ad84c2..a2b9de148 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![License](https://img.shields.io/badge/license-apache2-blue.svg)](LICENSE) A Python SDK for interacting with the Hedera Hashgraph platform. -This is the BASE branch version ## Quick Start From 2b6bdd5eda17a9e4eaa80e3c42b6de33f67027b9 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Tue, 9 Dec 2025 15:42:28 +0530 Subject: [PATCH 14/18] cleanup after test Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 1d6ed448d..76cfda378 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -6,7 +6,6 @@ on: push: branches: - main - - merge-conflict-bot-main-trigger permissions: contents: read From 4d23480a51022a9585ccd8adb5337e8a6c34722e Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Thu, 11 Dec 2025 00:47:28 +0530 Subject: [PATCH 15/18] chore: update harden-runner to latest v2.14.0 Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 76cfda378..3252729cd 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v4 - name: Harden the runner - uses: step-security/harden-runner@v2.10.2 + uses: step-security/harden-runner@v2.14.0 with: egress-policy: audit From eb39ae1c9f3f4d4f85177b361ba09e71ca2345dc Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Thu, 11 Dec 2025 16:16:59 +0530 Subject: [PATCH 16/18] Update merge_conflict_helpers.js Signed-off-by: cheese-cakee From 56948cdd8a79200d97bbe19487058fe4021785af Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Thu, 11 Dec 2025 19:12:45 +0530 Subject: [PATCH 17/18] Update merge-conflict-bot.yml Signed-off-by: cheese-cakee --- .github/workflows/merge-conflict-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/merge-conflict-bot.yml b/.github/workflows/merge-conflict-bot.yml index 57d2809be..acfcc6e1f 100644 --- a/.github/workflows/merge-conflict-bot.yml +++ b/.github/workflows/merge-conflict-bot.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 From af8b9cc1b0beca771c0c0f844053695a694aff58 Mon Sep 17 00:00:00 2001 From: cheese-cakee Date: Thu, 11 Dec 2025 19:25:26 +0530 Subject: [PATCH 18/18] Update merge_conflict_helpers.js Signed-off-by: cheese-cakee --- .github/scripts/merge_conflict_helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/merge_conflict_helpers.js b/.github/scripts/merge_conflict_helpers.js index 43b18bba3..4a0485f88 100644 --- a/.github/scripts/merge_conflict_helpers.js +++ b/.github/scripts/merge_conflict_helpers.js @@ -1,6 +1,6 @@ // scripts/merge_conflict_helpers.js -const BOT_SIGNATURE = ''; +const BOT_SIGNATURE = '[merge-conflict bot]'; module.exports = async ({ github, context, core }) => { const { owner, repo } = context.repo;