diff --git a/.copier-answers.yml b/.copier-answers.yml index 6ed04b71..1e9455b6 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: 00cee12 +_commit: d46567f _src_path: https://github.com/ingadhoc/addons-repo-template.git description: 'Aeroo Reports for Odoo diff --git a/.github/workflows/cleaner.yml b/.github/workflows/cleaner.yml new file mode 100644 index 00000000..5ff6ec49 --- /dev/null +++ b/.github/workflows/cleaner.yml @@ -0,0 +1,158 @@ +# ⚠️ DO NOT EDIT THIS FILE, IT IS GENERATED BY COPIER ⚠️ +# Changes here will be lost on a future update. +# See: https://github.com/ingadhoc/addons-repo-template + +name: Delete PR branch from fork and base repo + +on: + + deployment_status: + + # Trigger manual + workflow_dispatch: + inputs: + pull_request_number: + description: 'Pull Request number to delete the branch' + required: true + type: number + +jobs: + delete-branch: + runs-on: ubuntu-latest + if: > + github.repository_owner == 'ingadhoc' && + ( + (github.event_name == 'workflow_dispatch') || + (github.event_name == 'deployment_status' && github.event.deployment_status.state == 'success') + ) + steps: + - name: Delete branch from base and fork repos + uses: actions/github-script@v6 + id: pr_data_fetcher + with: + script: | + // Get PR information + core.info('Fetching PR data and validating conditions...'); + + // Debug info + const eventName = context.eventName; + core.info(`El nombre del evento es: ${eventName}`); + core.info(JSON.stringify(context, null, 2)) + // End Debug info + + let repoOwner = context.repo.owner; + let repoName = context.repo.repo; + let pullRequest; + + if (context.eventName === 'workflow_dispatch' || context.eventName === 'deployment_status') { + let prNumber = 0; + if (context.eventName === 'workflow_dispatch') { + prNumber = context.payload.inputs.pull_request_number; + core.info(`Manual trigger for PR #${prNumber}`); + } + + if (context.eventName === 'deployment_status') { + prNumber = context.payload.deployment_status.description.split("#")[1].split(" ")[0]; + core.info(`deployment_status trigger for PR #${prNumber}`); + } + + // Fetch the PR data using the number + pullRequest = (await github.rest.pulls.get({ + owner: repoOwner, + repo: repoName, + pull_number: prNumber, + })).data; + + core.info(JSON.stringify(pullRequest, null, 2)) + + if (pullRequest.merged === true) { + core.info(`PR #${prNumber} was merged. No action needed.`); + core.setOutput('validation_passed', 'false'); + return; + } + + // Fetch the PR timeline to find the 'closed' event + const timeline = await github.rest.issues.listEventsForTimeline({ + owner: repoOwner, + repo: repoName, + issue_number: prNumber, + }); + + // Find the 'closed' event in the timeline + const closeEvent = timeline.data.find(event => event.event === 'closed'); + + // Get the user who closed the PR from the event + const closedByLogin = closeEvent && closeEvent.actor ? closeEvent.actor.login : null; + + if (closedByLogin !== 'roboadhoc') { + core.info(`PR #${prNumber} was not closed by 'roboadhoc' (${closedByLogin}). No action needed.`); + core.setOutput('validation_passed', 'false'); + return; + } + + } else { + core.setOutput('validation_passed', 'false'); + core.error(`Unsupported event type: ${context.eventName}`); + return; + } + + // Set outputs for subsequent steps + core.setOutput('validation_passed', 'true'); + core.setOutput('base_repo_owner', repoOwner); + core.setOutput('base_repo_name', repoName); + core.setOutput('base_branch_name', pullRequest.head.ref); + core.setOutput('head_repo_full_name', pullRequest.head.repo.full_name); + core.setOutput('head_repo_owner', pullRequest.head.repo.owner.login); + core.setOutput('head_repo_name', pullRequest.head.repo.name); + core.setOutput('is_fork', pullRequest.head.repo.full_name !== context.repo.owner + '/' + context.repo.repo); + + - name: Delete branch from the base repository + uses: actions/github-script@v6 + if: ${{ steps.pr_data_fetcher.outputs.validation_passed == 'true' }} + with: + github-token: ${{ github.token }} + script: | + const baseBranchName = `${{ steps.pr_data_fetcher.outputs.base_branch_name }}`; + const baseRepoOwner = `${{ steps.pr_data_fetcher.outputs.base_repo_owner }}`; + const baseRepoName = `${{ steps.pr_data_fetcher.outputs.base_repo_name }}`; + try { + core.info(`Attempting to delete branch '${baseBranchName}' from base repo '${baseRepoOwner}/${baseRepoName}'`); + await github.rest.git.deleteRef({ + owner: baseRepoOwner, + repo: baseRepoName, + ref: `heads/${baseBranchName}`, + }); + core.info(`Branch '${baseBranchName}' deleted from base repo successfully.`); + } catch (error) { + if (error.status === 422) { + core.info(`Branch '${baseBranchName}' in base repo already deleted. No action needed.`); + } else { + console.error(`Error deleting branch '${baseBranchName}' from base repo: ${error.message}`); + } + } + + - name: Delete branch from the fork repository (adhoc-dev) + if: ${{ steps.pr_data_fetcher.outputs.validation_passed == 'true' }} + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.EXTERNAL_REPO_TOKEN_CLEANER_ADHOC_DEV || github.token }} + script: | + const baseBranchName = `${{ steps.pr_data_fetcher.outputs.base_branch_name }}`; + const headRepoOwner = 'adhoc-dev'; + const headRepoName = `${{ steps.pr_data_fetcher.outputs.head_repo_name }}`; + + try { + core.info(`PR comes from a fork. Attempting to delete branch from fork repo '${headRepoOwner}/${headRepoName}'`); + await github.rest.git.deleteRef({ + owner: headRepoOwner, + repo: headRepoName, + ref: `heads/${baseBranchName}`, + }); + core.info(`Branch '${baseBranchName}' deleted from fork repo successfully.`); + } catch (error) { + if (error.status === 422) { + core.info(`Branch '${baseBranchName}' in fork repo already deleted. No action needed.`); + } else { + console.error(`Error deleting branch '${baseBranchName}' from fork repo: ${error.message}`); + } + } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6fd938a9..43962a94 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,10 @@ exclude: | (?x) +<<<<<<< before updating +======= +>>>>>>> after updating # We don't want to mess with tool-generated files .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs| # Library files can have extraneous formatting (even minimized)