Skip to content

Convert to Gradle build system with comprehensive documentation#20

Merged
jwaisner merged 4 commits intomainfrom
gradle-convert
Nov 19, 2025
Merged

Convert to Gradle build system with comprehensive documentation#20
jwaisner merged 4 commits intomainfrom
gradle-convert

Conversation

@N6REJ
Copy link
Collaborator

@N6REJ N6REJ commented Nov 14, 2025

PR Type

Enhancement, Documentation


Description

  • Convert build system from Apache Ant to Gradle with pure Groovy DSL

  • Add comprehensive Gradle documentation in .gradle-docs/ directory

  • Implement GitHub Actions CI/CD workflow for automated builds

  • Add markdown link validation and build artifact management


Diagram Walkthrough

flowchart LR
  A["Apache Ant<br/>build.xml"] -->|"Convert"| B["Gradle Build<br/>build.gradle.kts"]
  B -->|"Execute"| C["GitHub Actions<br/>CI/CD Workflow"]
  C -->|"Validate"| D["Markdown Link<br/>Checker"]
  C -->|"Build"| E["7z Archive<br/>bearsampp-mariadb"]
  F[".gradle-docs/<br/>Documentation"] -->|"Reference"| B
  F -->|"Guide"| G["Developers &<br/>Contributors"]
Loading

File Walkthrough

Relevant files
Configuration changes
2 files
markdown-link-check-config.json
Add markdown link checker configuration                                   
+17/-0   
build.yml
Add GitHub Actions CI/CD build workflow                                   
+183/-0 
Documentation
7 files
README.md
Add main Gradle build documentation                                           
+488/-0 
TASKS.md
Add comprehensive Gradle tasks reference                                 
+605/-0 
CONFIGURATION.md
Add detailed build configuration guide                                     
+650/-0 
MIGRATION.md
Add Ant to Gradle migration guide                                               
+526/-0 
CHANGELOG.md
Add project changelog with migration notes                             
+119/-0 
CONTRIBUTING.md
Add contribution guidelines and setup instructions             
+496/-0 
README.md
Update README with Gradle build instructions                         
+55/-2   
Miscellaneous
1 files
build.xml
Remove legacy Apache Ant build file                                           
+0/-61   

@qodo-code-review
Copy link
Contributor

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Validate Documentation

Failed stage: Check build files [❌]

Failure summary:

The action failed during the "Checking build files..." step because a required build file was
missing:
- Missing file: build.gradle.kts
The script explicitly checks for required Gradle build
files and exits with code 1 if any are absent. At line 195, it reports ✗ build.gradle.kts missing,
leading to the failure (exit code 1).

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

