Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
301 commits
Select commit Hold shift + click to select a range
46f3474
Add files via upload
olahallengren Jun 7, 2026
a558446
Add files via upload
olahallengren Jun 7, 2026
a4d4cdf
Merge pull request #1037 from olahallengren/minor_fixes
olahallengren Jun 7, 2026
c5eeddb
Add files via upload
olahallengren Jun 7, 2026
2a4671d
Merge pull request #1038 from olahallengren/minor_fixes
olahallengren Jun 7, 2026
bf219f9
Add files via upload
olahallengren Jun 7, 2026
4031193
Merge pull request #1039 from olahallengren/minor_fixes
olahallengren Jun 7, 2026
359fbbe
Add files via upload
olahallengren Jun 7, 2026
05d3d75
Merge pull request #1040 from olahallengren/minor_fixes
olahallengren Jun 7, 2026
2d30552
Add files via upload
olahallengren Jun 8, 2026
301230d
Add files via upload
olahallengren Jun 8, 2026
7677f26
Add files via upload
olahallengren Jun 8, 2026
d6b06c1
Merge pull request #1041 from olahallengren/minor_fixes
olahallengren Jun 8, 2026
69ff35c
Add files via upload
olahallengren Jun 9, 2026
af82eef
Merge pull request #1043 from olahallengren/minor_fixes
olahallengren Jun 9, 2026
307d183
Add files via upload
olahallengren Jun 13, 2026
9490651
Add files via upload
olahallengren Jun 15, 2026
689e88f
Add files via upload
olahallengren Jun 15, 2026
0bd7bfb
Merge pull request #1046 from olahallengren/minor_fixes
olahallengren Jun 15, 2026
7bf729f
Add files via upload
olahallengren Jun 16, 2026
c0c0715
Merge pull request #1047 from olahallengren/minor_fixes
olahallengren Jun 16, 2026
bec8ad9
Add files via upload
olahallengren Jun 16, 2026
6f9ee18
Merge pull request #1048 from olahallengren/minor_fixes
olahallengren Jun 16, 2026
7835358
Add files via upload
olahallengren Jun 20, 2026
b954fda
Merge pull request #1050 from olahallengren/minor_fixes
olahallengren Jun 20, 2026
824bd62
Add files via upload
olahallengren Jun 21, 2026
c125fbb
Merge pull request #1051 from olahallengren/minor_fixes
olahallengren Jun 21, 2026
b9d87ee
Add files via upload
olahallengren Jun 21, 2026
c4295f5
Add files via upload
olahallengren Jun 21, 2026
7e3d389
Merge pull request #1052 from olahallengren/minor_fixes
olahallengren Jun 21, 2026
627ac45
Add files via upload
olahallengren Jun 25, 2026
b7b2fa9
Merge pull request #1056 from olahallengren/minor_issues
olahallengren Jun 25, 2026
547996a
Add files via upload
olahallengren Jun 28, 2026
598332d
Merge pull request #1058 from olahallengren/performance_optimizations
olahallengren Jun 28, 2026
a91ec4c
Add files via upload
olahallengren Jun 29, 2026
6e8603a
Merge pull request #1059 from olahallengren/minor_fixes
olahallengren Jun 29, 2026
9624755
Add files via upload
olahallengren Jul 3, 2026
dcc8fd2
Add files via upload
olahallengren Jul 3, 2026
bdc097b
Merge pull request #1063 from olahallengren/minor_fixes
olahallengren Jul 3, 2026
84e8108
Add files via upload
olahallengren Jul 3, 2026
1b15b27
Add files via upload
olahallengren Jul 3, 2026
22e601f
Merge pull request #1064 from olahallengren/minor_fixes
olahallengren Jul 3, 2026
5909f73
Add files via upload
olahallengren Jul 4, 2026
cd9d58e
Merge pull request #1065 from olahallengren/minor_fixes
olahallengren Jul 4, 2026
14c3296
Add files via upload
olahallengren Jul 4, 2026
d5ebfde
Merge pull request #1066 from olahallengren/minor_fixes
olahallengren Jul 4, 2026
31a759d
Add files via upload
olahallengren Jul 4, 2026
76c8ef1
Add files via upload
olahallengren Jul 4, 2026
716d807
Merge pull request #1067 from olahallengren/minor_fixes
olahallengren Jul 4, 2026
cff3163
Add files via upload
olahallengren Jul 4, 2026
fc1fcb6
Merge pull request #1068 from olahallengren/minor_fixes
olahallengren Jul 4, 2026
c1c6ebc
Add files via upload
olahallengren Jul 7, 2026
aa9d175
Merge pull request #1070 from olahallengren/performance_improvements
olahallengren Jul 7, 2026
5b15368
Add files via upload
olahallengren Jul 11, 2026
7c4736b
Merge pull request #1073 from olahallengren/minor_fixes
olahallengren Jul 11, 2026
9140546
Add files via upload
olahallengren Jul 12, 2026
b1a889b
Merge pull request #1074 from olahallengren/seeding
olahallengren Jul 12, 2026
8a91fae
Add files via upload
olahallengren Jul 14, 2026
a5d87e5
Merge pull request #1075 from olahallengren/performance_optimizations
olahallengren Jul 14, 2026
c7540ae
Add files via upload
olahallengren Jul 15, 2026
b3ee88c
Merge pull request #1076 from olahallengren/minor_fixes
olahallengren Jul 15, 2026
9d48c67
Add files via upload
olahallengren Jul 15, 2026
18049fe
Merge pull request #1077 from olahallengren/incremental_statistics
olahallengren Jul 15, 2026
29c88fd
Add files via upload
olahallengren Jul 16, 2026
448812e
Merge pull request #1078 from olahallengren/performance_optimizations
olahallengren Jul 16, 2026
b18ce95
Add files via upload
olahallengren Jul 17, 2026
5a4ad22
Merge pull request #1079 from olahallengren/minor_fixes
olahallengren Jul 17, 2026
fc70518
Add files via upload
olahallengren Jul 18, 2026
9699b96
Merge pull request #1080 from olahallengren/minor_fixes
olahallengren Jul 18, 2026
d00bea8
Add files via upload
olahallengren Jul 18, 2026
b08061e
Merge pull request #1081 from olahallengren/minor_readme_edits
olahallengren Jul 18, 2026
5b58bf1
Create create-tag.yml
olahallengren Jul 18, 2026
bca2232
Merge pull request #1082 from olahallengren/olahallengren-patch-1
olahallengren Jul 18, 2026
543c2ae
Rename workflows/create-tag.yml to .github/workflows/create-tag.yml
olahallengren Jul 18, 2026
9aff0d3
Merge pull request #1083 from olahallengren/olahallengren-patch-1
olahallengren Jul 18, 2026
47dd31e
Add files via upload
olahallengren Jul 19, 2026
a97920b
Merge pull request #1084 from olahallengren/minor_fixes
olahallengren Jul 19, 2026
dc0b1a6
Add files via upload
olahallengren Jul 19, 2026
b567bcf
Merge pull request #1085 from olahallengren/deploy-website
olahallengren Jul 19, 2026
c55788f
Add files via upload
olahallengren Jul 19, 2026
64f0fba
Merge pull request #1086 from olahallengren/minor_fixes
olahallengren Jul 19, 2026
f031bca
Update create-tag.yml
olahallengren Jul 19, 2026
6a04040
Update deploy-website.yml
olahallengren Jul 19, 2026
ccca0aa
Update create-tag.yml
olahallengren Jul 19, 2026
25b15b4
Update deploy-website.yml
olahallengren Jul 19, 2026
57aeda0
Update create-tag.yml
olahallengren Jul 19, 2026
bab78d9
Update deploy-website.yml
olahallengren Jul 19, 2026
c1e0597
Update deploy-website.yml
olahallengren Jul 19, 2026
c32cdeb
Update deploy-website.yml
olahallengren Jul 19, 2026
02ac3e2
Update deploy-website.yml
olahallengren Jul 19, 2026
d558035
Update deploy-website.yml
olahallengren Jul 19, 2026
e179805
Update deploy-website.yml
olahallengren Jul 19, 2026
f58db4b
Merge pull request #1087 from olahallengren/minor_fixes
olahallengren Jul 19, 2026
fbf7756
Add files via upload
olahallengren Jul 19, 2026
7265699
Merge pull request #1088 from olahallengren/minor_fixes
olahallengren Jul 19, 2026
0b29c0d
Update .gitattributes
olahallengren Jul 19, 2026
8fcef74
Merge pull request #1089 from olahallengren/minor_updates
olahallengren Jul 19, 2026
10e93e3
Update deploy-website.yml
olahallengren Jul 19, 2026
9174751
Merge pull request #1090 from olahallengren/minor_updates
olahallengren Jul 19, 2026
beb4d6f
Update deploy-website.yml
olahallengren Jul 19, 2026
e6f71e4
Merge pull request #1091 from olahallengren/minor_updates
olahallengren Jul 19, 2026
856e567
Create sql-server-backup.md
olahallengren Jul 19, 2026
c553566
Add files via upload
olahallengren Jul 19, 2026
49b041c
Merge pull request #1092 from olahallengren/documentation
olahallengren Jul 19, 2026
578f1db
Update README.md
olahallengren Jul 19, 2026
90b9438
Merge pull request #1094 from olahallengren/update_documentation
olahallengren Jul 19, 2026
c8a0ad9
Update README.md
olahallengren Jul 19, 2026
59f8107
Merge pull request #1095 from olahallengren/readme
olahallengren Jul 19, 2026
9a13acd
Add files via upload
olahallengren Jul 19, 2026
12b162c
Merge pull request #1096 from olahallengren/documentation
olahallengren Jul 19, 2026
99bee64
Add files via upload
olahallengren Jul 19, 2026
032c7d0
Merge pull request #1097 from olahallengren/readme
olahallengren Jul 19, 2026
b435048
Update deploy-website.yml
olahallengren Jul 19, 2026
cb113d6
Merge pull request #1098 from olahallengren/workflows
olahallengren Jul 19, 2026
3843b77
Add files via upload
olahallengren Jul 19, 2026
a6ebced
Merge pull request #1099 from olahallengren/documentation
olahallengren Jul 19, 2026
f307ae1
Add files via upload
olahallengren Jul 20, 2026
cc4902c
Merge pull request #1100 from olahallengren/documentation
olahallengren Jul 20, 2026
37c4d0e
Add files via upload
olahallengren Jul 20, 2026
19d23b1
Merge pull request #1101 from olahallengren/workflows
olahallengren Jul 20, 2026
92dd444
Add files via upload
olahallengren Jul 20, 2026
8ca90ad
Merge pull request #1102 from olahallengren/minor_fixes
olahallengren Jul 20, 2026
cdedd32
Add files via upload
olahallengren Jul 20, 2026
ccf3599
Update create-tag.yml
olahallengren Jul 20, 2026
da4d279
Merge pull request #1103 from olahallengren/workflows
olahallengren Jul 20, 2026
8374563
Add files via upload
olahallengren Jul 20, 2026
df06213
Merge pull request #1104 from olahallengren/minor_fixes
olahallengren Jul 20, 2026
6460688
Update create-tag.yml
olahallengren Jul 20, 2026
384bd60
Merge pull request #1105 from olahallengren/workflows
olahallengren Jul 20, 2026
5be56bd
Add files via upload
olahallengren Jul 20, 2026
9fc52a4
Merge pull request #1106 from olahallengren/olahallengren-patch-1
olahallengren Jul 20, 2026
82c5ca3
Update deploy-website.yml
olahallengren Jul 20, 2026
70f7032
Merge pull request #1107 from olahallengren/workflows
olahallengren Jul 20, 2026
53b7d97
Add files via upload
olahallengren Jul 21, 2026
fd25ddc
Update deploy-website.yml
olahallengren Jul 21, 2026
541394a
Merge pull request #1109 from olahallengren/workflows
olahallengren Jul 21, 2026
eb74b49
Merge pull request #1108 from olahallengren/minor_updates
olahallengren Jul 21, 2026
d26d27c
Add files via upload
olahallengren Jul 21, 2026
3887771
Merge pull request #1111 from olahallengren/minor_updates
olahallengren Jul 21, 2026
f2452cd
Add files via upload
olahallengren Jul 21, 2026
8499641
Merge pull request #1113 from olahallengren/documentation
olahallengren Jul 21, 2026
ca1468f
Add files via upload
olahallengren Jul 21, 2026
ed8e47a
Merge pull request #1114 from olahallengren/documentation
olahallengren Jul 21, 2026
a4d6eda
Add check-checksums.yml
olahallengren Jul 21, 2026
34fd025
Merge pull request #1115 from olahallengren/workflows
olahallengren Jul 21, 2026
56ac0f2
Add files via upload
olahallengren Jul 21, 2026
2c4fdf9
Add files via upload
olahallengren Jul 21, 2026
3c69db2
Add files via upload
olahallengren Jul 21, 2026
7e469e6
Add files via upload
olahallengren Jul 22, 2026
745bdfd
Merge pull request #1117 from olahallengren/contained_availability_gr…
olahallengren Jul 22, 2026
24c0a7f
Add files via upload
olahallengren Jul 22, 2026
e3b68ca
Merge pull request #1118 from olahallengren/minor_fixes
olahallengren Jul 22, 2026
cde3104
Add files via upload
olahallengren Jul 22, 2026
1590e46
Update deploy-website.yml
olahallengren Jul 22, 2026
526a1d3
Delete deploy-website.yml
olahallengren Jul 22, 2026
75213b1
Update deploy-website.yml
olahallengren Jul 22, 2026
2d1ea8a
Merge pull request #1119 from olahallengren/workflows
olahallengren Jul 22, 2026
3004f40
Remove orphan code in job creation
olahallengren Jul 22, 2026
29cfb84
Merge pull request #1120 from olahallengren/minor_fixes
olahallengren Jul 22, 2026
90d5968
Add files via upload
olahallengren Jul 22, 2026
3a4d48b
Merge pull request #1121 from olahallengren/minor_updates
olahallengren Jul 22, 2026
0fe22a8
Add files via upload
olahallengren Jul 22, 2026
abcc77a
Merge pull request #1122 from olahallengren/minor_fixes
olahallengren Jul 22, 2026
91cb88f
Add files via upload
olahallengren Jul 22, 2026
0370dbc
Merge pull request #1123 from olahallengren/minor_fixes
olahallengren Jul 22, 2026
1306169
Add files via upload
olahallengren Jul 22, 2026
76b9fe7
Merge pull request #1124 from olahallengren/minor_fixes
olahallengren Jul 22, 2026
ffc7cf9
Add files via upload
olahallengren Jul 23, 2026
ae563e4
Merge pull request #1125 from olahallengren/minor_updates
olahallengren Jul 23, 2026
ab78b69
Add files via upload
olahallengren Jul 23, 2026
9def99c
Merge pull request #1126 from olahallengren/minor_updates
olahallengren Jul 23, 2026
6196036
Add files via upload
olahallengren Jul 23, 2026
660acca
Merge pull request #1127 from olahallengren/minor_fixes
olahallengren Jul 23, 2026
353aac7
Add files via upload
olahallengren Aug 3, 2026
4755087
Merge pull request #1130 from olahallengren/minor_fixes
olahallengren Aug 3, 2026
afa1774
Add files via upload
olahallengren Aug 4, 2026
36d73f6
Merge pull request #1131 from olahallengren/minor_updates
olahallengren Aug 4, 2026
0f22da0
Create Header.sql
olahallengren Aug 4, 2026
d14a503
Add files via upload
olahallengren Aug 4, 2026
5f6824e
Merge pull request #1132 from olahallengren/header-and-footer
olahallengren Aug 4, 2026
a9b0037
Add files via upload
olahallengren Aug 4, 2026
18da91f
Merge pull request #1133 from olahallengren/workflows
olahallengren Aug 4, 2026
c953de1
Delete header-and-footer/Header.sql
olahallengren Aug 4, 2026
f278a84
Delete .github/workflows/check-checksums.yml
olahallengren Aug 4, 2026
a2d5e61
Merge pull request #1134 from olahallengren/olahallengren-patch-2
olahallengren Aug 4, 2026
ad72c47
Delete header-and-footer/Footer.sql
olahallengren Aug 4, 2026
99f7c61
Delete header-and-footer/HeaderAzureSQLDatabase.sql
olahallengren Aug 4, 2026
8f062f0
Merge pull request #1135 from olahallengren/olahallengren-patch-1
olahallengren Aug 4, 2026
d0731b6
Add files via upload
olahallengren Aug 4, 2026
506f46e
Merge pull request #1136 from olahallengren/workflows
olahallengren Aug 4, 2026
7e98634
Update .gitattributes
olahallengren Aug 4, 2026
fae0231
Merge pull request #1137 from olahallengren/gitattributes
olahallengren Aug 4, 2026
68a46d3
Update .gitattributes
olahallengren Aug 4, 2026
32b8bf6
Merge pull request #1138 from olahallengren/gitattributes
olahallengren Aug 4, 2026
a1af9c4
Add files via upload
olahallengren Aug 4, 2026
75d3d7d
Merge pull request #1139 from olahallengren/olahallengren-patch-1
olahallengren Aug 4, 2026
736463b
Add files via upload
olahallengren Aug 4, 2026
7d0e60c
Merge pull request #1140 from olahallengren/minor_fixes
olahallengren Aug 5, 2026
a82d2a7
Add files via upload
olahallengren Aug 5, 2026
415b5c9
Merge pull request #1141 from olahallengren/workflows
olahallengren Aug 5, 2026
90b889f
Add files via upload
olahallengren Aug 5, 2026
4393a11
Merge pull request #1142 from olahallengren/minor_fixes
olahallengren Aug 5, 2026
36f2fa4
Add files via upload
olahallengren Aug 5, 2026
a621d79
Merge pull request #1143 from olahallengren/minor_updates
olahallengren Aug 5, 2026
2e07971
Add files via upload
olahallengren Aug 7, 2026
5a853ad
Merge pull request #1144 from olahallengren/performance_optimizations
olahallengren Aug 7, 2026
b85b842
Add files via upload
olahallengren Aug 7, 2026
ff1a27c
Merge pull request #1145 from olahallengren/minor_fixes
olahallengren Aug 7, 2026
2973473
Add files via upload
olahallengren Aug 8, 2026
2c804fe
Merge pull request #1146 from olahallengren/minor_fixes
olahallengren Aug 8, 2026
eda7da4
Add files via upload
olahallengren Aug 8, 2026
9c1d363
Add files via upload
olahallengren Aug 8, 2026
d9daf72
Merge pull request #1147 from olahallengren/error_messages
olahallengren Aug 8, 2026
130785d
Add files via upload
olahallengren Aug 8, 2026
766c849
Merge pull request #1148 from olahallengren/minor_fixes
olahallengren Aug 8, 2026
b0e1b4f
Add files via upload
olahallengren Aug 8, 2026
86c4461
Merge pull request #1149 from olahallengren/minor_fixes
olahallengren Aug 8, 2026
90ff817
Add files via upload
olahallengren Aug 9, 2026
5302150
Add files via upload
olahallengren Aug 9, 2026
f698f4b
Merge pull request #1150 from olahallengren/minor_fixes
olahallengren Aug 9, 2026
ab3e6ee
Add files via upload
olahallengren Aug 9, 2026
fd447a5
Merge pull request #1151 from olahallengren/minor_fixes
olahallengren Aug 9, 2026
d56da69
Add files via upload
olahallengren Aug 10, 2026
b9db331
Merge pull request #1153 from olahallengren/minor_fixes
olahallengren Aug 10, 2026
d4e0ed9
Add files via upload
olahallengren Aug 12, 2026
be2b1ff
Add files via upload
olahallengren Aug 12, 2026
3e7dea8
Add files via upload
olahallengren Aug 12, 2026
58f5d39
Add files via upload
olahallengren Aug 12, 2026
c950934
Merge pull request #1156 from olahallengren/minor_fixes
olahallengren Aug 12, 2026
9d1c2c8
Add files via upload
olahallengren Aug 16, 2026
a0c0bf9
Merge pull request #1157 from olahallengren/minor_fixes
olahallengren Aug 16, 2026
40c8bd6
Add files via upload
olahallengren Aug 16, 2026
3ac0ac8
Merge pull request #1158 from olahallengren/minor_fixes
olahallengren Aug 16, 2026
8da092f
Add files via upload
olahallengren Aug 17, 2026
be63a5e
Merge pull request #1159 from olahallengren/minor_updates
olahallengren Aug 17, 2026
0099d2a
Update sql-server-backup.md
olahallengren Aug 23, 2026
1d5698c
Merge pull request #1162 from olahallengren/minor_updates
olahallengren Aug 23, 2026
a4dacdc
Add files via upload
olahallengren Aug 23, 2026
09ef7f0
Merge pull request #1163 from olahallengren/documentation_updates
olahallengren Aug 23, 2026
12dd1fa
Add files via upload
olahallengren Aug 23, 2026
45f23c4
Merge pull request #1164 from olahallengren/documentation_updates
olahallengren Aug 23, 2026
423a5b1
Add files via upload
olahallengren Aug 23, 2026
abaafb9
Merge pull request #1165 from olahallengren/minor_updates
olahallengren Aug 23, 2026
b458251
Add files via upload
olahallengren Aug 23, 2026
98d1d43
Merge pull request #1166 from olahallengren/minor_fixes
olahallengren Aug 23, 2026
7938895
Add files via upload
olahallengren Aug 23, 2026
df16999
Merge pull request #1167 from olahallengren/minor_updates
olahallengren Aug 23, 2026
c83055a
Add files via upload
olahallengren Aug 23, 2026
f525253
Merge pull request #1168 from olahallengren/minor_updates
olahallengren Aug 23, 2026
d575cc3
Merge branch 'main' into feature/min-index-usage-days
forward-thinkers-lab Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
*.sql linguist-language=TSQL
*.sql linguist-language=TSQL -text
.github export-ignore
.gitattributes export-ignore
174 changes: 174 additions & 0 deletions .github/workflows/check-scripts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
name: Check scripts

