Skip to content

Commit af16e14

Browse files
committed
Merge branch 'development' into pr/pieroguerrero-mendix/11004
2 parents e6c057d + 52e809a commit af16e14

95 files changed

Lines changed: 2263 additions & 210 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/hooks/audit-log.sh

100755100644
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ set -uo pipefail
1313
# ---------------------------------------------------------------------------
1414
INPUT="$(cat)"
1515

16-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name','unknown'))" 2>/dev/null || echo "unknown")"
16+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")"
1717

18-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || echo "")"
18+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || echo "")"
1919

2020
# ---------------------------------------------------------------------------
2121
# 2. Determine log file path (relative to project root)

.claude/hooks/validate-bash-command.sh

100755100644
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ set -euo pipefail
1414
# ---------------------------------------------------------------------------
1515
INPUT="$(cat)"
1616

17-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name',''))" 2>/dev/null || true)"
17+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null || true)"
1818

19-
# Only validate Bash commands — allow everything else through
20-
if [[ "$TOOL_NAME" != "Bash" ]]; then
19+
# Only validate Bash commands — allow everything else through.
20+
# If TOOL_NAME is empty (parse failure), fall through to check the command anyway (fail closed).
21+
if [[ -n "$TOOL_NAME" && "$TOOL_NAME" != "Bash" ]]; then
2122
exit 0
2223
fi
2324

24-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || true)"
25+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || true)"
2526

2627
if [[ -z "$COMMAND" ]]; then
2728
exit 0
@@ -136,20 +137,19 @@ BLOCKED_PATTERNS=(
136137
# ---------------------------------------------------------------------------
137138
check_command() {
138139
local cmd="$1"
139-
# Trim leading/trailing whitespace
140-
cmd="$(echo "$cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
140+
# Trim leading/trailing whitespace using parameter expansion
141+
cmd="${cmd#"${cmd%%[![:space:]]*}"}"
142+
cmd="${cmd%"${cmd##*[![:space:]]}"}"
141143

142144
if [[ -z "$cmd" ]]; then
143145
return 0
144146
fi
145147

146-
# Convert to lowercase for case-insensitive matching
147-
local cmd_lower
148-
cmd_lower="$(echo "$cmd" | tr '[:upper:]' '[:lower:]')"
148+
# Convert to lowercase using parameter expansion
149+
local cmd_lower="${cmd,,}"
149150

150151
for pattern in "${BLOCKED_PATTERNS[@]}"; do
151-
local pattern_lower
152-
pattern_lower="$(echo "$pattern" | tr '[:upper:]' '[:lower:]')"
152+
local pattern_lower="${pattern,,}"
153153

154154
# shellcheck disable=SC2254
155155
if [[ "$cmd_lower" == $pattern_lower ]]; then
@@ -164,8 +164,12 @@ check_command() {
164164
# ---------------------------------------------------------------------------
165165
# 4. Split on pipes and command chains, then check each sub-command
166166
# ---------------------------------------------------------------------------
167-
# Replace common chain operators with a delimiter
168-
NORMALIZED="$(echo "$COMMAND" | sed 's/&&/\n/g; s/||/\n/g; s/;/\n/g; s/|/\n/g')"
167+
# Replace common chain operators with newlines using parameter expansion
168+
# Order matters: replace && and || before | to avoid double-splitting ||
169+
NORMALIZED="${COMMAND//&&/$'\n'}"
170+
NORMALIZED="${NORMALIZED//||/$'\n'}"
171+
NORMALIZED="${NORMALIZED//;/$'\n'}"
172+
NORMALIZED="${NORMALIZED//|/$'\n'}"
169173

170174
while IFS= read -r subcmd; do
171175
check_command "$subcmd"

.github/workflows/branch-deletion-pr-creation.yml

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,18 @@ jobs:
3838
3939
- name: Process branches
4040
id: branch-data
41+
env:
42+
MIN_AGE_DAYS: ${{ github.event.inputs.min_age_days || '27' }}
4143
run: |
4244
set -e
4345
ALL_BRANCHES=$(git branch -r | grep -v "origin/HEAD" | sed 's/origin\///')
44-
MIN_AGE_DAYS=${{ github.event.inputs.min_age_days || 27 }}
46+
MIN_AGE_DAYS=${MIN_AGE_DAYS:-27}
47+
48+
echo "MIN_AGE_DAYS=${MIN_AGE_DAYS}"
49+
50+
PROTECTED_COUNT=0
51+
MERGED_COUNT=0
52+
UNMERGED_COUNT=0
4553
4654
PROTECTED_BRANCHES=()
4755
MERGED_BRANCHES_TO_PROCESS=()
@@ -54,38 +62,56 @@ jobs:
5462
5563
for BRANCH in $ALL_BRANCHES; do
5664
branch_lower=$(echo "$BRANCH" | tr '[:upper:]' '[:lower:]')
57-
if [[ $branch_lower =~ (backup|development|main|master|production) ]]; then
58-
PROTECTED_BRANCHES+=("$BRANCH (protected)")
65+
if [[ $branch_lower == *backup* || $branch_lower =~ ^(development|main|master|production)(-[0-9]+)?$ ]]; then
66+
PROTECTED_BRANCHES+=("$BRANCH")
67+
PROTECTED_COUNT=$((PROTECTED_COUNT+1))
5968
elif git branch -r --merged origin/development | grep -q "origin/$BRANCH"; then
6069
MERGED_BRANCHES_TO_PROCESS+=("$BRANCH")
70+
MERGED_COUNT=$((MERGED_COUNT+1))
6171
else
62-
UNMERGED_BRANCHES+=("$BRANCH (not merged)")
72+
UNMERGED_BRANCHES+=("$BRANCH")
73+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
6374
fi
6475
done
6576
77+
echo "branch totals: protected=${PROTECTED_COUNT} merged=${MERGED_COUNT} unmerged=${UNMERGED_COUNT}"
78+
6679
for BRANCH in "${MERGED_BRANCHES_TO_PROCESS[@]}"; do
6780
MERGE_HASH=$(git log --grep="Merge branch.*$BRANCH" origin/development -n 1 --pretty=format:"%H" || true)
68-
[ -z "$MERGE_HASH" ] && MERGE_HASH=$(git log -n 1 origin/$BRANCH --pretty=format:"%H")
69-
70-
MERGE_DATE=$(git show -s --format=%ct $MERGE_HASH)
71-
DAYS_AGO=$(( ($(date +%s) - MERGE_DATE) / 86400 ))
72-
81+
if [ -z "$MERGE_HASH" ]; then
82+
MERGE_HASH=$(git log -n 1 origin/$BRANCH --pretty=format:"%H" || true)
83+
fi
84+
85+
if [ -z "$MERGE_HASH" ]; then
86+
echo "WARN: no merge commit found for $BRANCH — skipping"
87+
UNMERGED_BRANCHES+=("$BRANCH (no-merge-hash)")
88+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
89+
continue
90+
fi
91+
92+
MERGE_DATE_EPOCH=$(git show -s --format=%ct $MERGE_HASH 2>/dev/null || true)
93+
if [ -z "$MERGE_DATE_EPOCH" ]; then
94+
echo "WARN: could not read commit date for $BRANCH (hash=$MERGE_HASH) — skipping"
95+
UNMERGED_BRANCHES+=("$BRANCH (no-merge-date)")
96+
UNMERGED_COUNT=$((UNMERGED_COUNT+1))
97+
continue
98+
fi
99+
100+
DAYS_AGO=$(( ($(date +%s) - MERGE_DATE_EPOCH) / 86400 ))
101+
73102
if [[ $DAYS_AGO -ge $MIN_AGE_DAYS ]]; then
74-
BRANCHES_TO_DELETE+=("$BRANCH")
103+
BRANCHES_TO_DELETE+=("$BRANCH (${DAYS_AGO}d since merge)")
75104
else
76-
BRANCHES_TOO_RECENT+=("$BRANCH (too recent: ${DAYS_AGO}d)")
105+
BRANCHES_TOO_RECENT+=("$BRANCH (${DAYS_AGO}d since merge)")
77106
fi
107+
echo "checked $BRANCH: hash=$MERGE_HASH date=$MERGE_DATE_EPOCH days=${DAYS_AGO}"
78108
done
79109
80-
ALL_NON_DELETED=(
81-
"${PROTECTED_BRANCHES[@]}"
82-
"${BRANCHES_TOO_RECENT[@]}"
83-
"${UNMERGED_BRANCHES[@]}"
84-
)
85-
86110
echo "HAS_BRANCHES=$([ ${#BRANCHES_TO_DELETE[@]} -gt 0 ] && echo true || echo false)" >> $GITHUB_ENV
87111
echo "BRANCHES_TO_DELETE=$(printf -- '- %s\n' "${BRANCHES_TO_DELETE[@]}" | jq -Rs .)" >> $GITHUB_ENV
88-
echo "ALL_NON_DELETED=$(printf -- '- %s\n' "${ALL_NON_DELETED[@]}" | jq -Rs .)" >> $GITHUB_ENV
112+
echo "PROTECTED_BRANCHES=$(printf -- '- %s\n' "${PROTECTED_BRANCHES[@]}" | jq -Rs .)" >> $GITHUB_ENV
113+
echo "BRANCHES_TOO_RECENT=$(printf -- '- %s\n' "${BRANCHES_TOO_RECENT[@]}" | jq -Rs .)" >> $GITHUB_ENV
114+
echo "UNMERGED_BRANCHES=$(printf -- '- %s\n' "${UNMERGED_BRANCHES[@]}" | jq -Rs .)" >> $GITHUB_ENV
89115
90116
- name: Create Deletion PR
91117
if: env.HAS_BRANCHES == 'true'
@@ -97,8 +123,14 @@ jobs:
97123
### Branches for Deletion
98124
${{ fromJSON(env.BRANCHES_TO_DELETE) }}
99125
100-
### Protected/Recent Branches
101-
${{ fromJSON(env.ALL_NON_DELETED) }}
126+
### Protected Branches
127+
${{ fromJSON(env.PROTECTED_BRANCHES) }}
128+
129+
### Recent Merges (too recent to delete)
130+
${{ fromJSON(env.BRANCHES_TOO_RECENT) }}
131+
132+
### Unmerged Branches
133+
${{ fromJSON(env.UNMERGED_BRANCHES) }}
102134
base: development
103135
labels: Internal WIP
104136
assignees: MarkvanMents,OlufunkeMoronfolu

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ hugo.exe
88
/.hugo_build.lock
99
/.claude/audit.log
1010
/.claude/settings.local.json
11+
/.mcp.json
1112

1213
# For Mac users
1314
.DS_Store

content/en/docs/catalog/consume/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ Common tasks for users who want to consume services from the Catalog include the
1616
* Using the [Integration pane](/refguide/integration-pane/)
1717
* Understanding how sources are related in the [Landscape](/data-hub/data-hub-landscape/)
1818

19-
For an overview on consuming services, see [Consume Registered Assets](/catalog/consume/consume-registered-assets/).
19+
For an overview on consuming services, see [Consume Registered Assets](/catalog/consume/consume-registered-assets/).

content/en/docs/community-tools/contribute-to-mendix-docs/markdown-shortcodes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ If the tab pane contains code with an asterisk (`*`) in it, the linter rule for
189189
190190
Mendix videos are hosted on Vidyard. For more information, see [the Videos section of the Style Guide](https://mendix.atlassian.net/wiki/spaces/RNDHB/pages/2510061889/Images+Icons+and+Videos#Videos).
191191
192-
{{< vidyard "GwE17mzGma5NAvDnXrVdFA" >}}
192+
{{< vidyard id="GwE17mzGma5NAvDnXrVdFA" date_updated="YYYY-MM-DD" >}}
193193
194194
## Other Markdown and HTML Guidelines
195195

content/en/docs/community-tools/how-to-set-up-your-partner-profile.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ If you already had projects in the old partner profile, they can be automaticall
7575

7676
{{% alert color="info" %}}Ensure you have customer approval for publishing project references.{{% /alert %}}
7777

78-
For technical support or questions, contact partnerfinder@mendix.com.
79-
8078
## Read More
8179

8280
* [Mendix Profile](/portal/mendix-profile/)

content/en/docs/deployment/on-premises-design/ms-windows/_index.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Before starting this how-to, make sure you have the following prerequisites:
4545

4646
* Suitable database servers are MariaDB, MS SQL Server, MySQL, Oracle Database and PostgreSQL. See [System Requirements](/refguide/system-requirements/#databases) for more information
4747

48-
* A local or domain user with the *“log on as a service”* local security policy set
48+
* A local user, domain user or group managed service account (gMSA) with the *“log on as a service”* local security policy set
4949

5050
## Installing the Mendix Service Console {#service-console}
5151

@@ -88,32 +88,36 @@ To deploy a Mendix app using the Mendix Service Console, follow these steps:
8888
* **Display name** – the description of the app which is visible as a tooltip for the app in the left bar of the Mendix Service Console or as a column in the list of Windows services
8989
* **Description** – a description of the application that will be visible in the Mendix Service Console
9090
* **Startup type** – select whether you want the app to be started automatically when the server starts, started with a delay, started manually, or disabled altogether
91-
* **User name** and **Password** – the app will always run under the user account given here, and the service will be installed with this user account configured (for more information, see [Prerequisites](#Prerequisites))
91+
* **User name** and **Password** – the app will run under the user account given here, and the service will be installed with this user account configured (for more information, see [Prerequisites](#Prerequisites))
92+
* **Install service with LocalSystem account** – optionally, select the checkbox if you want to use a gMSA account for a Mendix app instead of the user account given under **User name** and **Password**.
93+
94+
4. Click **Next >**.
9295

93-
4. Click **Next >**.
96+
5. Optionally, if you selected the **Install service with LocalSystem account** checkbox while creating the app, install the service once your app is created. The service will be installed with the LocalSystem account. (You can verify the service account type in the Services app of Windows.) Execute the following command in the administrator command prompt to change the account type to your gMSA: `sc.exe config MyServiceName obj= "YOURDOMAIN\MyGMSAAccount$"`.
97+
Configure folder access permissions for gMSA account on the directory selected in the **Preferences** setting. For more information, refer to the [Installing the Mendix Service Console](/developerportal/deploy/deploy-mendix-on-microsoft-windows/#service-console) section above.
9498

95-
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/18580728.png" >}}
99+
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/gmsa.png" >}}
96100

97-
5. On the **Project Files** screen, click **Select app…**.
101+
6. On the **Project Files** screen, click **Select app…**.
98102

99103
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/service_console_selectapp.png" >}}
100104

101-
6. Now select the **MDA** file that was [created in Mendix Studio Pro](/refguide/create-deployment-package-dialog/) and contains your application logic. After the installation of your MDA file, you will see which Mendix server (Mendix Runtime) version is needed.
105+
7. Now select the **MDA** file that was [created in Mendix Studio Pro](/refguide/create-deployment-package-dialog/) and contains your application logic. After the installation of your MDA file, you will see which Mendix server (Mendix Runtime) version is needed.
102106

103-
7. Configure the **Database Settings**:
107+
8. Configure the **Database Settings**:
104108

105109
* **Type** – the database server type
106110
* **Host** – the IP address or host name of the database server
107111
* **Name** – the database name
108112
* **User name** and **Password** – the database user name and password
109113

110-
8. Click **Next >**.
114+
9. Click **Next >**.
111115

112116
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/18580726.png" >}}
113117

114-
9. On the **Common Configuration** screen, keep the default settings. These settings should only be changed if this is needed for your application setup.
118+
10. On the **Common Configuration** screen, keep the default settings. These settings should only be changed if this is needed for your application setup.
115119

116-
10. Click **Finish** and start the application.
120+
11. Click **Finish** and start the application.
117121

118122
## Configuring the Microsoft Internet Information Services Server{#configure-msiis}
119123

content/en/docs/deployment/on-premises-design/ms-windows/automate-mendix-deployment-on-microsoft-windows.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,48 @@ $appName = 'Name of Mendix app'
180180
Install-MxService $appName
181181
```
182182

183+
### Sample Script - Set App Runtime Settings
184+
185+
The following script example demonstrates how to set runtime settings for your app. It applies custom runtime configuration settings to your application using a hashtable of key-value pairs.
186+
187+
```text
188+
$appName = 'Name of Mendix app'
189+
$settings = @{
190+
'MaxJavaHeapSize' = '2048'
191+
'DatabaseHost' = 'localhost'
192+
}
193+
194+
# Set runtime settings
195+
Set-MxAppRuntimeSettings $appName -Settings $settings
196+
```
197+
198+
### Sample Script - Set App Constant
199+
200+
The following script example demonstrates how to set an application constant for your app. It updates a specific constant value in your Mendix app configuration.
201+
202+
```text
203+
$appName = '{Name of your app}'
204+
$constants = @{
205+
'constantName' = 'constantValue'
206+
'constantName2' = 'constantValue2'
207+
}
208+
209+
# Set application constant
210+
Set-MxAppConstants $appName -Constants $constants
211+
```
212+
213+
### Sample Script - Get Server Id
214+
215+
The `Start-MxApp` cmdlet automatically retrieves the Server ID (License ID) when starting a Mendix app. You can use this unique identifier for license tracking and application monitoring. The following script example demonstrates the process required to retrieve Server Id.
216+
217+
```text
218+
# Start the Mendix app and get Server ID
219+
$app = Start-MxApp "MyAppName" -NoService -SynchronizeDatabase
220+
221+
# Display the Server ID
222+
Write-Host "Server ID: $($app.ServerId)"
223+
```
224+
183225
## Troubleshooting
184226

185227
If you encounter any issues while automating Mendix deployment on Windows using cmdlets, use the following troubleshooting tips to help you solve them.

content/en/docs/deployment/on-premises-design/ms-windows/sql-server/restoring-a-sql-server-database.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ This how-to teaches you how to do the following:
1515

1616
For a deep-dive look into this action, check out this video:
1717

18-
{{< vidyard "WZu7QtHZPjtYUTdcV58PKr?" >}}
18+
{{< vidyard id="WZu7QtHZPjtYUTdcV58PKr?" >}}
1919

2020
## Prerequisites
2121

0 commit comments

Comments
 (0)