From 8cf86b67ca8b80e39c427fc1086b78eaf234545c Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Wed, 14 Jan 2026 07:19:30 +0200 Subject: [PATCH 1/4] Redirect /technical-changelog.rss to new docs service - Remove local RSS generation (dev/rss.js) - Redirect to https://sourcegraph.com/changelog/technical-changelog.rss - Extract URL to shared constant --- dev/rss.js | 82 ------------------------------------------- next.config.js | 2 -- src/app/layout.tsx | 3 +- src/data/constants.ts | 7 ++++ src/data/redirects.ts | 10 ++++++ src/middleware.ts | 9 ++--- 6 files changed, 24 insertions(+), 89 deletions(-) delete mode 100644 dev/rss.js create mode 100644 src/data/constants.ts diff --git a/dev/rss.js b/dev/rss.js deleted file mode 100644 index 2f9924f7a..000000000 --- a/dev/rss.js +++ /dev/null @@ -1,82 +0,0 @@ -const {Feed} = require('feed'); -const fs = require('fs'); -const path = require('path'); - -const loadChangelog = () => { - const changelogPath = path.join( - __dirname, - '..', - 'docs', - 'technical-changelog.mdx' - ); - return fs.readFileSync(changelogPath, 'utf8'); -}; - -const extractRSSComments = content => { - const regex = /\{\/\*\s*RSS=(.*?)\s*\*\/}/g; - const matches = []; - let match; - - while ((match = regex.exec(content)) !== null) { - matches.push(JSON.parse(match[1].trim())); - } - - return matches; -}; - -const generateRssFeed = () => { - const baseURL = 'https://sourcegraph.com'; - const siteURL = 'https://sourcegraph.com/docs'; - const date = new Date(); - - const feed = new Feed({ - title: 'Sourcegraph RSS', - description: 'RSS feed for Sourcegraph', - id: siteURL, - link: baseURL, - language: 'en', - image: `${siteURL}/sourcegraph-mark.png`, - favicon: `${siteURL}/sourcegraph-mark.png`, - copyright: `All rights reserved ${date.getFullYear()}, Sourcegraph`, - updated: date, - generator: 'Sourcegraph RSS Feed', - feedLinks: { - rss2: `${siteURL}/technical-changelog.rss` - }, - author: { - name: 'Sourcegraph', - email: 'hi@sourcegraph.com', - link: 'https://sourcegraph.com' - } - }); - - const changelog = loadChangelog(); - const rssComments = extractRSSComments(changelog); - - // the rss comments have the structure: {/* RSS={"version":"vX.Y.Z", "releasedAt": "" */} - for (let idx = 0; idx < rssComments.length; idx++) { - const comment = rssComments[idx]; - if (!comment.version || !comment.releasedAt) { - continue; - } - const tag = comment.version.replace('v', ''); - const versionDocLink = `${siteURL}/technical-changelog#${comment.version.replaceAll( - '.', - '' - )}`; - feed.addItem({ - title: `Sourcegraph ${tag}`, - id: comment.version, - link: versionDocLink, - description: `Sourcegraph ${tag} is now available! Note: we've updated our versioning conventions. Please see our releases page for more information.`, - date: new Date(comment.releasedAt) - }); - } - - fs.writeFileSync( - path.join(__dirname, '../public/technical-changelog.rss'), - feed.rss2() - ); -}; - -module.exports = {generateRssFeed}; diff --git a/next.config.js b/next.config.js index fb2eb2e2e..ba85bf759 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,4 @@ const {withContentlayer} = require('next-contentlayer'); -const {generateRssFeed} = require('./dev/rss'); const {execSync} = require('child_process'); /** @type {import('next').NextConfig} */ @@ -24,6 +23,5 @@ module.exports = async () => { execSync('node dev/check-links.mjs', {stdio: 'inherit'}); execSync('node dev/check-filenames.mjs', {stdio: 'inherit'}); execSync('node dev/check-images.mjs', {stdio: 'inherit'}); - await generateRssFeed(); return withContentlayer(nextConfig); }; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 8edafcf37..0b45f028b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,6 @@ import {Providers} from '@/app/providers'; import {Layout} from '@/components/Layout'; +import {TECHNICAL_CHANGELOG_RSS_URL} from '@/data/constants'; import {GoogleAnalytics} from '@next/third-parties/google'; import clsx from 'clsx'; import config from 'docs.config'; @@ -81,7 +82,7 @@ export default function RootLayout({children}: {children: React.ReactNode}) { rel="alternate" type="application/rss+xml" title="RSS Feed for Sourcegraph" - href="/technical-changelog.rss" + href={TECHNICAL_CHANGELOG_RSS_URL} /> Date: Wed, 14 Jan 2026 07:27:31 +0200 Subject: [PATCH 2/4] remove duplication from comment --- src/data/redirects.ts | 1 - src/middleware.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data/redirects.ts b/src/data/redirects.ts index f099659d5..7a89f36c5 100644 --- a/src/data/redirects.ts +++ b/src/data/redirects.ts @@ -7074,7 +7074,6 @@ const redirectsData = [ }, // RSS feed moved from /docs/technical-changelog.rss to /changelog/technical-changelog.rss // This redirect preserves existing RSS subscriptions - // See: https://github.com/sourcegraph/sourcegraph/blob/main/cmd/docs/src/routes/changelog/technical-changelog.rss/%2Bserver.ts { source: '/technical-changelog.rss', destination: TECHNICAL_CHANGELOG_RSS_URL, diff --git a/src/middleware.ts b/src/middleware.ts index 0952ee2a4..4ef3f6de2 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -141,7 +141,7 @@ export function middleware(request: NextRequest) { } if (pathWithoutBase === '/changelog.rss') - return NextResponse.redirect(TECHNICAL_CHANGELOG_RSS_URL, 301); + return NextResponse.redirect(TECHNICAL_CHANGELOG_RSS_URL, 308); return NextResponse.next(); } From f3c0a2590a1a6c5beca21b34b22b5a230c2c8485 Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Wed, 14 Jan 2026 23:36:22 +0200 Subject: [PATCH 3/4] Use default 307 temporary redirects instead of permanent 308s --- src/middleware.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index 4ef3f6de2..465904028 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -73,8 +73,7 @@ export function middleware(request: NextRequest) { ); if (redirect) { return NextResponse.redirect( - createRedirectUrl(request, redirect.destination, path), - redirect.permanent ? 308 : 307 + createRedirectUrl(request, redirect.destination, path) ); } From c72960363d703b3b8a3af4a242f48c0d65d7e38d Mon Sep 17 00:00:00 2001 From: Taras Yemets Date: Wed, 14 Jan 2026 23:38:48 +0200 Subject: [PATCH 4/4] Use 307 for RSS redirect as well --- src/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index 465904028..37e93dc85 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -140,7 +140,7 @@ export function middleware(request: NextRequest) { } if (pathWithoutBase === '/changelog.rss') - return NextResponse.redirect(TECHNICAL_CHANGELOG_RSS_URL, 308); + return NextResponse.redirect(TECHNICAL_CHANGELOG_RSS_URL); return NextResponse.next(); }