Failed Conditions
Push — master ( 30a496...e276e6 )
by Alexander
02:31
created

BugsRevisionLogPlugin::getCacheInvalidator()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2
Metric Value
dl 0
loc 4
ccs 0
cts 0
cp 0
rs 10
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * This file is part of the SVN-Buddy library.
4
 * For the full copyright and license information, please view
5
 * the LICENSE file that was distributed with this source code.
6
 *
7
 * @copyright Alexander Obuhovich <[email protected]>
8
 * @link      https://github.com/console-helpers/svn-buddy
9
 */
10
11
namespace ConsoleHelpers\SVNBuddy\Repository\RevisionLog;
12
13
14
use ConsoleHelpers\SVNBuddy\Repository\Parser\LogMessageParser;
15
16
class BugsRevisionLogPlugin extends AbstractRevisionLogPlugin
17
{
18
	const CACHE_FORMAT_VERSION = 1;
19
20
	/**
21
	 * Bugs affected by specific revision.
22
	 *
23
	 * @var array
24
	 */
25
	private $_revisionBugs = array();
26
27
	/**
28
	 * Revisions affecting a specific bug.
29
	 *
30
	 * @var array
31
	 */
32
	private $_bugRevisions = array();
33
34
	/**
35
	 * Log message parser.
36
	 *
37
	 * @var LogMessageParser
38
	 */
39
	private $_logMessageParser;
40
41
	/**
42
	 * Creates bugs revision log plugin.
43
	 *
44
	 * @param LogMessageParser $log_message_parser Log message parser.
45
	 */
46 12
	public function __construct(LogMessageParser $log_message_parser)
47
	{
48 12
		$this->_logMessageParser = $log_message_parser;
49 12
	}
50
51
	/**
52
	 * Returns plugin name.
53
	 *
54
	 * @return string
55
	 */
56 3
	public function getName()
57
	{
58 3
		return 'bugs';
59
	}
60
61
	/**
62
	 * Parse log entries.
63
	 *
64
	 * @param \SimpleXMLElement $log Log.
65
	 *
66
	 * @return void
67
	 */
68 1
	public function parse(\SimpleXMLElement $log)
69
	{
70 1
		foreach ( $log->logentry as $log_entry ) {
71 1
			$revision = (int)$log_entry['revision'];
72 1
			$this->_revisionBugs[$revision] = $this->_logMessageParser->parse((string)$log_entry->msg);
73
74 1
			foreach ( $this->_revisionBugs[$revision] as $bug_id ) {
75 1
				if ( !isset($this->_bugRevisions[$bug_id]) ) {
76 1
					$this->_bugRevisions[$bug_id] = array();
77 1
				}
78
79 1
				$this->_bugRevisions[$bug_id][] = $revision;
80 1
			}
81 1
		}
82 1
	}
83
84
	/**
85
	 * Find revisions by collected data.
86
	 *
87
	 * @param array $criteria Criteria.
88
	 *
89
	 * @return array
90
	 */
91 4
	public function find(array $criteria)
92
	{
93 4
		$bug_revisions = array();
94
95 4
		foreach ( $criteria as $bug_id ) {
96 3
			if ( !array_key_exists($bug_id, $this->_bugRevisions) ) {
97 1
				continue;
98
			}
99
100 2
			foreach ( $this->_bugRevisions[$bug_id] as $revision ) {
101 2
				$bug_revisions[$revision] = true;
102 2
			}
103 4
		}
104
105 4
		$bug_revisions = array_keys($bug_revisions);
106 4
		sort($bug_revisions, SORT_NUMERIC);
107
108 4
		return $bug_revisions;
109
	}
110
111
	/**
112
	 * Returns information about revision.
113
	 *
114
	 * @param integer $revision Revision.
115
	 *
116
	 * @return array
117
	 * @throws \InvalidArgumentException When revision is not found.
118
	 */
119 2
	public function getRevisionData($revision)
120
	{
121 2
		if ( !isset($this->_revisionBugs[$revision]) ) {
122 1
			$error_msg = 'Revision "%s" not found by "%s" plugin.';
123 1
			throw new \InvalidArgumentException(sprintf($error_msg, $revision, $this->getName()));
124
		}
125
126 1
		return $this->_revisionBugs[$revision];
127
	}
128
129
	/**
130
	 * Returns information about revisions.
131
	 *
132
	 * @param array $revisions Revisions.
133
	 *
134 1
	 * @return array
135
	 */
136
	public function getRevisionsData(array $revisions)
137 1
	{
138 1
		$results = array();
139 1
140
		foreach ( $revisions as $revision ) {
141
			if ( isset($this->_revisionBugs[$revision]) ) {
142
				$results[$revision] = $this->_revisionBugs[$revision];
143
			}
144
		}
145
146
		return $this->addMissingResults($revisions, $results);
147
	}
148
149 5
	/**
150
	 * Returns data, collected by plugin.
151 5
	 *
152 5
	 * @return array
153 5
	 */
154
	public function getCollectedData()
155
	{
156
		return array(
157
			'revision_bugs' => $this->_revisionBugs,
158
			'bug_revisions' => $this->_bugRevisions,
159
		);
160 2
	}
161
162 2
	/**
163
	 * Initializes plugin using previously collected data.
164
	 *
165
	 * @param array $collected_data Collected data.
166
	 *
167
	 * @return void
168
	 */
169
	public function setCollectedData(array $collected_data)
170 2
	{
171
		$this->_revisionBugs = $collected_data['revision_bugs'];
172 2
		$this->_bugRevisions = $collected_data['bug_revisions'];
173 1
	}
174
175
	/**
176 1
	 * Returns cache invalidator for this plugin data.
177
	 *
178 1
	 * @return string
179
	 */
180
	public function getCacheInvalidator()
181
	{
182
		return self::CACHE_FORMAT_VERSION;
183
	}
184
185
	/**
186
	 * Returns last known revision number.
187
	 *
188
	 * @return integer
189
	 */
190
	public function getLastRevision()
191
	{
192
		if ( !$this->_revisionBugs ) {
193
			return null;
194
		}
195
196
		end($this->_revisionBugs);
197
198
		return key($this->_revisionBugs);
199
	}
200
201
}
202