diff --git a/.github/workflows/auto-merge-dependabot.yml b/.github/workflows/auto-merge-dependabot.yml deleted file mode 100644 index ba6410d1..00000000 --- a/.github/workflows/auto-merge-dependabot.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Auto-merge Dependabot PRs - -on: - workflow_run: - workflows: [ "Pull Request" ] - types: [ completed ] - -jobs: - automerge-dependabot-pr: - if: "github.actor == 'dependabot[bot]' - && github.event.workflow_run.event == 'pull_request' - && github.event.workflow_run.conclusion == 'success'" - uses: Jikoo/PlanarActions/.github/workflows/pr_automerge_complete.yml@master - with: - triggering-workflow-run: ${{ github.event.workflow_run.id }} diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 236f785d..853e437f 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -6,8 +6,33 @@ on: jobs: run-ci: uses: Jikoo/PlanarActions/.github/workflows/ci_maven.yml@master - store-dependabot-pr-data: - if: "github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'" - uses: Jikoo/PlanarActions/.github/workflows/pr_automerge_prep.yml@master - with: - pr-number: ${{ github.event.number }} + approve-and-merge-dependabot: + if: "github.event_name == 'pull_request' && github.event.pull_request.user.login == 'dependabot[bot]'" + needs: [ "run-ci" ] + runs-on: "ubuntu-latest" + permissions: + contents: write + pull-requests: write + steps: + # Always approve PRs from Dependabot. + - name: Approve + run: gh pr review --approve "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GH_TOKEN: ${{secrets.GITHUB_TOKEN}} + + # Fetch Dependabot metadata for finer decisionmaking later. + - name: Fetch Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@21025c705c08248db411dc16f3619e6b5f9ea21a + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + # Enable auto-merge for the PR. + # Auto-merge is used rather than a direct merge so that any other required checks can pass. + - name: Enable auto-merge for minor/patch updates + if: steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' + run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/src/main/java/com/github/jikoo/regionerator/DeletionRunnable.java b/src/main/java/com/github/jikoo/regionerator/DeletionRunnable.java index 74f33228..85de0a7b 100644 --- a/src/main/java/com/github/jikoo/regionerator/DeletionRunnable.java +++ b/src/main/java/com/github/jikoo/regionerator/DeletionRunnable.java @@ -23,11 +23,14 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Runnable for checking and deleting chunks and regions. @@ -60,11 +63,28 @@ public void run() { if (world == null) { throw new IllegalStateException("Cannot reuse deletion runnable!"); } - world.getRegions().forEach(this::handleRegion); + + Future> regionsFuture = plugin.getServer().getScheduler().callSyncMethod(plugin, world::getRegions); + + Stream regions = null; + try { + // Fetch region info on the main thread. Getting data folder may throw a CME otherwise. + regions = regionsFuture.get(); + } catch (InterruptedException | ExecutionException e) { + plugin.getLogger().severe("Unable to access world data!"); + plugin.getLogger().log(Level.SEVERE, "Error accessing world data on main thread", e); + } + + if (regions != null) { + regions.forEach(this::handleRegion); + } + // Release world reference. world = null; plugin.getLogger().info("Deletion cycle complete for " + getRunStats()); nextRun.set(System.currentTimeMillis() + plugin.config().getCycleDelayMillis()); + + // If configured to remember cycle delays across restarts, do post-run callback on the main thread. if (plugin.config().isRememberCycleDelay()) { try { plugin.getServer().getScheduler().runTask(plugin, () -> plugin.finishCycle(this)); @@ -72,6 +92,7 @@ public void run() { // Plugin disabling, odds are on that we were mid-cycle. Don't update finish time. } } + phaser.arriveAndDeregister(); }