Skip to content

SLOP-397: port dead PageContentSaveComplete/TitleMoveComplete hooks to PageSaveComplete/PageMoveComplete - #14

Open
tosfos wants to merge 1 commit into
masterfrom
SLOP-397-port-modern-hooks
Open

SLOP-397: port dead PageContentSaveComplete/TitleMoveComplete hooks to PageSaveComplete/PageMoveComplete#14
tosfos wants to merge 1 commit into
masterfrom
SLOP-397-port-modern-hooks

Conversation

@tosfos

@tosfos tosfos commented Aug 23, 2026

Copy link
Copy Markdown

Fixes SLOP-397 (hook half of SLOP-379).

Problem

extension.json registers PageContentSaveComplete and TitleMoveComplete. Both hooks were replaced in MediaWiki 1.35 by PageSaveComplete/PageMoveComplete; on any modern branch the old names never fire. Result: WatchStateRecorder::recordPageChange() silently never runs, so watch-state statistics drift stale after every edit and page move.

A naive rename would still fatal: onTitleMoveComplete() calls the removed Article::newFromID().

Fix

  • Register PageSaveComplete / PageMoveComplete instead of the dead names.
  • onPageSaveComplete( WikiPage $wikipage ): identical first-parameter contract to what PageSaveComplete passes; original body kept unchanged.
  • onPageMoveComplete( LinkTarget $old, LinkTarget $new, UserIdentity $user, $pageid, $redirid, $reason = null ): new hook signature; derives Titles from the passed LinkTargets and replaces Article::newFromID( $id ) with WikiPage::newFromID( $id, WikiPage::READ_LATEST ) (null-guarded).

Verification

  • php -l clean on PHP 7.4-cli and PHP 8.2-cli (dockerized).
  • jq . extension.json — valid JSON after re-registration.
  • Reflection-based harness run under PHP 7.4 and 8.2 asserting:
    • no dead hook names registered; modern names present;
    • onPageMoveComplete parameter order matches how MW 1.35+ invokes the hook (old,new,user,pageid,redirid,reason) with no by-reference params and $reason optional;
    • onPageSaveComplete accepts a typed WikiPage;
    • no Article::newFromID() call remains.
    • Before/after proof: harness FAILs against unfixed master ("dead hook 'TitleMoveComplete' still registered"), PASSes on this branch.

Risk

Low. Handlers only touch the same tables as before (watch_tracking_*, watchlist). Behavior on pre-1.35 branches changes (new hooks don't exist there), consistent with the rest of this audit's 1.39-targeted fixes.

…o PageSaveComplete/PageMoveComplete

PageContentSaveComplete and TitleMoveComplete were replaced in MW 1.35 by
PageSaveComplete/PageMoveComplete and never fire on modern branches, so
watch-state tracking silently stopped on every edit/move. Register the
modern hook names and port the handlers:

- onPageSaveComplete: same WikiPage-typed signature; original body kept.
- onPageMoveComplete: new signature (LinkTarget $old, LinkTarget $new,
  UserIdentity $user, $pageid, $redirid, $reason); replaces removed
  Article::newFromID() with WikiPage::newFromID() and derives Titles from
  the passed LinkTargets.

Fixes SLOP-397 (also covers the hook half of SLOP-379).
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f67bae70-49a9-4e85-a11d-086e35c87b10


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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.

1 participant