# Verifies that the scripts in the repository are consistent with each other before a pull request can be merged.

on:
pull_request:
branches:
- main
push:
branches:
- main # confirms that main itself is consistent after a merge
workflow_dispatch: # adds a manual "Run workflow" button, handy for testing

jobs:
checksums:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5

- name: Check that every script is listed in SHA256SUMS.txt
run: |
ls *.sql | sort > /tmp/scripts.txt
awk '{print $2}' SHA256SUMS.txt | sort > /tmp/listed.txt
if ! diff /tmp/scripts.txt /tmp/listed.txt; then
echo "The scripts in the repository and the files listed in SHA256SUMS.txt do not match."
echo "Lines starting with < are scripts that are not listed; lines starting with > are listed files that do not exist."
exit 1
fi
echo "All scripts are listed."

- name: Check that the checksums are current
run: sha256sum -c SHA256SUMS.txt

versions:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5

- name: Check that every script has the same version timestamp
run: |
set -u

# Every script in a release is built at the same time and stamped with that time.
# The installation scripts contain one stamp per stored procedure they include, so this also detects an installation script built from an outdated procedure.
PATTERN='Version: [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'

echo "Version timestamps found in each script:"
for f in *.sql; do
STAMPS=$(grep -hoE "$PATTERN" "$f" | sed 's/^Version: //' | sort -u | tr '\n' ' ')
printf ' %-42s %s\n' "$f" "${STAMPS:-(none)}"
done

ALL=$(grep -hoE "$PATTERN" *.sql | sed 's/^Version: //' | sort -u)
COUNT=$(printf '%s\n' "$ALL" | grep -c . || true)

echo
if [ "$COUNT" -eq 0 ]; then
echo "No version timestamps were found. The scripts are expected to carry one."
exit 1
fi
if [ "$COUNT" -ne 1 ]; then
echo "The scripts do not all have the same version timestamp:"
printf '%s\n' "$ALL" | sed 's/^/ /'
exit 1
fi
echo "All scripts have the same version timestamp: $ALL"

timestamp:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5
with:
fetch-depth: 0 # the base commit is needed to read the previous version timestamp

- name: Check that the version timestamp moves forward
if: github.event_name == 'pull_request'
run: |
set -u

# Every release is built from scratch and stamped with the time of the build, so the timestamp always moves forward.
# A timestamp that has gone backwards means the scripts were copied from an older build folder.
BASE='${{ github.event.pull_request.base.sha }}'
PATTERN='Version: [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'

OLD=$(git show "$BASE:DatabaseBackup.sql" | grep -m1 -oE "$PATTERN" | sed 's/^Version: //')
NEW=$(grep -m1 -oE "$PATTERN" DatabaseBackup.sql | sed 's/^Version: //')

if [ -z "$OLD" ] || [ -z "$NEW" ]; then
echo "A version timestamp could not be read from DatabaseBackup.sql."
exit 1
fi

if [ "$NEW" = "$OLD" ]; then
if git diff --quiet "$BASE" -- '*.sql'; then
echo "The scripts have not changed. Version timestamp $NEW."
exit 0
fi
echo "The scripts have changed but the version timestamp is still $NEW."
echo "Every change to the scripts should come from a build."
exit 1
fi

if [ "$NEW" \< "$OLD" ]; then
echo "The version timestamp has gone backwards: $OLD -> $NEW."
echo "This usually means the scripts were copied from an older build folder."
exit 1
fi

echo "The version timestamp has moved forward: $OLD -> $NEW"

installers:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5

- name: Check that the installation scripts contain the same code as the separate scripts
run: |
python3 - << 'EOF'
import sys

BOM = b"\xef\xbb\xbf"

# Which separate scripts each installation script is built from, in order.
INSTALLERS = {
"MaintenanceSolution.sql": [
"CommandLog.sql", "CommandExecute.sql", "DatabaseBackup.sql",
"DatabaseIntegrityCheck.sql", "IndexOptimize.sql"],
"MaintenanceSolutionAzureSQLDatabase.sql": [
"CommandLog.sql", "CommandExecute.sql",
"DatabaseIntegrityCheck.sql", "IndexOptimize.sql"],
}

def read(path):
data = open(path, "rb").read()
return data[len(BOM):] if data.startswith(BOM) else data

def body(path):
# The separate scripts have one line terminator appended after they have been merged into the installation scripts, so the merged copy is the file without it.
return read(path).rstrip(b"\r\n")

failures = 0
for installer, objects in INSTALLERS.items():
data = read(installer)
print("%s (%d bytes)" % (installer, len(data)))
position = None
for name in objects:
part = body(name)
found = data.find(part)
if found < 0:
print(" FAIL %s: the code is not in the installation script" % name)
failures += 1
break
if position is not None and found != position:
print(" FAIL %s: starts at byte %d, but the previous script ends at byte %d"
% (name, found, position))
failures += 1
break
print(" OK %-28s %8d bytes at byte %d" % (name, len(part), found))
position = found + len(part) + 2 # one line terminator between the scripts
else:
# The header and the footer are not in the repository, so the bytes before the first script and after the last one are not checked.
print(" (%d bytes before the first script, %d bytes after the last)"
% (data.find(body(objects[0])), len(data) - position))
print()

if failures:
print("Rebuild the installation scripts so that every file comes from the same build.")
sys.exit(1)
print("The installation scripts contain the same code as the separate scripts.")
EOF
56 changes: 56 additions & 0 deletions .github/workflows/create-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Create tag from version header

# Runs every time you push/merge a commit to main. It reads the version timestamp out of the script header and creates a matching, immutable Git tag.

on:
push:
branches:
- main
paths:
- MaintenanceSolution.sql # only run when this file actually changes

permissions:
contents: write # allow the workflow to create and push a tag

jobs:
tag:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5
with:
fetch-depth: 0 # full history so existing tags are visible

- name: Read version from header and create tag
run: |
set -euo pipefail

# 1. Pull the "YYYY-MM-DD HH:MM:SS" timestamp out of the header.
VERSION=$(grep -m1 -oP '(?<=--// Version: )\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}' MaintenanceSolution.sql || true)

if [ -z "$VERSION" ]; then
echo "No version line found in MaintenanceSolution.sql - nothing to tag."
exit 0
fi

# 2. Turn it into a valid tag name.
# Tags cannot contain spaces or colons, so strip the separators:
# "2026-07-16 23:38:29" -> "20260716_233829"
TAG=$(echo "$VERSION" | sed 's/[-:]//g; s/ /_/')
echo "Version in header : $VERSION"
echo "Tag name : $TAG"

# 3. If that tag already exists, do nothing (safe to re-run).
if git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then
echo "Tag $TAG already exists - skipping."
exit 0
fi

# 4. Create an annotated tag on this commit and push it.
# Annotated tags carry a tagger and date, so the runner needs a git identity.
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

git tag -a "$TAG" -m "Version: $VERSION"
git push origin "refs/tags/$TAG"
echo "Created tag $TAG"
86 changes: 86 additions & 0 deletions .github/workflows/deploy-website.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: Deploy to website

# Uploads the released files to the website over FTPS whenever a release is merged to main.

on:
push:
branches:
- main
paths:
- MaintenanceSolution.sql # a release always updates this file
workflow_dispatch: # adds a manual "Run workflow" button, handy for testing

env:
REMOTE_DIR: "/public_html/scripts" # scripts folder on the server

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Check out the repository
uses: actions/checkout@v5

- name: Install lftp (FTPS client)
run: sudo apt-get update -qq && sudo apt-get install -y -qq lftp

- name: Upload files over FTPS
env:
FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
LFTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
run: |
set -u

# Upload order: components first, then the installers, SHA256SUMS.txt last
# (the checksums go live only after the files they describe are in place).
FILES="CommandLog.sql Queue.sql QueueDatabase.sql CommandExecute.sql DatabaseBackup.sql DatabaseIntegrityCheck.sql IndexOptimize.sql MaintenanceSolutionAzureSQLDatabase.sql MaintenanceSolution.sql SHA256SUMS.txt"

# Explicit FTPS (AUTH TLS) on port 21
SETTINGS="set ftp:ssl-force true; set ftp:ssl-protect-data true; set ssl:verify-certificate true; set net:max-retries 2; set net:timeout 60"

# The password is read from the LFTP_PASSWORD environment variable, keeping it off the command line and out of the process table.
run_lftp () {
lftp -p 21 --env-password -u "$FTP_USERNAME" -e "$SETTINGS; $1; bye" "$FTP_SERVER"
}

# Two-phase upload.
# Phase 1 uploads ALL files under temporary names.
# Phase 2 renames the temp files into place.
UPLOAD=""
for f in $FILES; do
UPLOAD="$UPLOAD put $f -o $REMOTE_DIR/$f.tmp;"
done
for f in $FILES; do
UPLOAD="$UPLOAD mv $REMOTE_DIR/$f.tmp $REMOTE_DIR/$f;"
done

# Verification: list the files on the server and compare each size, byte for byte, against the file in the repository.
verify () {
LISTING=$(run_lftp "cls -s --block-size=1 $REMOTE_DIR/*.sql $REMOTE_DIR/SHA256SUMS.txt") || return 1
for f in $FILES; do
LOCAL=$(stat -c %s "$f")
REMOTE=$(printf '%s\n' "$LISTING" | grep "/$f\$" | awk '{print $1}')
if [ "$LOCAL" != "$REMOTE" ]; then
echo "VERIFY FAILED: $f is $LOCAL bytes in the repo but ${REMOTE:-missing} on the server"
return 1
fi
echo "Verified $f ($LOCAL bytes)"
done
return 0
}

# Try the whole upload-and-verify up to 3 times
for attempt in 1 2 3; do
echo "=== Upload attempt $attempt of 3 ==="
if run_lftp "$UPLOAD" && verify; then
echo "Deploy succeeded and verified."
exit 0
fi
if [ "$attempt" -lt 3 ]; then
echo "Attempt $attempt failed - waiting 120 seconds before retrying."
sleep 120
fi
done

echo "All attempts failed. The website may be behind or partially updated; re-run this workflow when the host is reachable to make it consistent."
exit 1
Loading
Loading