Completed
Push — master ( a673ca...8720a3 )
by Alexander
02:27
created

BugsRevisionLogPlugin::getRevisionData()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.6666
cc 2
eloc 5
nc 2
nop 1
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 11
	public function __construct(LogMessageParser $log_message_parser)
47
	{
48 11
		$this->_logMessageParser = $log_message_parser;
49 11
	}
50
51
	/**
52
	 * Returns plugin name.
53
	 *
54
	 * @return string
55
	 */
56 2
	public function getName()
57
	{
58 2
		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 revisions.
113
	 *
114
	 * @param array $revisions Revisions.
115
	 *
116
	 * @return array
117
	 */
118 1
	public function getRevisionsData(array $revisions)
119
	{
120 1
		$results = array();
121
122 1
		foreach ( $revisions as $revision ) {
123 1
			if ( isset($this->_revisionBugs[$revision]) ) {
124 1
				$results[$revision] = $this->_revisionBugs[$revision];
125 1
			}
126 1
		}
127
128 1
		return $this->addMissingResults($revisions, $results);
129
	}
130
131
	/**
132
	 * Returns data, collected by plugin.
133
	 *
134
	 * @return array
135
	 */
136 1
	public function getCollectedData()
137
	{
138
		return array(
139 1
			'revision_bugs' => $this->_revisionBugs,
140 1
			'bug_revisions' => $this->_bugRevisions,
141 1
		);
142
	}
143
144
	/**
145
	 * Initializes plugin using previously collected data.
146
	 *
147
	 * @param array $collected_data Collected data.
148
	 *
149
	 * @return void
150
	 */
151 5
	public function setCollectedData(array $collected_data)
152
	{
153 5
		$this->_revisionBugs = $collected_data['revision_bugs'];
154 5
		$this->_bugRevisions = $collected_data['bug_revisions'];
155 5
	}
156
157
	/**
158
	 * Returns cache invalidator for this plugin data.
159
	 *
160
	 * @return string
161
	 */
162 2
	public function getCacheInvalidator()
163
	{
164 2
		return self::CACHE_FORMAT_VERSION;
165
	}
166
167
	/**
168
	 * Returns last known revision number.
169
	 *
170
	 * @return integer
171
	 */
172 2
	public function getLastRevision()
173
	{
174 2
		if ( !$this->_revisionBugs ) {
175 1
			return null;
176
		}
177
178 1
		end($this->_revisionBugs);
179
180 1
		return key($this->_revisionBugs);
181
	}
182
183
}
184