Skip to content

Comments

Removed xmlrpc/pingomatic ping service#25

Open
tomerqodo wants to merge 2 commits intocoderabbit_combined_20260121_augment_sentry_coderabbit_1_base_removed_xmlrpc_pingomatic_ping_service_pr226from
coderabbit_combined_20260121_augment_sentry_coderabbit_1_head_removed_xmlrpc_pingomatic_ping_service_pr226
Open

Removed xmlrpc/pingomatic ping service#25
tomerqodo wants to merge 2 commits intocoderabbit_combined_20260121_augment_sentry_coderabbit_1_base_removed_xmlrpc_pingomatic_ping_service_pr226from
coderabbit_combined_20260121_augment_sentry_coderabbit_1_head_removed_xmlrpc_pingomatic_ping_service_pr226

Conversation

@tomerqodo
Copy link

@tomerqodo tomerqodo commented Jan 21, 2026

Benchmark PR from qodo-benchmark#226

Summary by CodeRabbit

  • Removed Features

    • Removed XML-RPC service and related functionality from the platform.
    • Removed the privacy.useRpcPing configuration option.
  • Tests

    • Removed unit tests for the XML-RPC service.

✏️ Tip: You can customize this high-level summary in your review settings.

betschki and others added 2 commits January 21, 2026 15:49
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.
@coderabbitai
Copy link

coderabbitai bot commented Jan 21, 2026

Walkthrough

The 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 privacy.useRpcPing configuration property.

Changes

Cohort / File(s) Summary
Core service initialization
ghost/core/core/boot.js
Removed xmlrpc service initialization; simplified scheduling initialization by removing config parameter; reorganized emailAddressService.init() into concurrent execution; removed explicit .listen() calls for xmlrpc and slack; added npm install note.
XMLRPC service removal
ghost/core/core/server/services/xmlrpc.js
Entire file deleted (134 lines). Removes listen() export, xmlrpcListener, ping functionality, and all XMLRPC event handling logic.
Configuration cleanup
ghost/core/core/shared/config/env/config.development.json
Removed privacy.useRpcPing configuration property.
XMLRPC test removal
ghost/core/test/unit/server/services/xmlrpc.test.js
Entire test file deleted (277 lines). Removes all unit tests covering XMLRPC ping behavior, error handling, event binding, HTTP interactions, and privacy configuration checks.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 The XMLRPC hops away today,
No more pings in the code's ballet,
Tests and configs, cleaned with care,
Boot now simpler, light as air! 🎉

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'Removed xmlrpc/pingomatic ping service' accurately and concisely describes the main changes across all modified files, which involve removing the xmlrpc service, its tests, and related configuration.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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: Keep emailAddressService initialization 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

📥 Commits

Reviewing files that changed from the base of the PR and between 9ab2e10 and 33b6fe0.

📒 Files selected for processing (4)
  • ghost/core/core/boot.js
  • ghost/core/core/server/services/xmlrpc.js
  • ghost/core/core/shared/config/env/config.development.json
  • ghost/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.

Comment on lines 314 to 320
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');
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

rg -n "services/slack|slack\.listen\(|slack\.init\(" -g "*.js" -C 2

Repository: 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 -50

Repository: 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 5

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 157


🏁 Script executed:

fd -t f "slack" ghost/core/server/services/ 2>/dev/null | head -20

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 66


🏁 Script executed:

ls -la ghost/core/server/services/ | grep slack

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 158


🏁 Script executed:

find ghost/core/server/services -name "*slack*" -type f 2>/dev/null

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 66


🏁 Script executed:

rg "require\(['\"]\./server/services/slack" ghost/core/core/boot.js -A 5 -B 5

Repository: 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 -10

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 526


🏁 Script executed:

git ls-files "ghost/core*" | grep -E "(slack|services)" | head -20

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 1211


🏁 Script executed:

ls -la ghost/core/core/server/services/ | grep slack

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 212


🏁 Script executed:

find ghost/core/core/server/services -name "*slack*" -type f

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 124


🏁 Script executed:

cat -n ghost/core/core/server/services/slack-notifications/index.js | head -50

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 129


🏁 Script executed:

ls -la ghost/core/core/server/services/slack* -d

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 274


🏁 Script executed:

cat -n ghost/core/core/server/services/slack.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 8776


🏁 Script executed:

rg "slack\.listen\(\)" -g "*.js" --no-heading

Repository: 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 -20

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 66


🏁 Script executed:

cat -n ghost/core/core/server/services/slack-notifications/index.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 129


🏁 Script executed:

cat -n ghost/core/core/server/services/slack-notifications/service.js | head -100

Repository: 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 -10

Repository: 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).

Comment on lines 367 to +368
webhooks.listen(),
scheduling.init({
apiUrl: urlUtils.urlFor('api', {type: 'admin'}, true)
}),
scheduling.init(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Locate scheduling adapter implementation and inspect init signature/usage
fd -a "scheduling" server | head -20

Repository: 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 -20

Repository: 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 3

Repository: 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 -20

Repository: 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 -80

Repository: 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.js

Repository: 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 2

Repository: 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.js

Repository: 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.js

Repository: 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants