Skip to content

Commit eaaa408

Browse files
author
Alexander Obuhovich
committed
Improve commit message format + add tests
1 parent e36323c commit eaaa408

File tree

2 files changed

+256
-23
lines changed

2 files changed

+256
-23
lines changed

src/SVNBuddy/Repository/CommitMessageBuilder.php

+40-23
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function __construct(
6565
*
6666
* @return string
6767
*/
68-
public function build($wc_path, $changelist, array $recent_conflicts)
68+
public function build($wc_path, $changelist = null, array $recent_conflicts = array())
6969
{
7070
/*
7171
* 3. if it's In-Portal project, then:
@@ -79,37 +79,53 @@ public function build($wc_path, $changelist, array $recent_conflicts)
7979
* 4. open interactive editor with auto-generated message
8080
*/
8181

82-
$commit_message = '';
82+
$commit_message_parts = array();
8383

8484
if ( strlen($changelist) ) {
85-
$commit_message .= $changelist . PHP_EOL;
85+
$commit_message_parts[] = trim($changelist);
8686
}
8787

88+
$commit_message_parts[] = $this->getFragmentForMergedRevisions($wc_path);
89+
$commit_message_parts[] = $this->getFragmentForRecentConflicts($recent_conflicts);
90+
91+
return implode(PHP_EOL, array_filter($commit_message_parts));
92+
}
93+
94+
/**
95+
* Returns commit message fragment for merged revisions.
96+
*
97+
* @param string $wc_path Working copy path.
98+
*
99+
* @return string
100+
*/
101+
protected function getFragmentForMergedRevisions($wc_path)
102+
{
88103
$merged_revisions = $this->getFreshMergedRevisions($wc_path);
89104

90-
if ( $merged_revisions ) {
91-
$wc_url = $this->repositoryConnector->getWorkingCopyUrl($wc_path);
92-
$repository_url = $this->repositoryConnector->getRootUrl($wc_url);
105+
if ( !$merged_revisions ) {
106+
return '';
107+
}
93108

94-
foreach ( $merged_revisions as $path => $revisions ) {
95-
$merged_messages = array();
96-
$revision_log = $this->revisionLogFactory->getRevisionLog($repository_url . $path);
97-
$commit_message .= $this->getCommitMessageHeading($wc_url, $path) . PHP_EOL;
109+
$ret = '';
110+
$wc_url = $this->repositoryConnector->getWorkingCopyUrl($wc_path);
111+
$repository_url = $this->repositoryConnector->getRootUrl($wc_url);
98112

99-
$revisions_data = $revision_log->getRevisionsData('summary', $revisions);
113+
foreach ( $merged_revisions as $path => $revisions ) {
114+
$merged_messages = array();
115+
$revision_log = $this->revisionLogFactory->getRevisionLog($repository_url . $path);
116+
$ret .= PHP_EOL . $this->getCommitMessageHeading($wc_url, $path) . PHP_EOL;
100117

101-
foreach ( $revisions as $revision ) {
102-
$merged_messages[] = ' * r' . $revision . ': ' . $revisions_data[$revision]['msg'];
103-
}
118+
$revisions_data = $revision_log->getRevisionsData('summary', $revisions);
104119

105-
$merged_messages = array_unique(array_map('trim', $merged_messages));
106-
$commit_message .= implode(PHP_EOL, $merged_messages) . PHP_EOL;
120+
foreach ( $revisions as $revision ) {
121+
$merged_messages[] = ' * r' . $revision . ': ' . $revisions_data[$revision]['msg'];
107122
}
108-
}
109123

110-
$commit_message .= $this->getCommitMessageConflicts($recent_conflicts);
124+
$merged_messages = array_unique(array_map('trim', $merged_messages));
125+
$ret .= implode(PHP_EOL, $merged_messages) . PHP_EOL;
126+
}
111127

112-
return rtrim($commit_message);
128+
return trim($ret);
113129
}
114130

115131
/**
@@ -190,22 +206,23 @@ protected function getCommitMessageHeading($wc_url, $path)
190206
}
191207

192208
/**
193-
* Returns recent merge conflicts.
209+
* Returns commit message fragment for recent conflicts.
194210
*
195211
* @param array $recent_conflicts Recent conflicts.
196212
*
197213
* @return string
198214
*/
199-
protected function getCommitMessageConflicts(array $recent_conflicts)
215+
protected function getFragmentForRecentConflicts(array $recent_conflicts)
200216
{
201217
if ( !$recent_conflicts ) {
202218
return '';
203219
}
204220

205-
$ret = PHP_EOL . 'Conflicts:' . PHP_EOL;
221+
// Ensure empty line before.
222+
$ret = PHP_EOL . 'Conflicts:';
206223

207224
foreach ( $recent_conflicts as $conflict_path ) {
208-
$ret .= ' * ' . $conflict_path . PHP_EOL;
225+
$ret .= PHP_EOL . ' * ' . $conflict_path;
209226
}
210227

211228
return $ret;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
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 <aik.bold@gmail.com>
8+
* @link https://github.com/console-helpers/svn-buddy
9+
*/
10+
11+
namespace Tests\ConsoleHelpers\SVNBuddy\Repository;
12+
13+
14+
use ConsoleHelpers\SVNBuddy\Repository\CommitMessageBuilder;
15+
use Prophecy\Argument;
16+
use Prophecy\Prophecy\ObjectProphecy;
17+
18+
class CommitMessageBuilderTest extends \PHPUnit_Framework_TestCase
19+
{
20+
21+
/**
22+
* Repository connector.
23+
*
24+
* @var ObjectProphecy
25+
*/
26+
protected $connector;
27+
28+
/**
29+
* Revision log factory
30+
*
31+
* @var ObjectProphecy
32+
*/
33+
protected $revisionLogFactory;
34+
35+
/**
36+
* Commit message builder.
37+
*
38+
* @var CommitMessageBuilder
39+
*/
40+
protected $commitMessageBuilder;
41+
42+
protected function setUp()
43+
{
44+
parent::setUp();
45+
46+
$this->connector = $this->prophesize('ConsoleHelpers\SVNBuddy\Repository\Connector\Connector');
47+
48+
$revision_list_parser = $this->prophesize('ConsoleHelpers\SVNBuddy\Repository\Parser\RevisionListParser');
49+
$revision_list_parser->expandRanges(Argument::cetera())->willReturnArgument(0);
50+
51+
$this->revisionLogFactory = $this->prophesize(
52+
'ConsoleHelpers\SVNBuddy\Repository\RevisionLog\RevisionLogFactory'
53+
);
54+
55+
$this->commitMessageBuilder = new CommitMessageBuilder(
56+
$this->connector->reveal(),
57+
$revision_list_parser->reveal(),
58+
$this->revisionLogFactory->reveal()
59+
);
60+
}
61+
62+
public function testBuildWithoutChangelist()
63+
{
64+
$merge_info = '/projects/project-name/trunk:10,15' . PHP_EOL;
65+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', 'BASE')->willReturn($merge_info);
66+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', null)->willReturn($merge_info);
67+
68+
$this->assertEmpty($this->commitMessageBuilder->build('/path/to/working-copy'));
69+
}
70+
71+
public function testBuildWithChangelist()
72+
{
73+
$merge_info = '/projects/project-name/trunk:10,15' . PHP_EOL;
74+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', 'BASE')->willReturn($merge_info);
75+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', null)->willReturn($merge_info);
76+
77+
$this->assertEquals('cl name', $this->commitMessageBuilder->build('/path/to/working-copy', 'cl name'));
78+
}
79+
80+
public function testBuildMergeResult()
81+
{
82+
$this->prepareMergeResult();
83+
84+
$expected = <<<COMMIT_MSG
85+
Merging from Trunk to Stable
86+
* r18: a-line1
87+
a-line2
88+
* r33: b-line1
89+
b-line2
90+
91+
Merging from Branch-name to Stable
92+
* r4: c-line1
93+
c-line2
94+
COMMIT_MSG;
95+
96+
$this->assertEquals($expected, $this->commitMessageBuilder->build('/path/to/working-copy'));
97+
}
98+
99+
public function testBuildWithConflicts()
100+
{
101+
$merge_info = '/projects/project-name/trunk:10,15' . PHP_EOL;
102+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', 'BASE')->willReturn($merge_info);
103+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', null)->willReturn($merge_info);
104+
105+
$expected = <<<COMMIT_MSG
106+
107+
Conflicts:
108+
* sub-folder/file1.txt
109+
* file2.ext
110+
COMMIT_MSG;
111+
112+
$this->assertEquals(
113+
$expected,
114+
$this->commitMessageBuilder->build(
115+
'/path/to/working-copy',
116+
null,
117+
array(
118+
'sub-folder/file1.txt',
119+
'file2.ext',
120+
)
121+
)
122+
);
123+
}
124+
125+
public function testBuildEverythingPresent()
126+
{
127+
$this->prepareMergeResult();
128+
129+
$expected = <<<COMMIT_MSG
130+
cl one
131+
Merging from Trunk to Stable
132+
* r18: a-line1
133+
a-line2
134+
* r33: b-line1
135+
b-line2
136+
137+
Merging from Branch-name to Stable
138+
* r4: c-line1
139+
c-line2
140+
141+
Conflicts:
142+
* sub-folder/file1.txt
143+
* file2.ext
144+
COMMIT_MSG;
145+
146+
$this->assertEquals(
147+
$expected,
148+
$this->commitMessageBuilder->build(
149+
'/path/to/working-copy',
150+
'cl one',
151+
array(
152+
'sub-folder/file1.txt',
153+
'file2.ext',
154+
)
155+
)
156+
);
157+
}
158+
159+
protected function prepareMergeResult()
160+
{
161+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', 'BASE')->willReturn(
162+
'/projects/project-name/trunk:10,15' . PHP_EOL
163+
);
164+
$this->connector->getProperty('svn:mergeinfo', '/path/to/working-copy', null)->willReturn(
165+
'/projects/project-name/trunk:10,15,18,33' . PHP_EOL .
166+
'/projects/project-name/branches/branch-name:4' . PHP_EOL
167+
);
168+
169+
$this->connector
170+
->getWorkingCopyUrl('/path/to/working-copy')
171+
->willReturn('svn://repository.com/path/to/project/tags/stable');
172+
173+
$this->connector
174+
->getRootUrl('svn://repository.com/path/to/project/tags/stable')
175+
->willReturn('svn://repository.com');
176+
177+
$revision_log1 = $this->getRevisionLog('svn://repository.com/projects/project-name/trunk');
178+
$revision_log1->getRevisionsData('summary', array(18, 33))->willReturn(array(
179+
18 => array(
180+
'author' => 'user1',
181+
'date' => 3534535353,
182+
'msg' => 'a-line1' . PHP_EOL . 'a-line2' . PHP_EOL . PHP_EOL,
183+
),
184+
33 => array(
185+
'author' => 'user2',
186+
'date' => 35345445353,
187+
'msg' => 'b-line1' . PHP_EOL . 'b-line2' . PHP_EOL . PHP_EOL,
188+
),
189+
));
190+
191+
$revision_log2 = $this->getRevisionLog('svn://repository.com/projects/project-name/branches/branch-name');
192+
$revision_log2->getRevisionsData('summary', array(4))->willReturn(array(
193+
4 => array(
194+
'author' => 'user2',
195+
'date' => 35345444353,
196+
'msg' => 'c-line1' . PHP_EOL . 'c-line2' . PHP_EOL . PHP_EOL,
197+
),
198+
));
199+
}
200+
201+
/**
202+
* Returns revision log object for given url.
203+
*
204+
* @param string $repository_url Repository url.
205+
*
206+
* @return ObjectProphecy
207+
*/
208+
protected function getRevisionLog($repository_url)
209+
{
210+
$revision_log = $this->prophesize('ConsoleHelpers\SVNBuddy\Repository\RevisionLog\RevisionLog');
211+
$this->revisionLogFactory->getRevisionLog($repository_url)->willReturn($revision_log);
212+
213+
return $revision_log;
214+
}
215+
216+
}

0 commit comments

Comments
 (0)