4 * Remove a revision tag from edits and log entries it was applied to.
8 use MediaWiki\Storage\NameTableAccessException
;
10 // @codeCoverageIgnoreStart
11 require_once __DIR__
. '/Maintenance.php';
12 // @codeCoverageIgnoreEnd
14 class DeleteTag
extends Maintenance
{
15 public function __construct() {
16 parent
::__construct();
17 $this->addDescription( 'Deletes a change tag' );
18 $this->addArg( 'tag name', 'Name of the tag to delete' );
19 $this->setBatchSize( 500 );
22 public function execute() {
23 $dbw = $this->getPrimaryDB();
24 $services = $this->getServiceContainer();
25 $defStore = $services->getChangeTagDefStore();
27 $tag = $this->getArg( 0 );
29 $tagId = $defStore->getId( $tag );
30 } catch ( NameTableAccessException
$ex ) {
31 $this->fatalError( "Tag '$tag' not found" );
34 $status = ChangeTags
::canDeleteTag( $tag, null, ChangeTags
::BYPASS_MAX_USAGE_CHECK
);
35 if ( !$status->isOK() ) {
36 $this->fatalError( $status );
39 $this->output( "Deleting tag '$tag'...\n" );
41 // Make the tag impossible to add by users while we're deleting it and drop the
42 // usage counter to zero
43 $dbw->newUpdateQueryBuilder()
44 ->update( 'change_tag_def' )
46 'ctd_user_defined' => 0,
49 ->where( [ 'ctd_id' => $tagId ] )
50 ->caller( __METHOD__
)->execute();
51 ChangeTags
::purgeTagCacheAll();
53 // Iterate over change_tag, deleting rows in batches
56 $ids = $dbw->newSelectQueryBuilder()
58 ->from( 'change_tag' )
59 ->where( [ 'ct_tag_id' => $tagId ] )
60 ->limit( $this->getBatchSize() )
61 ->caller( __METHOD__
)
67 $dbw->newDeleteQueryBuilder()
68 ->deleteFrom( 'change_tag' )
69 ->where( [ 'ct_id' => $ids ] )
70 ->caller( __METHOD__
)->execute();
71 $count +
= $dbw->affectedRows();
72 $this->output( "$count\n" );
73 $this->waitForReplication();
75 $this->output( "The tag has been removed from $count revisions, deleting the tag itself...\n" );
77 ChangeTags
::deleteTagEverywhere( $tag );
78 $this->output( "Done.\n" );
82 // @codeCoverageIgnoreStart
83 $maintClass = DeleteTag
::class;
84 require_once RUN_MAINTENANCE_IF_MAIN
;
85 // @codeCoverageIgnoreEnd