Removed xmlrpc/pingomatic ping service#25
Conversation
Pingomatic is a legacy blog ping service that is no longer relevant for modern SEO or content distribution. The service was disabled by default and added unnecessary complexity to the codebase.
WalkthroughThe XMLRPC service has been entirely removed from Ghost core. This includes deleting the xmlrpc service module, removing associated unit tests, eliminating initialization from the boot sequence, and removing the Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
ghost/core/core/boot.js (1)
349-368: KeepemailAddressServiceinitialization ordered before dependents.The comment on Line 349 says newsletter/email depend on
emailAddressService, but it now initializes concurrently. That can race and break dependent service init in cold boot. Recommend awaiting it before the parallel block.✅ Proposed fix
- // NOTE: newsletter service and email service depend on email address service - - await Promise.all([ - emailAddressService.init(), + // NOTE: newsletter service and email service depend on email address service + await emailAddressService.init(); + + await Promise.all([ identityTokens.init(), memberAttribution.init(), mentionsService.init(), mentionsEmailReport.init(), staffService.init(), members.init(), tiers.init(), tagsPublic.init(), postsPublic.init(), membersEvents.init(), permissions.init(), audienceFeedback.init(), emailService.init(), emailAnalytics.init(), webhooks.listen(), scheduling.init(), comments.init(), linkTracking.init(), emailSuppressionList.init(), slackNotifications.init(), mediaInliner.init(), donationService.init(), recommendationsService.init(), statsService.init(), explorePingService.init() ]);
🤖 Fix all issues with AI agents
In `@ghost/core/core/boot.js`:
- Around line 367-368: scheduling.init() is being called without the required
apiUrl and thus PostScheduler's constructor throws; fix by passing the apiUrl
through the options when calling scheduling.init — e.g., call scheduling.init({
apiUrl: /* provide same apiUrl used elsewhere (eg. from existing options or
config) */ }) so the PostScheduler (PostScheduler constructor) receives apiUrl
during initialization.
- Around line 314-320: The slack service is required but never initialized;
either remove the unused require for slack or call slack.listen() during the
services initialization so the post.published event listeners in slack.js are
registered; update the initialization block where other services are initialized
(e.g., alongside members, tiers, permissions) and ensure you do not confuse this
with slackNotifications (which is a different service).
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
ghost/core/core/boot.jsghost/core/core/server/services/xmlrpc.jsghost/core/core/shared/config/env/config.development.jsonghost/core/test/unit/server/services/xmlrpc.test.js
💤 Files with no reviewable changes (3)
- ghost/core/core/shared/config/env/config.development.json
- ghost/core/core/server/services/xmlrpc.js
- ghost/core/test/unit/server/services/xmlrpc.test.js
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| const identityTokens = require('./server/services/identity-tokens'); | ||
| const stripe = require('./server/services/stripe'); | ||
| const members = require('./server/services/members'); | ||
| const tiers = require('./server/services/tiers'); | ||
| const permissions = require('./server/services/permissions'); | ||
| const xmlrpc = require('./server/services/xmlrpc'); | ||
| const slack = require('./server/services/slack'); | ||
| const webhooks = require('./server/services/webhooks'); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
rg -n "services/slack|slack\.listen\(|slack\.init\(" -g "*.js" -C 2Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 4188
🏁 Script executed:
cat -n ghost/core/core/boot.js | sed -n '310,325p'Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 1101
🏁 Script executed:
cat -n ghost/core/core/boot.js | sed -n '365,375p'Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 500
🏁 Script executed:
cat -n ghost/core/core/boot.js | grep -n "slack\."Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 66
🏁 Script executed:
cat -n ghost/core/server/services/slack/index.js | head -50Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 157
🏁 Script executed:
rg -n "\.listen\s*\(" ghost/core/server/services/slack/ -g "*.js" -B 2 -A 5Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 157
🏁 Script executed:
fd -t f "slack" ghost/core/server/services/ 2>/dev/null | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 66
🏁 Script executed:
ls -la ghost/core/server/services/ | grep slackRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 158
🏁 Script executed:
find ghost/core/server/services -name "*slack*" -type f 2>/dev/nullRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 66
🏁 Script executed:
rg "require\(['\"]\./server/services/slack" ghost/core/core/boot.js -A 5 -B 5Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 1563
🏁 Script executed:
ls -la ghost/core/core/Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 608
🏁 Script executed:
find ghost/core -type d -name services | head -10Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 526
🏁 Script executed:
git ls-files "ghost/core*" | grep -E "(slack|services)" | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 1211
🏁 Script executed:
ls -la ghost/core/core/server/services/ | grep slackRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 212
🏁 Script executed:
find ghost/core/core/server/services -name "*slack*" -type fRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 124
🏁 Script executed:
cat -n ghost/core/core/server/services/slack-notifications/index.js | head -50Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 129
🏁 Script executed:
ls -la ghost/core/core/server/services/slack* -dRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 274
🏁 Script executed:
cat -n ghost/core/core/server/services/slack.jsRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 8776
🏁 Script executed:
rg "slack\.listen\(\)" -g "*.js" --no-headingRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 158
🏁 Script executed:
cat -n ghost/core/core/boot.js | grep -A 100 "const slack = require" | grep -E "slack\." | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 66
🏁 Script executed:
cat -n ghost/core/core/server/services/slack-notifications/index.jsRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 129
🏁 Script executed:
cat -n ghost/core/core/server/services/slack-notifications/service.js | head -100Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 2449
🏁 Script executed:
rg "events.on\(" ghost/core/core/server/services/ -g "*.js" -B 2 -A 2 | grep -A 5 -B 5 "post.published"Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 2121
🏁 Script executed:
git log --oneline -n 20 -- ghost/core/core/boot.js | head -10Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 102
Remove unused slack require or add slack.listen() to initialization.
The slack service is required but never initialized. Since slack.listen() registers the event listeners for post.published events that trigger Slack webhook notifications (lines 192-200 of slack.js), omitting this call silently disables Slack webhook notifications. Either add slack.listen() to the initialization block (around line 365-372) or remove the unused require if this feature is intentionally deprecated.
Note: slackNotifications (line 372) is a separate service for milestone notifications and does not replace the webhook functionality.
Also applies to: 367-372
🤖 Prompt for AI Agents
In `@ghost/core/core/boot.js` around lines 314 - 320, The slack service is
required but never initialized; either remove the unused require for slack or
call slack.listen() during the services initialization so the post.published
event listeners in slack.js are registered; update the initialization block
where other services are initialized (e.g., alongside members, tiers,
permissions) and ensure you do not confuse this with slackNotifications (which
is a different service).
| webhooks.listen(), | ||
| scheduling.init({ | ||
| apiUrl: urlUtils.urlFor('api', {type: 'admin'}, true) | ||
| }), | ||
| scheduling.init(), |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Locate scheduling adapter implementation and inspect init signature/usage
fd -a "scheduling" server | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 177
🏁 Script executed:
#!/bin/bash
# Look for scheduling module in the codebase
find . -type f -name "*scheduling*" | grep -E "\.(js|json)$" | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 444
🏁 Script executed:
#!/bin/bash
# Check boot.js context around lines 367-368
cat -n ghost/core/core/boot.js | sed -n '360,375p'Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 681
🏁 Script executed:
#!/bin/bash
# Search for scheduling init signature and apiUrl usage
rg -n "scheduling.*init|init.*apiUrl" --type js -B 3 -A 3Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 484
🏁 Script executed:
#!/bin/bash
# Find where scheduling is imported/required in boot.js
grep -n "scheduling\|require.*scheduling\|import.*scheduling" ghost/core/core/boot.js | head -20Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 182
🏁 Script executed:
#!/bin/bash
# Read scheduling-base.js to see init() signature
cat -n ghost/core/core/server/adapters/scheduling/scheduling-base.js | head -80Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 334
🏁 Script executed:
#!/bin/bash
# Read scheduling-default.js to see init() implementation
cat -n ghost/core/core/server/adapters/scheduling/scheduling-default.jsRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 12796
🏁 Script executed:
#!/bin/bash
# Search for apiUrl usage in scheduling adapters
rg -n "apiUrl" ghost/core/core/server/adapters/scheduling/ -B 2 -A 2Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 8065
🏁 Script executed:
#!/bin/bash
# Read the full scheduling index.js file
cat -n ghost/core/core/server/adapters/scheduling/index.jsRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 537
🏁 Script executed:
#!/bin/bash
# Search for how scheduling module is initialized elsewhere in the codebase
rg -n "scheduling\.init\(" -B 3 -A 3 ghost/core/Repository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 484
🏁 Script executed:
#!/bin/bash
# Check post-scheduling module entry point
cat -n ghost/core/core/server/adapters/scheduling/post-scheduling/index.jsRepository: qodo-benchmark/Ghost-combined-coderabbit
Length of output: 2005
scheduling.init() must receive apiUrl parameter or initialization will fail.
The adapter requires apiUrl in its constructor (see PostScheduler.js line 9-10). Calling scheduling.init() with no arguments will cause a runtime error: IncorrectUsageError: post-scheduling: no apiUrl was provided. This must be passed through the options parameter when initializing.
🤖 Prompt for AI Agents
In `@ghost/core/core/boot.js` around lines 367 - 368, scheduling.init() is being
called without the required apiUrl and thus PostScheduler's constructor throws;
fix by passing the apiUrl through the options when calling scheduling.init —
e.g., call scheduling.init({ apiUrl: /* provide same apiUrl used elsewhere (eg.
from existing options or config) */ }) so the PostScheduler (PostScheduler
constructor) receives apiUrl during initialization.
Benchmark PR from qodo-benchmark#226
Summary by CodeRabbit
Removed Features
Tests
✏️ Tip: You can customize this high-level summary in your review settings.