From 231a48fa87323ae9923f597129c87bb53efdf9b4 Mon Sep 17 00:00:00 2001
From: jNullj <15849761+jNullj@users.noreply.github.com>
Date: Sun, 9 Mar 2025 18:23:39 +0200
Subject: [PATCH] [sourceforge] add repo param to last commit service (#10935)

* [sourceforge] add repo param to last commit service

some sourceforge projects have multiple repositories, so we need to
specify the repository to use for the last commit service.

* [sourceforge] add redirect for old project param only URLs
---
 ...ourceforge-last-commit-redirect.service.js | 15 ++++++++++
 ...sourceforge-last-commit-redirect.tester.js |  6 ++++
 .../sourceforge-last-commit.service.js        | 30 ++++++++++++-------
 .../sourceforge-last-commit.tester.js         | 14 +++++++--
 4 files changed, 51 insertions(+), 14 deletions(-)
 create mode 100644 services/sourceforge/sourceforge-last-commit-redirect.service.js
 create mode 100644 services/sourceforge/sourceforge-last-commit-redirect.tester.js

diff --git a/services/sourceforge/sourceforge-last-commit-redirect.service.js b/services/sourceforge/sourceforge-last-commit-redirect.service.js
new file mode 100644
index 0000000000..b08627250e
--- /dev/null
+++ b/services/sourceforge/sourceforge-last-commit-redirect.service.js
@@ -0,0 +1,15 @@
+import { redirector } from '../index.js'
+
+export default redirector({
+  // SourceForge last commit service used to only have project name as a parameter
+  // and the repository name was always `git`.
+  // The service was later updated to have the repository name as a parameter.
+  // This redirector is used to keep the old URLs working.
+  category: 'activity',
+  route: {
+    base: 'sourceforge/last-commit',
+    pattern: ':project',
+  },
+  transformPath: ({ project }) => `/sourceforge/last-commit/${project}/git`,
+  dateAdded: new Date('2025-03-08'),
+})
diff --git a/services/sourceforge/sourceforge-last-commit-redirect.tester.js b/services/sourceforge/sourceforge-last-commit-redirect.tester.js
new file mode 100644
index 0000000000..b8d5b4f66c
--- /dev/null
+++ b/services/sourceforge/sourceforge-last-commit-redirect.tester.js
@@ -0,0 +1,6 @@
+import { createServiceTester } from '../tester.js'
+export const t = await createServiceTester()
+
+t.create('last commit (redirect)')
+  .get('/guitarix.json')
+  .expectRedirect('/sourceforge/last-commit/guitarix/git.json')
diff --git a/services/sourceforge/sourceforge-last-commit.service.js b/services/sourceforge/sourceforge-last-commit.service.js
index 91d25bfe6c..fd7dc766c3 100644
--- a/services/sourceforge/sourceforge-last-commit.service.js
+++ b/services/sourceforge/sourceforge-last-commit.service.js
@@ -17,35 +17,43 @@ export default class SourceforgeLastCommit extends BaseJsonService {
 
   static route = {
     base: 'sourceforge/last-commit',
-    pattern: ':project',
+    pattern: ':project/:repo',
   }
 
   static openApi = {
-    '/sourceforge/last-commit/{project}': {
+    '/sourceforge/last-commit/{project}/{repo}': {
       get: {
         summary: 'SourceForge Last Commit',
-        parameters: pathParams({
-          name: 'project',
-          example: 'guitarix',
-        }),
+        parameters: pathParams(
+          {
+            name: 'project',
+            example: 'guitarix',
+          },
+          {
+            name: 'repo',
+            example: 'git',
+            description:
+              'The repository name, usually `git` but might be different.',
+          },
+        ),
       },
     },
   }
 
   static defaultBadgeData = { label: 'last commit' }
 
-  async fetch({ project }) {
+  async fetch({ project, repo }) {
     return this._requestJson({
-      url: `https://sourceforge.net/rest/p/${project}/git/commits`,
+      url: `https://sourceforge.net/rest/p/${project}/${repo}/commits`,
       schema,
       httpErrors: {
-        404: 'project not found',
+        404: 'project or repo not found',
       },
     })
   }
 
-  async handle({ project }) {
-    const body = await this.fetch({ project })
+  async handle({ project, repo }) {
+    const body = await this.fetch({ project, repo })
     return renderDateBadge(body.commits[0].committed_date)
   }
 }
diff --git a/services/sourceforge/sourceforge-last-commit.tester.js b/services/sourceforge/sourceforge-last-commit.tester.js
index 8a4487c6e3..94bee37039 100644
--- a/services/sourceforge/sourceforge-last-commit.tester.js
+++ b/services/sourceforge/sourceforge-last-commit.tester.js
@@ -3,9 +3,17 @@ import { createServiceTester } from '../tester.js'
 export const t = await createServiceTester()
 
 t.create('last commit')
-  .get('/guitarix.json')
+  .get('/guitarix/git.json')
+  .expectBadge({ label: 'last commit', message: isFormattedDate })
+
+t.create('last commit (non default repo)')
+  .get('/opencamera/code.json')
   .expectBadge({ label: 'last commit', message: isFormattedDate })
 
 t.create('last commit (project not found)')
-  .get('/that-doesnt-exist.json')
-  .expectBadge({ label: 'last commit', message: 'project not found' })
+  .get('/that-doesnt-exist/fake.json')
+  .expectBadge({ label: 'last commit', message: 'project or repo not found' })
+
+t.create('last commit (repo not found)')
+  .get('/guitarix/fake-repo.json')
+  .expectBadge({ label: 'last commit', message: 'project or repo not found' })
-- 
GitLab