diff --git a/docs/README.md b/docs/README.md
index cb6c8b8d2..986e94ead 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -794,6 +794,10 @@ GitHub 官方也提供了一些 RSS:
+### Linux Patchwork
+
+
+
## 直播
### 哔哩哔哩直播
diff --git a/lib/router.js b/lib/router.js
index 93241b174..c57a26904 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -944,4 +944,7 @@ router.get('/36kr/search/article/:keyword', require('./routes/36kr/search/articl
// icourse163
router.get('/icourse163/newest', require('./routes/icourse163/newest'));
+// patchwork.kernel.org
+router.get('/patchwork.kernel.org/comments/:id', require('./routes/patchwork.kernel.org/comments'));
+
module.exports = router;
diff --git a/lib/routes/patchwork.kernel.org/cache.js b/lib/routes/patchwork.kernel.org/cache.js
new file mode 100644
index 000000000..58b4da614
--- /dev/null
+++ b/lib/routes/patchwork.kernel.org/cache.js
@@ -0,0 +1,17 @@
+const axios = require('../../utils/axios');
+
+module.exports = {
+ getPatchnameFromID: async (ctx, id) => {
+ const key = 'patchwork-kernel-org-patchname-from-id-' + id;
+ let name = await ctx.cache.get(key);
+ if (!name) {
+ const patchDetail = await axios({
+ method: 'get',
+ url: `https://patchwork.kernel.org/api/patches/${id}/`,
+ });
+ name = patchDetail.data.name;
+ ctx.cache.set(key, name, 24 * 60 * 60);
+ }
+ return name;
+ },
+};
diff --git a/lib/routes/patchwork.kernel.org/comments.js b/lib/routes/patchwork.kernel.org/comments.js
new file mode 100644
index 000000000..b40ec43d9
--- /dev/null
+++ b/lib/routes/patchwork.kernel.org/comments.js
@@ -0,0 +1,32 @@
+const axios = require('../../utils/axios');
+const cache = require('./cache');
+const he = require('he');
+
+module.exports = async (ctx) => {
+ const id = ctx.params.id;
+
+ const name = await cache.getPatchnameFromID(ctx, id);
+
+ const host = `https://patchwork.kernel.org/patch/${id}/`;
+ const url = `https://patchwork.kernel.org/api/patches/${id}/comments/`;
+
+ const response = await axios({
+ method: 'get',
+ url,
+ params: {
+ order: '-date',
+ },
+ });
+ const data = response.data;
+
+ ctx.state.data = {
+ title: `${name} - Comments`,
+ link: host,
+ item: data.map((item) => ({
+ title: item.subject,
+ description: he.escape(he.escape(item.content)).replace(/\n/g, '
'),
+ pubDate: new Date(item.date).toUTCString(),
+ link: item.web_url,
+ })),
+ };
+};