Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
52.46% covered (warning)
52.46%
32 / 61
60.00% covered (warning)
60.00%
3 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
MergeLogFormatter
53.33% covered (warning)
53.33%
32 / 60
60.00% covered (warning)
60.00%
3 / 5
30.18
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getPreloadTitles
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getMessageParameters
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 getActionLinks
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
30
 getParametersForApi
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2/**
3 * Formatter for merge log entries.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
19 *
20 * @file
21 * @license GPL-2.0-or-later
22 * @since 1.25
23 */
24
25namespace MediaWiki\Logging;
26
27use MediaWiki\Message\Message;
28use MediaWiki\SpecialPage\SpecialPage;
29use MediaWiki\Title\MalformedTitleException;
30use MediaWiki\Title\Title;
31use MediaWiki\Title\TitleParser;
32
33/**
34 * This class formats merge log entries.
35 *
36 * @since 1.25
37 */
38class MergeLogFormatter extends LogFormatter {
39    private TitleParser $titleParser;
40
41    public function __construct(
42        LogEntry $entry,
43        TitleParser $titleParser
44    ) {
45        parent::__construct( $entry );
46        $this->titleParser = $titleParser;
47    }
48
49    public function getPreloadTitles() {
50        $params = $this->extractParameters();
51
52        try {
53            return [ $this->titleParser->parseTitle( $params[3] ) ];
54        } catch ( MalformedTitleException ) {
55        }
56        return [];
57    }
58
59    protected function getMessageParameters() {
60        $params = parent::getMessageParameters();
61        $oldname = $this->makePageLink( $this->entry->getTarget(), [ 'redirect' => 'no' ] );
62        $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
63        $params[2] = Message::rawParam( $oldname );
64        $params[3] = Message::rawParam( $newname );
65        $params[4] = $this->context->getLanguage()
66            ->userTimeAndDate( $params[4], $this->context->getUser() );
67        return $params;
68    }
69
70    public function getActionLinks() {
71        if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
72            || !$this->context->getAuthority()->isAllowed( 'mergehistory' )
73        ) {
74            return '';
75        }
76
77        // Show unmerge link
78        $params = $this->extractParameters();
79
80        if ( $this->entry->getSubtype() === 'merge-into' ) {
81            // merge-into entry lives at the destination page
82            $target = $this->entry->getTarget()->getPrefixedDBkey(); // dest
83            $dest   = $params[3];                                   // src
84        } else {
85            // regular merge entry lives at the source page
86            $target = $params[3];                                   // dest
87            $dest   = $this->entry->getTarget()->getPrefixedDBkey(); // src
88        }
89
90        if ( isset( $params[5] ) ) {
91            $mergePoint = $params[4] . "|" . $params[5];
92        } else {
93            // This is an old log entry from before we recorded the revid separately
94            $mergePoint = $params[4];
95        }
96        $revert = $this->getLinkRenderer()->makeKnownLink(
97            SpecialPage::getTitleFor( 'MergeHistory' ),
98            $this->msg( 'revertmerge' )->text(),
99            [],
100            [
101                'target' => $target,
102                'dest' => $dest,
103                'mergepoint' => $mergePoint,
104                'submitted' => 1 // show the revisions immediately
105            ]
106        );
107
108        return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
109    }
110
111    protected function getParametersForApi() {
112        $entry = $this->entry;
113        $params = $entry->getParameters();
114
115        // Use a different label when the subtype is "merge-into"
116        static $mapMerge = [
117            '4:title:dest',
118            '5:timestamp:mergepoint',
119            '4::dest'                => '4:title:dest',
120            '5::mergepoint'  => '5:timestamp:mergepoint',
121            '6::mergerevid',
122        ];
123        static $mapMergeInto = [
124            '4:title:src',
125            '5:timestamp:mergepoint',
126            '4::src'                 => '4:title:src',
127            '5::mergepoint'  => '5:timestamp:mergepoint',
128            '6::mergerevid',
129        ];
130
131        $map = $entry->getSubtype() === 'merge-into' ? $mapMergeInto : $mapMerge;
132
133        foreach ( $map as $index => $key ) {
134            if ( isset( $params[$index] ) ) {
135                $params[$key] = $params[$index];
136                unset( $params[$index] );
137            }
138        }
139
140        return $params;
141    }
142}
143
144/** @deprecated class alias since 1.44 */
145class_alias( MergeLogFormatter::class, 'MergeLogFormatter' );