summary refs log tree commit diff
diff options
context:
space:
mode:
authorWill Hunt <will@half-shot.uk>2024-03-14 15:18:51 +0000
committerGitHub <noreply@github.com>2024-03-14 15:18:51 +0000
commit1198f649ea91bcc21ae5b596ad50bf1851de2589 (patch)
tree3054802f721977d6178cb6fb16d46d6d52a5be58
parentupgrade.md: fix grammatical errors (#16965) (diff)
downloadsynapse-1198f649ea91bcc21ae5b596ad50bf1851de2589.tar.xz
Sort versions in the documentation version picker appropriately. (#16966)
Fixes #16964 

This adds a proper sorter for versions which takes into account semantic
versions, rather than just relying on localeCompare.
-rw-r--r--changelog.d/16966.doc1
-rw-r--r--docs/website_files/version-picker.js26
2 files changed, 24 insertions, 3 deletions
diff --git a/changelog.d/16966.doc b/changelog.d/16966.doc
new file mode 100644
index 0000000000..06f4093aee
--- /dev/null
+++ b/changelog.d/16966.doc
@@ -0,0 +1 @@
+Fix the sort order for the documentation version picker, so that newer releases appear above older ones.
diff --git a/docs/website_files/version-picker.js b/docs/website_files/version-picker.js
index b6f35f29c7..3174b5d0bc 100644
--- a/docs/website_files/version-picker.js
+++ b/docs/website_files/version-picker.js
@@ -100,10 +100,30 @@ function sortVersions(a, b) {
     if (a === 'develop' || a === 'latest') return -1;
     if (b === 'develop' || b === 'latest') return 1;
 
-    const versionA = (a.match(/v\d+(\.\d+)+/) || [])[0];
-    const versionB = (b.match(/v\d+(\.\d+)+/) || [])[0];
+    // If any of the versions do not confrom to a semantic version string, they
+    // will be sorted behind a valid version.
+    const versionA = (a.match(/v(\d+(\.\d+)+)/) || [])[1]?.split('.') ?? '';
+    const versionB = (b.match(/v(\d+(\.\d+)+)/) || [])[1]?.split('.') ?? '';
 
-    return versionB.localeCompare(versionA);
+    for (let i = 0; i < Math.max(versionA.length, versionB.length); i++) {
+        if (versionB[i] === undefined) {
+            return -1;
+        }
+        if (versionA[i] === undefined) {
+            return 1;
+        }
+
+        const partA = parseInt(versionA[i], 10);
+        const partB = parseInt(versionB[i], 10);
+
+        if (partA > partB) {
+            return -1;
+        } else if (partB > partA) {
+            return 1;
+        }
+    }
+
+    return 0;
 }
 
 /**