181:  �[36;1mecho "Checking build files..."�[0m
182:  �[36;1m�[0m
183:  �[36;1mtest -f build.gradle.kts || { echo "✗ build.gradle.kts missing"; exit 1; }�[0m
184:  �[36;1mtest -f settings.gradle.kts || { echo "✗ settings.gradle.kts missing"; exit 1; }�[0m
185:  �[36;1mtest -f build.properties || { echo "✗ build.properties missing"; exit 1; }�[0m
186:  �[36;1mtest -f releases.properties || { echo "✗ releases.properties missing"; exit 1; }�[0m
187:  �[36;1mtest -f gradlew || { echo "✗ gradlew missing"; exit 1; }�[0m
188:  �[36;1mtest -f gradlew.bat || { echo "✗ gradlew.bat missing"; exit 1; }�[0m
189:  �[36;1mtest -f gradle/wrapper/gradle-wrapper.properties || { echo "✗ gradle-wrapper.properties missing"; exit 1; }�[0m
190:  �[36;1m�[0m
191:  �[36;1mecho "✓ All build files present"�[0m
192:  shell: /usr/bin/bash -e {0}
193:  ##[endgroup]
194:  Checking build files...
195:  ✗ build.gradle.kts missing
196:  ##[error]Process completed with exit code 1.
197:  Post job cleanup.

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Nov 14, 2025

PR Compliance Guide 🔍

(Compliance updated until commit f92b483)

Below is a summary of compliance checks for this PR:

Security Compliance
Sensitive information exposure

Description: Uploading the entire .gradle/ and build/ directories as artifacts can unintentionally
expose sensitive data such as caches, environment-derived paths, logs, or credentials
written by plugins to CI logs/artifacts; restrict or scrub contents before upload.
build.yml [71-79]

Referred Code
- name: Upload build logs
  if: always()
  uses: actions/upload-artifact@v4
  with:
    name: build-logs
    path: |
      build/
      .gradle/
    retention-days: 7
Supply chain risk

Description: Installing 7-Zip via Chocolatey without checksum or signature verification relies on
external package trust and could allow supply-chain tampering; prefer pinned versions with
checksum verification or trusted runners.
build.yml [26-30]

Referred Code
- name: Setup 7-Zip
  run: |
    choco install 7zip -y
    echo "C:\Program Files\7-Zip" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
Integrity validation bypass

Description: The markdown link checker ignores https://bearsampp.com links entirely, which could mask
defaced or malicious link changes in documentation; avoid blanket ignores or narrow the
pattern to known flakey endpoints instead.
markdown-link-check-config.json [4-8]

Referred Code
  "pattern": "^http://localhost"
},
{
  "pattern": "^https://bearsampp.com"
}
Ticket Compliance
🎫 No ticket provided
  • Create ticket/issue
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status:
Limited Auditing: The workflow adds build, validation, and release steps but does not implement audit
logging of critical actions beyond standard CI logs, which may be acceptable for CI but
does not meet explicit audit trail requirements.

Referred Code
jobs:
  build:
    name: Build Module
    runs-on: windows-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'gradle'

      - name: Setup 7-Zip
        run: |
          choco install 7zip -y
          echo "C:\Program Files\7-Zip" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append



 ... (clipped 153 lines)

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
Error Handling Gaps: Several steps rely on default action failure without contextual error handling or
validation of edge cases (e.g., downloads, Gradle tasks), which may be acceptable for CI
but lacks explicit, contextual error management.

Referred Code
- name: Validate configuration
  run: ./gradlew validate --no-daemon --stacktrace

- name: List MariaDB versions
  run: ./gradlew listVersions --no-daemon

- name: Build module
  run: ./gradlew build --no-daemon --stacktrace
  env:
    BEARSAMPP_BUILD_PATH: ${{ github.workspace }}/build-output

- name: Check build output
  run: |
    if (Test-Path "build-output/bearsampp-mariadb-*.7z") {
      Write-Host "✓ Build artifact created successfully"
      Get-ChildItem "build-output/bearsampp-mariadb-*.7z" | ForEach-Object {
        $sizeMB = [math]::Round($_.Length / 1MB, 2)
        Write-Host "  File: $($_.Name)"
        Write-Host "  Size: $sizeMB MB"
      }
    } else {


 ... (clipped 88 lines)

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status:
Potential Secret Exposure: The workflow prints environment-derived paths and build details and uploads logs; while no
secrets are explicitly echoed, the use of Gradle with --stacktrace and uploaded
.gradle/build logs could inadvertently contain sensitive data depending on tasks.

Referred Code
- name: Upload build logs
  if: always()
  uses: actions/upload-artifact@v4
  with:
    name: build-logs
    path: |
      build/
      .gradle/
    retention-days: 7

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status:
External Input Trust: The build pulls remote content (e.g., versions/properties via Gradle tasks) and downloads
installers without explicit checksum verification in the workflow, leaving validation to
Gradle logic not shown in this diff.

Referred Code
- name: List MariaDB versions
  run: ./gradlew listVersions --no-daemon

- name: Build module
  run: ./gradlew build --no-daemon --stacktrace
  env:

Learn more about managing compliance generic rules or creating your own custom rules

Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

Previous compliance checks

Compliance check up to commit 5eff742
Security Compliance
Weak default credentials

Description: The Gradle validation example logs when mariadbRootPwd is empty, which may encourage
keeping default empty root passwords in shipped configs (e.g., bearsampp.conf shows
mariadbRootPwd = ""), potentially distributing archives with a blank database root
password and risking unauthorized local access if used beyond controlled dev environments.

CONFIGURATION.md [612-621]

Referred Code
    // Check port number
    if (!content.contains("mariadbPort = \"3307\"")) {
        println("WARNING: ${confFile.name} uses non-standard port")
    }

    // Check for empty password
    if (content.contains("mariadbRootPwd = \"\"")) {
        println("INFO: ${confFile.name} has empty root password")
    }
}
Insecure default password

Description: Documentation and examples set mariadbRootPwd = "" as the default, normalizing an empty
root password for MariaDB which, if deployed or used in shared environments, can expose
the database to immediate compromise.
README.md [224-241]

Referred Code
mariadbPort = "3307"
mariadbRootUser = "root"
mariadbRootPwd = ""

bundleRelease = "@RELEASE_VERSION@"
Property Description Example Value
mariadbVersion MariaDB version number "12.0.2"
mariadbExe Path to MariaDB server executable "bin/mysqld.exe"
mariadbCliExe Path to MariaDB client executable "bin/mysql.exe"
mariadbAdmin Path to MariaDB admin tool "bin/mysqladmin.exe"
mariadbConf Configuration file name "my.ini"
mariadbPort Default port number "3307"
mariadbRootUser Default root username "root"
mariadbRootPwd Default root password ""
bundleRelease Release version (auto-replaced) "2025.8.21"

</details></details></td></tr>
<tr><td><details><summary><strong>Command injection risk
</strong></summary><br>

<b>Description:</b> The build task example executes external <code>7z</code> via commandLine with arguments derived from <br>properties; if any part becomes user-influenced (e.g., <code>bundleName</code>), command injection <br>risks could arise—inputs should be validated or escaped when invoking external tools.<br> <strong><a href='https://github.com/Bearsampp/module-mariadb/pull/20/files#diff-96d3c6430f6d326919a39d842284a7202fe3c199f0267ce9d455ce895695b40eR570-R585'>CONFIGURATION.md [570-585]</a></strong><br>

<details open><summary>Referred Code</summary>

```markdown
```kotlin
tasks.bundle {
    when (bundleFormat) {
        "7z" -> {
            commandLine("7z", "a", "-t7z",
                "-m0=lzma2",    // Compression method
                "-mx=9",        // Compression level (0-9)
                "-mfb=64",      // Fast bytes
                "-md=32m",      // Dictionary size
                "-ms=on",       // Solid archive
                outputFile.absolutePath,
                "module-${bundleName}")
        }
    }
}

</details></details></td></tr>
<tr><td colspan='2'><strong>Ticket Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary>🎫 <strong>No ticket provided </strong></summary>


- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
<tr><td colspan='2'><strong>Codebase Duplication Compliance</strong></td></tr>
<tr><td>⚪</td><td><details><summary><strong>Codebase context is not defined </strong></summary>


Follow the <a href='https://qodo-merge-docs.qodo.ai/core-abilities/rag_context_enrichment/'>guide</a> to enable codebase context checks.

</details></td></tr>
<tr><td colspan='2'><strong>Custom Compliance</strong></td></tr>
<tr><td rowspan=2>🟢</td><td>
<details><summary><strong>Generic: Meaningful Naming and Self-Documenting Code</strong></summary><br>

**Objective:** Ensure all identifiers clearly express their purpose and intent, making code <br>self-documenting<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td>
<details><summary><strong>Generic: Secure Logging Practices</strong></summary><br>

**Objective:** To ensure logs are useful for debugging and auditing without exposing sensitive <br>information like PII, PHI, or cardholder data.<br>

**Status:** Passed<br>


> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td rowspan=4>⚪</td>
<td><details>
<summary><strong>Generic: Comprehensive Audit Trails</strong></summary><br>

**Objective:** To create a detailed and reliable record of critical system actions for security analysis <br>and compliance.<br>

**Status:** <br><a href='https://github.com/Bearsampp/module-mariadb/pull/20/files#diff-62b7322bfc2ee8cb7cc871417275fe4347be0188d8603733679d5c3b9bc25f6cR188-R205'><strong>Limited Logging</strong></a>: New Gradle task docs show informational console prints but no explicit audit logging of <br>critical actions (e.g., user, outcome), which may be acceptable for build docs but does <br>not demonstrate audit trails for critical system actions.<br>
<details open><summary>Referred Code</summary>

```markdown
**Output**:

Task :clean
Task :init
Initialized build directory: C:/Bearsampp-build/module-mariadb
Task :release
Processed: module-mariadb/bin/mariadb10.11.14/bearsampp.conf
Processed: module-mariadb/bin/mariadb11.8.3/bearsampp.conf
Processed: module-mariadb/bin/mariadb12.0.2/bearsampp.conf
Task :bundle
Bundle created: C:/Bearsampp-build/bearsampp-mariadb-2025.8.21.7z
Bundle size: 245 MB
Task :build
Build completed successfully!
Bundle: bearsampp-mariadb-2025.8.21.7z
BUILD SUCCESSFUL in 48s
5 actionable tasks: 5 executed

Learn more about managing compliance generic rules or creating your own custom rules

Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
Error Handling Docs: Documentation references failures and shows stacktrace flags, but added content does not
show concrete error handling code for edge cases; as this PR adds docs only, robustness
cannot be verified from the diff.

Referred Code
---

### Task Failed

**Error**: `Task ':bundle' FAILED`

**Solution**: Run with stack trace:
```bash
./gradlew bundle --stacktrace


</details>

> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td><details>
<summary><strong>Generic: Secure Error Handling</strong></summary><br>

**Objective:** To prevent the leakage of sensitive system information through error messages while <br>providing sufficient detail for internal debugging.<br>

**Status:** <br><a href='https://github.com/Bearsampp/module-mariadb/pull/20/files#diff-964df91d9863f52c526c4793242b7b3fa5087dd9a6eb692d6c947080c719f921R339-R351'><strong>Stacktrace Guidance</strong></a>: Docs encourage using --stacktrace for debugging which is appropriate for developers, but <br>no distinction is made for user-facing contexts; cannot confirm secure user-facing error <br>messaging from documentation alone.<br>
<details open><summary>Referred Code</summary>

```markdown

Run Gradle with additional logging:

```bash
# Info level
gradle build --info

# Debug level
gradle build --debug

# Stack traces
gradle build --stacktrace

</details>

> Learn more about managing compliance <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#configuration-options'>generic rules</a> or creating your own <a href='https://qodo-merge-docs.qodo.ai/tools/compliance/#custom-compliance'>custom rules</a>
</details></td></tr>
<tr><td><details>
<summary><strong>Generic: Security-First Input Validation and Data Handling</strong></summary><br>

**Objective:** Ensure all data inputs are validated, sanitized, and handled securely to prevent <br>vulnerabilities<br>

**Status:** <br><a href='https://github.com/Bearsampp/module-mariadb/pull/20/files#diff-96d3c6430f6d326919a39d842284a7202fe3c199f0267ce9d455ce895695b40eR437-R439'><strong>Empty Password Note</strong></a>: Documentation shows <code>mariadbRootPwd = &quot;&quot;</code> with a security note for local <br>development, but without accompanying safeguards this could encourage insecure defaults if <br>propagated beyond local contexts.<br>
<details open><summary>Referred Code</summary>

```markdown
**Security note**: Empty by default for local development.

---

Learn more about managing compliance generic rules or creating your own custom rules

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Nov 14, 2025

PR Code Suggestions ✨

Latest suggestions up to f92b483

CategorySuggestion                                                                                                                                    Impact
Possible issue
Enable release on tag pushes

Fix the workflow by adding a tags trigger to the on: push: event, which is
required for the release job to ever run.

.github/workflows/build.yml [148-152]

-release:
-  name: Create Release
-  runs-on: windows-latest
-  needs: [build, validate]
-  if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
+on:
+  push:
+    branches: [ main, gradle-convert ]
+    tags:
+      - '*'
+  pull_request:
+    branches: [ main ]
+  workflow_dispatch:
+jobs:
+  release:
+    name: Create Release
+    runs-on: windows-latest
+    needs: [build, validate]
+    if: startsWith(github.ref, 'refs/tags/')
  • Apply / Chat
Suggestion importance[1-10]: 10

__

Why: This is a critical bug fix, as the release job would never be triggered with the current configuration, rendering the release automation non-functional.

High
Verify 7-Zip install path reliably

Improve the 7-Zip setup step by dynamically finding the installation path
instead of hardcoding it, making the workflow more robust.

.github/workflows/build.yml [26-29]

 - name: Setup 7-Zip
+  shell: pwsh
   run: |
-    choco install 7zip -y
-    echo "C:\Program Files\7-Zip" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+    choco install 7zip -y --no-progress
+    $possiblePaths = @(
+      "C:\Program Files\7-Zip",
+      "C:\Program Files (x86)\7-Zip"
+    )
+    $sevenZipPath = $possiblePaths | Where-Object { Test-Path (Join-Path $_ '7z.exe') } | Select-Object -First 1
+    if (-not $sevenZipPath) {
+      Write-Error "7-Zip not found after installation."
+      exit 1
+    }
+    $sevenZipPath | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+    & (Join-Path $sevenZipPath '7z.exe') -h > $null
  • Apply / Chat
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly points out that hardcoding the 7-Zip path is fragile and provides a more robust PowerShell script to dynamically locate the executable, preventing future breaks.

Low
General
Fail CI on broken links

Remove continue-on-error: true from the Markdown link check step to ensure that
broken links cause the validation job to fail.

.github/workflows/build.yml [141-146]

 - name: Validate Markdown links
   uses: gaurav-nelson/github-action-markdown-link-check@v1
   with:
     use-quiet-mode: 'yes'
     config-file: '.github/markdown-link-check-config.json'
-  continue-on-error: true
+  continue-on-error: false
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that continue-on-error: true defeats the purpose of the validation step, and removing it makes the CI pipeline more effective at catching documentation errors.

Medium
Align Java version requirement

Correct the Java version requirement in the documentation to be consistently
Java 17, aligning with the CI configuration and other parts of the
documentation.

CHANGELOG.md [86]

 ### Compatibility
 
-- **Java**: Requires Java 17 or higher (previously Java 8+)
+- **Java**: Requires Java 17 or higher

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies an inconsistency in the documented Java version requirements across multiple files, and aligning them improves clarity and prevents user confusion.

Low
Avoid unnecessary chmod on Windows

Make the chmod +x gradlew step conditional to only run on non-Windows operating
systems, as it is unnecessary on the windows-latest runner.

.github/workflows/build.yml [34-36]

-- name: Make gradlew executable
+- name: Make gradlew executable (non-Windows only)
+  if: runner.os != 'Windows'
   run: chmod +x gradlew
   shell: bash
  • Apply / Chat
Suggestion importance[1-10]: 4

__

Why: The suggestion correctly identifies that chmod is unnecessary on the Windows runner and proposes a conditional execution, which improves workflow robustness and portability.

Low
  • More

Previous suggestions

✅ Suggestions up to commit 604c354
CategorySuggestion                                                                                                                                    Impact
Possible issue
Enable tag-triggered releases

Add a tags trigger to the on: push: event in the workflow to allow the release
job to run when a new tag is pushed.

.github/workflows/build.yml [3-8]

 on:
   push:
     branches: [ main, gradle-convert ]
+    tags:
+      - 'v*'
+      - '[0-9]+.[0-9]+.[0-9]+'
   pull_request:
     branches: [ main ]
   workflow_dispatch:
Suggestion importance[1-10]: 9

__

Why: The suggestion correctly identifies a critical flaw where the release job would never be triggered, rendering the automated release part of the workflow non-functional.

High
General
Support both 7z and zip artifacts

Update the Check build output step to look for both .7z and .zip artifacts to
align with the configurable bundle.format property.

.github/workflows/build.yml [49-62]

 - name: Check build output
   run: |
-    if (Test-Path "build-output/bearsampp-mariadb-*.7z") {
-      Write-Host "✓ Build artifact created successfully"
-      Get-ChildItem "build-output/bearsampp-mariadb-*.7z" | ForEach-Object {
-        $sizeMB = [math]::Round($_.Length / 1MB, 2)
-        Write-Host "  File: $($_.Name)"
+    $paths = @(
+      "build-output/bearsampp-mariadb-*.7z",
+      "build-output/bearsampp-mariadb-*.zip"
+    )
+    $files = @()
+    foreach ($p in $paths) {
+      $files += Get-ChildItem $p -ErrorAction SilentlyContinue
+    }
+    if ($files.Count -gt 0) {
+      Write-Host "✓ Build artifact(s) created successfully"
+      foreach ($f in $files) {
+        $sizeMB = [math]::Round($f.Length / 1MB, 2)
+        Write-Host "  File: $($f.Name)"
         Write-Host "  Size: $sizeMB MB"
       }
     } else {
-      Write-Host "✗ Build artifact not found"
+      Write-Host "✗ Build artifact not found (.7z or .zip)"
       exit 1
     }
   shell: pwsh
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly points out that the workflow's artifact check is hardcoded for .7z files, which would cause the build to fail if the configurable bundle.format property is set to zip.

Medium
Replace Kotlin DSL example with Groovy
Suggestion Impact:The commit updated the documentation to reflect Groovy DSL instead of Kotlin DSL, including changing references from Kotlin to Groovy and replacing the Kotlin code example with a Groovy example in the migration guide.

code diff:

-| Build Language           | XML                    | Kotlin DSL             |
+| Build Language           | XML                    | Groovy DSL             |
 | Dependency Management    | Manual                 | Automatic              |
 | Incremental Builds       | No                     | Yes                    |
 | Build Cache              | No                     | Yes                    |
 | Plugin Ecosystem         | Limited                | Extensive              |
 | IDE Integration          | Basic                  | Excellent              |
-| Learning Curve           | Moderate               | Moderate               |
 | Configuration Size       | Verbose                | Concise                |
 | Performance              | Good                   | Excellent              |
 
-### Key Improvements
-
-1. **Declarative Configuration**: Kotlin DSL is more readable than XML
-2. **Task Dependencies**: Automatic dependency resolution
-3. **Incremental Builds**: Only rebuild what changed
-4. **Better Logging**: Structured output with levels
-5. **Modern Tooling**: Better IDE support and debugging
-
-## Migration Summary
-
-### Files Removed
-
-| File                  | Purpose                    | Replacement                |
-|-----------------------|----------------------------|----------------------------|
-| `build.xml`           | Ant build script           | `build.gradle.kts`         |
-| `build-commons.xml`   | Common Ant tasks           | Built into Gradle          |
-| `build-properties.xml`| Property loading           | Native Gradle support      |
-
-### Files Added
+---
+
+## What Changed
+
+### Removed Files
+
+| File              | Status    | Replacement                |
+|-------------------|-----------|----------------------------|
+| `build.xml`       | ✗ Removed | `build.gradle`             |
+
+### Added Files
 
 | File                              | Purpose                              |
 |-----------------------------------|--------------------------------------|
-| `build.gradle.kts`                | Main Gradle build script             |
-| `settings.gradle.kts`             | Gradle project settings              |
-| `gradlew`                         | Gradle wrapper (Unix)                |
-| `gradlew.bat`                     | Gradle wrapper (Windows)             |
-| `gradle/wrapper/gradle-wrapper.properties` | Wrapper configuration   |
-| `gradle/wrapper/gradle-wrapper.jar`        | Wrapper JAR             |
+| `build.gradle`                    | Main Gradle build script (Groovy)   |
+| `settings.gradle`                 | Gradle project settings              |
 | `.gradle-docs/README.md`          | Main documentation                   |
 | `.gradle-docs/TASKS.md`           | Task reference                       |
 | `.gradle-docs/CONFIGURATION.md`   | Configuration guide                  |
 | `.gradle-docs/MIGRATION.md`       | This file                            |
 
-### Files Unchanged
+### Unchanged Files
 
 | File                  | Purpose                              |
 |-----------------------|--------------------------------------|
 | `build.properties`    | Build configuration                  |
-| `releases.properties` | Version mappings                     |
 | `bin/*/bearsampp.conf`| MariaDB configurations               |
 | `README.md`           | Project overview                     |
 | `LICENSE`             | License file                         |
 | `.editorconfig`       | Editor configuration                 |
 
-## Feature Comparison
-
-### Build Configuration
-
-**Ant** (`build.xml`):
+**Note**: `releases.properties` is no longer used by the Gradle build. Versions are sourced from modules-untouched repository.
+
+---
+
+## Command Mapping
+
+### Ant to Gradle Commands
+
+| Ant Command                          | Gradle Command                              |
+|--------------------------------------|---------------------------------------------|
+| `ant release`                        | `gradle release`                            |
+| `ant release -Dinput.bundle=12.0.2`  | `gradle release -PbundleVersion=12.0.2`     |
+| `ant clean`                          | `gradle clean`                              |
+
+### Task Mapping
+
+| Ant Target     | Gradle Task             | Description                          |
+|----------------|-------------------------|--------------------------------------|
+| `release`      | `release`               | Build and package release            |
+| `clean`        | `clean`                 | Clean build artifacts                |
+| N/A            | `releaseAll`            | Build all available versions         |
+| N/A            | `verify`                | Verify build environment             |
+| N/A            | `info`                  | Display build information            |
+| N/A            | `listVersions`          | List available versions              |
+| N/A            | `listReleases`          | List releases from modules-untouched |
+| N/A            | `validateProperties`    | Validate build.properties            |
+| N/A            | `checkModulesUntouched` | Check modules-untouched integration  |
+
+---
+
+## Key Differences
+
+### 1. Build Language
+
+**Ant** (XML):
 ```xml
 <project name="module-mariadb" default="build">
     <property file="build.properties"/>
@@ -103,311 +115,132 @@
         <delete dir="${build.path}/module-${bundle.name}"/>
     </target>
     
-    <target name="init" depends="clean">
-        <mkdir dir="${build.path}/module-${bundle.name}"/>
-        <copy todir="${build.path}/module-${bundle.name}/bin">
+    <target name="release" depends="clean">
+        <copy todir="${build.path}/module-${bundle.name}">
             <fileset dir="bin"/>
         </copy>
     </target>
-    
-    <target name="release" depends="init">
-        <replace dir="${build.path}/module-${bundle.name}"
-                 token="@RELEASE_VERSION@"
-                 value="${bundle.release}"/>
-    </target>
-    
-    <target name="bundle" depends="release">
-        <exec executable="7z">
-            <arg value="a"/>
-            <arg value="-t7z"/>
-            <arg value="${build.path}/bearsampp-${bundle.name}-${bundle.release}.7z"/>
-            <arg value="${build.path}/module-${bundle.name}"/>
-        </exec>
-    </target>
-    
-    <target name="build" depends="bundle"/>
 </project>

-Gradle (build.gradle.kts):
-```kotlin
-plugins {

  • id("com.github.node-gradle.node") version "7.1.0"
    +Gradle (Groovy DSL):
    +```groovy
    +def buildProps = new Properties()
    +file('build.properties').withInputStream { buildProps.load(it) }

+tasks.register('clean', Delete) {

  • delete(file("${buildPath}/module-${bundleName}"))
    }

-val props = file("build.properties").inputStream().use { stream ->


</details>


___

**Replace the entire <code>build.gradle.kts</code> Kotlin code example with a correct <br><code>build.gradle</code> Groovy example to align with the project's actual build file.**

[.gradle-docs/MIGRATION.md [132-189]](https://github.com/Bearsampp/module-mariadb/pull/20/files#diff-280bcf18206325b14175770a5302c4519284909693eb167785e4286e33ec02a1R132-R189)

```diff
-**Gradle** (`build.gradle.kts`):
-```kotlin
+**Gradle** (`build.gradle`):
+```groovy
 plugins {
-    id("com.github.node-gradle.node") version "7.1.0"
+  id 'com.github.node-gradle.node' version '7.1.0'
 }
-...
+
+def props = new Properties()
+file('build.properties').withInputStream { props.load(it) }
+
+def bundleName = props.getProperty('bundle.name')
+def bundleRelease = props.getProperty('bundle.release')
+def bundleFormat = props.getProperty('bundle.format')
+def buildPath = props.getProperty('build.path', System.getenv('BEARSAMPP_BUILD_PATH') ?: 'C:/Bearsampp-build')
+
+tasks.register('clean', Delete) {
+  delete file("${buildPath}/module-${bundleName}")
+}
+
+tasks.register('init') {
+  dependsOn 'clean'
+  doLast {
+    file("${buildPath}/module-${bundleName}").mkdirs()
+    copy {
+      from 'bin'
+      into "${buildPath}/module-${bundleName}/bin"
+    }
+  }
+}
+
+tasks.register('release') {
+  dependsOn 'init'
+  doLast {
+    fileTree("${buildPath}/module-${bundleName}/bin").matching { include '**/bearsampp.conf' }.each { confFile ->
+      def content = confFile.getText('UTF-8')
+      content = content.replace('@RELEASE_VERSION@', bundleRelease)
+      confFile.setText(content, 'UTF-8')
+    }
+  }
+}
+
+tasks.register('bundle', Exec) {
+  dependsOn 'release'
+  workingDir file(buildPath)
+  commandLine '7z', 'a', '-t7z', '-mx=9',
+    "${buildPath}/bearsampp-${bundleName}-${bundleRelease}.7z",
+    "module-${bundleName}"
+}
+
+tasks.register('build') {
+  dependsOn 'bundle'
+}






<details><summary>Suggestion importance[1-10]: 6</summary>

__

Why: The suggestion correctly points out that a large code example uses Kotlin syntax (`build.gradle.kts`) while the project uses Groovy. Replacing the entire misleading example significantly improves the documentation's accuracy and usefulness.


</details></details></td><td align=center>Low

</td></tr><tr><td>



<details><summary>✅ <s>Fix DSL type mismatch</s></summary>

___

<details><summary><b>Suggestion Impact:</b></summary>The commit updated the Feature Comparison table to list "Groovy DSL" instead of "Kotlin DSL" for Gradle, aligning with the suggestion.


code diff:

```diff
 | Feature                  | Ant                    | Gradle                 |
 |--------------------------|------------------------|------------------------|
-| Build Language           | XML                    | Kotlin DSL             |
+| Build Language           | XML                    | Groovy DSL             |
 | Dependency Management    | Manual                 | Automatic              |

In the "Feature Comparison" table, change the build language for Gradle from
Kotlin DSL to Groovy DSL to match the project's actual implementation.

.gradle-docs/MIGRATION.md [39]

-| Build Language           | XML                    | Kotlin DSL             |
+| Build Language           | XML                    | Groovy DSL             |
Suggestion importance[1-10]: 5

__

Why: This suggestion correctly identifies an inconsistency in the documentation where it mentions Kotlin DSL instead of Groovy DSL, which is what the project actually uses according to other parts of the documentation.

Low
Correct DSL claim in summary
Suggestion Impact:The conclusion line was updated to reflect "Groovy DSL" instead of "Kotlin DSL" as suggested.

code diff:

-- ✓ Pure Gradle build with Kotlin DSL
-- ✓ Comprehensive documentation (4,000+ lines)

In the conclusion section, correct the summary point to state the project uses
Groovy DSL instead of Kotlin DSL.

.gradle-docs/SUMMARY.md [419]

-- ✓ Pure Gradle build with Kotlin DSL
+- ✓ Pure Gradle build with Groovy DSL
Suggestion importance[1-10]: 5

__

Why: This suggestion correctly identifies a factual error in the conclusion section of the summary document, where it states the build uses Kotlin DSL instead of Groovy DSL. This fix improves the documentation's consistency and accuracy.

Low
✅ Suggestions up to commit f145405
CategorySuggestion                                                                                                                                    Impact
Security
Restrict uploaded logs scope

To improve security and reduce artifact size, modify the log upload step to
include only specific report files instead of the entire .gradle directory.

.github/workflows/build.yml [71-79]

 - name: Upload build logs
   if: always()
   uses: actions/upload-artifact@v4
   with:
     name: build-logs
     path: |
-      build/
-      .gradle/
+      build/reports/**
+      build/*.log
+      **/build/reports/**
     retention-days: 7
Suggestion importance[1-10]: 8

__

Why: This is a strong suggestion that improves security hygiene by preventing the leakage of cache data and credentials, while also optimizing CI performance by significantly reducing the size of uploaded artifacts.

Medium
General
Make artifact check format-agnostic

Update the build output check to be format-agnostic by searching for both .7z
and .zip files, preventing CI failures if the archive format is changed in the
configuration.

.github/workflows/build.yml [49-62]

 - name: Check build output
+  shell: pwsh
   run: |
-    if (Test-Path "build-output/bearsampp-mariadb-*.7z") {
-      Write-Host "✓ Build artifact created successfully"
-      Get-ChildItem "build-output/bearsampp-mariadb-*.7z" | ForEach-Object {
+    $patterns = @("build-output/bearsampp-mariadb-*.7z","build-output/bearsampp-mariadb-*.zip")
+    $files = $patterns | ForEach-Object { Get-ChildItem $_ -ErrorAction SilentlyContinue } | Where-Object { $_ }
+    if ($files -and $files.Count -gt 0) {
+      Write-Host "✓ Build artifact(s) created successfully"
+      $files | ForEach-Object {
         $sizeMB = [math]::Round($_.Length / 1MB, 2)
         Write-Host "  File: $($_.Name)"
         Write-Host "  Size: $sizeMB MB"
       }
     } else {
-      Write-Host "✗ Build artifact not found"
+      Write-Host "✗ Build artifact not found (.7z or .zip)"
       exit 1
     }
-  shell: pwsh
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly points out that the artifact check is brittle as it hardcodes the .7z extension, while the build system supports .zip. The proposed change makes the CI workflow more robust and resilient to configuration changes.

Medium
Fix DSL type inconsistency
Suggestion Impact:The commit updated the comparison table's "Build Language" entry from "Kotlin DSL" to "Groovy DSL," aligning the documentation with the Groovy-based build.

code diff:

 | Feature                  | Ant                    | Gradle                 |
 |--------------------------|------------------------|------------------------|
-| Build Language           | XML                    | Kotlin DSL             |
+| Build Language           | XML                    | Groovy DSL             |
 | Dependency Management    | Manual                 | Automatic              |

Update the build language in the comparison table from 'Kotlin DSL' to 'Groovy
DSL' to match the project's actual build script.

.gradle-docs/MIGRATION.md [39]

-| Build Language           | XML                    | Kotlin DSL             |
+| Build Language           | XML                    | Groovy DSL             |
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies a documentation inconsistency that could confuse users, and the proposed fix aligns the table with the project's stated use of Groovy DSL.

Low
Possible issue
Correct minimum version requirements

Update the prerequisite Java version from '8+' to '17+' and Gradle from '7+' to
'8+' to align with requirements mentioned elsewhere in the documentation.

.gradle-docs/README.md [41-42]

 | Tool   | Version | Required | Purpose                         |
 |--------|---------|----------|---------------------------------|
-| Java   | 8+      | Yes      | Gradle runtime                  |
-| Gradle | 7+      | Yes      | Build automation (local or via wrapper) |
+| Java   | 17+     | Yes      | Gradle runtime                  |
+| Gradle | 8+      | Yes      | Build automation (local or via wrapper) |
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies inconsistent Java version requirements across the documentation and proposes a fix to prevent user environment misconfiguration.

Low
Avoid unnecessary chmod on Windows

Remove the chmod +x gradlew step, as it is unnecessary for the windows-latest
runner and could cause intermittent failures.

.github/workflows/build.yml [34-36]

+# Removed on Windows; if you add Linux/macOS runners, gate the step like:
 - name: Make gradlew executable
+  if: runner.os != 'Windows'
   run: chmod +x gradlew
   shell: bash
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that chmod +x is unnecessary on the windows-latest runner and removing it improves the workflow's robustness by preventing potential platform-specific errors.

Low
✅ Suggestions up to commit 5eff742
CategorySuggestion                                                                                                                                    Impact
High-level
Consolidate the excessive and redundant documentation

The PR adds too much redundant documentation across many files, which is hard to
maintain and use. This should be consolidated into fewer, more focused documents
like a main README, a task reference, and a configuration guide.

Examples:

.gradle-docs/SUMMARY.md [1-457]
# Gradle Conversion Summary

This document summarizes the conversion of the MariaDB module from Apache Ant to Gradle.

## Overview

The MariaDB module has been successfully converted to use a pure Gradle build system with Kotlin DSL, following the patterns established in other Bearsampp modules (bruno, git, apache).

## Files Created


 ... (clipped 447 lines)
.gradle-docs/CONVERSION-SUMMARY.md [1-338]
# Gradle Conversion Summary

## Conversion Complete ✓

The MariaDB module has been successfully converted to use **Gradle with Groovy DSL** (no wrapper).

## What Was Done

### ✓ Build System
- Created `build.gradle` with **Groovy DSL** (~150 lines)

 ... (clipped 328 lines)

Solution Walkthrough:

Before:

// Project structure with excessive documentation
.gradle-docs/
├── 00-START-HERE.md
├── CONFIGURATION.md
├── CONVERSION-COMPLETE.md
├── CONVERSION-SUMMARY.md
├── INDEX.md
├── MIGRATION.md
├── QUICK-REFERENCE.md
├── README.md
├── SUMMARY.md
├── TASKS.md
├── USAGE.md
└── ... (and more doc files)
CONTRIBUTING.md
README.md

After:

// Suggested consolidated documentation structure
.gradle-docs/
├── CONFIGURATION.md  // Detailed configuration guide
├── README.md         // Main entry point, quick start, overview
└── TASKS.md          // Detailed task reference
CONTRIBUTING.md
README.md
Suggestion importance[1-10]: 9

__

Why: The suggestion correctly identifies a critical issue of excessive and redundant documentation across numerous files, which severely impacts maintainability and usability.

High
Possible issue
Remove misleading and contradictory documentation file
Suggestion Impact:The commit effectively deleted the content of .gradle-docs/CONVERSION-SUMMARY.md by replacing the 338-line file with an empty (or single placeholder) file, thereby removing the misleading documentation as suggested.

code diff:

@@ -1,338 +1 @@

Remove the .gradle-docs/CONVERSION-SUMMARY.md file as it incorrectly describes
the build system as using Groovy DSL without a wrapper, which contradicts the
actual implementation and other documentation.

.gradle-docs/CONVERSION-SUMMARY.md [1-21]

-# Gradle Conversion Summary
+(This file should be deleted)
 
-## Conversion Complete ✓
-
-The MariaDB module has been successfully converted to use **Gradle with Groovy DSL** (no wrapper).
-
-## What Was Done
-
-### ✓ Build System
-- Created `build.gradle` with **Groovy DSL** (~150 lines)
-- Created `settings.gradle`
-- **No Gradle wrapper** - requires Gradle to be installed
-- Removed `build.xml` (Ant build file)
-- Implemented all Ant tasks in Gradle
-- Added new validation and utility tasks
-
-### ✓ Key Differences from Initial Approach
-- **Groovy DSL** instead of Kotlin DSL
-- **No wrapper files** (gradlew, gradlew.bat, gradle/wrapper/)
-- **Direct Gradle installation required**
-- Commands use `gradle` instead of `./gradlew`
-...
-
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies that the entire .gradle-docs/CONVERSION-SUMMARY.md file is factually incorrect and contradicts the project's actual Gradle setup (Kotlin DSL with wrapper). Removing this misleading file is critical to prevent significant confusion for developers.

Medium
Fix incorrect build path priority

Correct the priority for determining buildPath to check the environment variable
first, then the properties file, and finally the default value.

.gradle-docs/MIGRATION.md [136-137]

-val buildPath: String = props.getProperty("build.path", 
-    System.getenv("BEARSAMPP_BUILD_PATH") ?: "C:/Bearsampp-build")
+val buildPath: String = System.getenv("BEARSAMPP_BUILD_PATH")
+    ?: props.getProperty("build.path", "C:/Bearsampp-build")
Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies that the example code for buildPath has an incorrect priority order which contradicts the documented priority, and it provides a valid fix.

Low
Correct the build script filename and language
Suggestion Impact:The README’s project structure section was modified, and the line referencing the Gradle build file no longer shows "build.gradle". The section with the incorrect "build.gradle" entry was removed/overhauled, addressing the mismatch highlighted by the suggestion.

code diff:

-## Project Structure
-
-```
-module-mariadb/
-├── .gradle-docs/          # Build documentation
-├── bin/                   # MariaDB binaries by version
-│   ├── mariadb10.11.14/
-│   ├── mariadb11.8.3/
-│   └── mariadb12.0.2/
-├── build.gradle           # Gradle build script (Groovy)
-├── build.properties       # Build configuration
-├── settings.gradle        # Gradle settings
-└── releases.properties    # Version mappings
-```

Correct the project structure diagram in README.md to reference build.gradle.kts
(Kotlin) instead of build.gradle (Groovy), aligning it with the project's actual
implementation.

README.md [63]

-├── build.gradle           # Gradle build script (Groovy)
+├── build.gradle.kts       # Gradle build script (Kotlin)
Suggestion importance[1-10]: 6

__

Why: This suggestion correctly identifies a factual error in the main README.md file. Correcting this is important for user clarity, as the README.md is a primary entry point for understanding the project, and the error contradicts the actual implementation shown in the CI workflow.

Low
Use configured archive format dynamically

Update the bundle task example to dynamically use the bundle.format property
from build.properties for the archive format instead of hardcoding it to .7z.

.gradle-docs/MIGRATION.md [168-174]

 val bundle by registering(Exec::class) {
     dependsOn(release)
-    commandLine("7z", "a", "-t7z", "-mx=9",
-        "${buildPath}/bearsampp-${bundleName}-${bundleRelease}.7z",
+    val outputFile = "${buildPath}/bearsampp-${bundleName}-${bundleRelease}.${bundleFormat}"
+    // The command can be adjusted based on bundleFormat
+    commandLine("7z", "a", "-t${bundleFormat}", "-mx=9",
+        outputFile,
         "module-${bundleName}")
     workingDir = file(buildPath)
 }
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly points out that the example code hardcodes the archive format, ignoring the bundle.format property, which makes the example inconsistent and misleading.

Low
General
Enable incremental builds for release

Refactor the release task example to use a Copy task with a filter instead of
modifying files in-place, enabling Gradle's incremental build feature for better
performance.

.gradle-docs/MIGRATION.md [155-166]

-val release by registering {
+val release by registering(Copy::class) {
     dependsOn(init)
-    doLast {
-        fileTree("${buildPath}/module-${bundleName}/bin").matching {
-            include("**/bearsampp.conf")
-        }.forEach { confFile ->
-            var content = confFile.readText()
-            content = content.replace("@RELEASE_VERSION@", bundleRelease)
-            confFile.writeText(content)
-        }
+    from("${buildPath}/module-${bundleName}/bin") {
+        include("**/bearsampp.conf")
+        filter { line -> line.replace("@RELEASE_VERSION@", bundleRelease) }
     }
+    into("${buildPath}/module-${bundleName}/bin")
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies an inefficiency in the example release task and proposes a better, more idiomatic Gradle approach using a Copy task to enable incremental builds.

Medium
Security
Avoid uploading the entire .gradle directory

Refine the Upload build logs step to upload specific report directories like
build/reports/ and .gradle/build-scan-data/ instead of the entire build/ and
.gradle/ directories to improve efficiency and security.

.github/workflows/build.yml [71-79]

 - name: Upload build logs
   if: always()
   uses: actions/upload-artifact@v4
   with:
     name: build-logs
     path: |
-      build/
-      .gradle/
+      build/reports/
+      .gradle/build-scan-data/
     retention-days: 7
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that uploading the entire .gradle directory is inefficient and a potential security risk. Proposing to upload specific, relevant log directories is a significant improvement for the CI pipeline's performance and security.

Medium

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Nov 15, 2025

PR Reviewer Guide 🔍

(Review updated until commit f92b483)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Inconsistent Java Version

Docs and CHANGELOG indicate Java 17+ and Gradle wrapper presence in places, while other docs state Java 8+ and that the wrapper is not shipped. The workflow uses Java 17. Ensure all documentation and CI consistently require the same Java version and wrapper usage.

- name: Setup Java
  uses: actions/setup-java@v4
  with:
    java-version: '17'
    distribution: 'temurin'
    cache: 'gradle'
Contradictory Statements

The changelog claims Kotlin DSL, Gradle wrapper added, and Java 17+ requirement, but docs in .gradle-docs use Groovy DSL, mention no wrapper, and Java 8+. Align language (Groovy vs Kotlin), wrapper usage, and Java requirements across files.

- Pure Gradle build system with Kotlin DSL
- Gradle wrapper for automatic Gradle installation
- Comprehensive documentation in `.gradle-docs/` directory
  - Main README with quick start guide
  - Detailed task reference (TASKS.md)
  - Configuration guide (CONFIGURATION.md)
  - Ant to Gradle migration guide (MIGRATION.md)
- New Gradle tasks:
  - `validate`: Validate configuration files
  - `listVersions`: List all available MariaDB versions
- Environment variable support for build path (`BEARSAMPP_BUILD_PATH`)
- Incremental build support
- Build caching for faster subsequent builds
- Better error messages and logging
- Type-safe configuration with Kotlin DSL

### Changed
- Migrated from Apache Ant to Gradle build system
- Updated README.md with Gradle build instructions
- Improved build output formatting
- Enhanced configuration file processing
- Optimized 7z compression settings

### Removed
- Apache Ant build files (build.xml, build-commons.xml, build-properties.xml)
Windows chmod Step

Running chmod +x gradlew on windows-latest is unnecessary if the repo deliberately does not include the Gradle wrapper; also Windows filesystem may ignore execute bit. Verify wrapper presence or remove the step to avoid confusion.

- name: Make gradlew executable
  run: chmod +x gradlew
  shell: bash

@jwaisner jwaisner merged commit 87c5a44 into main Nov 19, 2025
3 of 7 checks passed
@jwaisner jwaisner deleted the gradle-convert branch November 19, 2025 02:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants