Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
105 lines
3.6 KiB
JavaScript
105 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
// Filter the raw redirects.json (extracted from the legacy Sphinx
|
|
// redirects.py) to the subset whose target MDX page actually exists in
|
|
// the migrated `docs/` tree. Output:
|
|
// docs-site/sidebars/active-redirects.json
|
|
// (kept in the sidebars/ folder since that's already gitignore-aware and
|
|
// regenerated). Consumed by docusaurus.config.ts via
|
|
// @docusaurus/plugin-client-redirects.
|
|
//
|
|
// Internal redirects whose destination is still missing (target page not
|
|
// yet migrated, or marked draft) are dropped silently — they'll start
|
|
// working as soon as the destination lands. External redirects (to
|
|
// github.com, other-host) need server-side rules and aren't emitted here.
|
|
//
|
|
// Usage: node docs-site/scripts/gen-active-redirects.mjs
|
|
|
|
import {readFileSync, writeFileSync, readdirSync, statSync, existsSync} from 'node:fs';
|
|
import {join, resolve, basename, dirname} from 'node:path';
|
|
import {fileURLToPath} from 'node:url';
|
|
|
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
const SITE_ROOT = resolve(HERE, '..');
|
|
const REPO_ROOT = resolve(SITE_ROOT, '..');
|
|
const DOCS = join(REPO_ROOT, 'main');
|
|
const SRC = join(SITE_ROOT, 'scripts', 'migrate-main-docs', 'redirects.json');
|
|
const OUT = join(SITE_ROOT, 'sidebars', 'active-redirects.json');
|
|
|
|
function isDraft(filePath) {
|
|
try {
|
|
const head = readFileSync(filePath, 'utf8').slice(0, 800);
|
|
return /^draft:\s*true/m.test(head);
|
|
} catch { return false; }
|
|
}
|
|
|
|
function urlFromMdx(absPath) {
|
|
// docs/foo/bar.mdx → /foo/bar (index.mdx → /foo)
|
|
let rel = absPath.slice(DOCS.length).replace(/\\/g, '/');
|
|
rel = rel.replace(/\.mdx$/, '');
|
|
if (rel.endsWith('/index')) rel = rel.slice(0, -'/index'.length);
|
|
return rel || '/';
|
|
}
|
|
|
|
function collectExistingUrls() {
|
|
const urls = new Set();
|
|
(function walk(dir) {
|
|
for (const name of readdirSync(dir)) {
|
|
const p = join(dir, name);
|
|
const s = statSync(p);
|
|
if (s.isDirectory()) walk(p);
|
|
else if (p.endsWith('.mdx') && !isDraft(p)) urls.add(urlFromMdx(p));
|
|
}
|
|
})(DOCS);
|
|
return urls;
|
|
}
|
|
|
|
function main() {
|
|
const raw = JSON.parse(readFileSync(SRC, 'utf8'));
|
|
const existing = collectExistingUrls();
|
|
const active = [];
|
|
const missing = [];
|
|
const droppedAnchoredFrom = [];
|
|
for (const r of raw.internal) {
|
|
// @docusaurus/plugin-client-redirects requires `from` paths without
|
|
// anchors. Sphinx allowed anchored sources for mid-page redirects —
|
|
// those need server-side rules, not client-side. Drop them.
|
|
if (r.from.includes('#')) { droppedAnchoredFrom.push(r); continue; }
|
|
// Strip anchor when checking existence; preserve it in the emitted to.
|
|
const target = r.to.split('#')[0];
|
|
if (existing.has(target)) active.push({from: r.from, to: r.to});
|
|
else missing.push(r);
|
|
}
|
|
// De-duplicate: the plugin refuses duplicate FROM values.
|
|
const seenFrom = new Map();
|
|
const final = [];
|
|
for (const r of active) {
|
|
if (seenFrom.has(r.from)) continue;
|
|
seenFrom.set(r.from, true);
|
|
final.push(r);
|
|
}
|
|
writeFileSync(
|
|
OUT,
|
|
JSON.stringify(
|
|
{
|
|
_meta: {
|
|
source: 'docs-site/scripts/migrate-main-docs/redirects.json',
|
|
active: final.length,
|
|
missing_target: missing.length,
|
|
dropped_anchored_from: droppedAnchoredFrom.length,
|
|
total_internal: raw.internal.length,
|
|
},
|
|
redirects: final,
|
|
},
|
|
null,
|
|
2,
|
|
),
|
|
);
|
|
console.log(`[redirects] wrote ${OUT}`);
|
|
console.log(` active: ${final.length}`);
|
|
console.log(` missing target: ${missing.length}`);
|
|
console.log(` dropped (anchored): ${droppedAnchoredFrom.length}`);
|
|
console.log(` total internal: ${raw.internal.length}`);
|
|
}
|
|
|
|
main();
|