aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/sonar-svn-plugin
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2014-10-03 14:36:33 +0200
committerJulien HENRY <julien.henry@sonarsource.com>2014-10-03 14:36:33 +0200
commitaf44423a58b896f43b8149b6ea746aeb4e1cd290 (patch)
tree7656f29845787ecb3eef9a824b72f40f8877e010 /plugins/sonar-svn-plugin
parenta1634e27e30064ef2b6d507b0818e115ae1f5229 (diff)
downloadsonarqube-af44423a58b896f43b8149b6ea746aeb4e1cd290.tar.gz
sonarqube-af44423a58b896f43b8149b6ea746aeb4e1cd290.zip
SONAR-5643 Properly handle cases where there are local modification on files
Diffstat (limited to 'plugins/sonar-svn-plugin')
-rw-r--r--plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java2
-rw-r--r--plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameConsumer.java11
-rw-r--r--plugins/sonar-svn-plugin/src/test/java/org/sonar/plugins/scm/svn/SvnBlameCommandTest.java29
-rw-r--r--plugins/sonar-svn-plugin/src/test/resources/blame-with-uncomitted-changes.xml25
4 files changed, 64 insertions, 3 deletions
diff --git a/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java b/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java
index 11fbf2b9f91..8f668141c76 100644
--- a/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java
+++ b/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java
@@ -81,7 +81,7 @@ public class SvnBlameCommand implements BlameCommand, BatchComponent {
public Void call() {
String filename = inputFile.relativePath();
Command cl = createCommandLine(fs.baseDir(), filename);
- SvnBlameConsumer consumer = new SvnBlameConsumer();
+ SvnBlameConsumer consumer = new SvnBlameConsumer(filename);
StringStreamConsumer stderr = new StringStreamConsumer();
int exitCode = execute(cl, consumer, stderr);
diff --git a/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameConsumer.java b/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameConsumer.java
index 525f3651048..b0ca1932fb2 100644
--- a/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameConsumer.java
+++ b/plugins/sonar-svn-plugin/src/main/java/org/sonar/plugins/scm/svn/SvnBlameConsumer.java
@@ -70,12 +70,15 @@ public class SvnBlameConsumer implements StreamConsumer {
private List<BlameLine> lines = new ArrayList<BlameLine>();
- public SvnBlameConsumer() {
+ private final String filename;
+
+ public SvnBlameConsumer(String filename) {
+ this.filename = filename;
dateFormat = new SimpleDateFormat(SVN_TIMESTAMP_PATTERN);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
- private int lineNumber;
+ private int lineNumber = 0;
private String revision;
@@ -85,6 +88,9 @@ public class SvnBlameConsumer implements StreamConsumer {
public void consumeLine(String line) {
Matcher matcher;
if ((matcher = LINE_PATTERN.matcher(line)).find()) {
+ if (lineNumber != 0) {
+ throw new IllegalStateException("Unable to blame file " + filename + ". No blame info at line " + lineNumber + ". Is file commited?");
+ }
String lineNumberStr = matcher.group(1);
lineNumber = Integer.parseInt(lineNumberStr);
}
@@ -99,6 +105,7 @@ public class SvnBlameConsumer implements StreamConsumer {
String time = matcher.group(2);
Date dateTime = parseDateTime(date + " " + time);
lines.add(new BlameLine(dateTime, revision, author));
+ lineNumber = 0;
}
}
diff --git a/plugins/sonar-svn-plugin/src/test/java/org/sonar/plugins/scm/svn/SvnBlameCommandTest.java b/plugins/sonar-svn-plugin/src/test/java/org/sonar/plugins/scm/svn/SvnBlameCommandTest.java
index 7b07dac96ce..a54bd9ba85f 100644
--- a/plugins/sonar-svn-plugin/src/test/java/org/sonar/plugins/scm/svn/SvnBlameCommandTest.java
+++ b/plugins/sonar-svn-plugin/src/test/java/org/sonar/plugins/scm/svn/SvnBlameCommandTest.java
@@ -98,6 +98,35 @@ public class SvnBlameCommandTest {
}
@Test
+ public void shouldFailIfFileContainsLocalModification() throws IOException {
+ File source = new File(baseDir, "src/foo.xoo");
+ FileUtils.write(source, "sample content");
+ DefaultInputFile inputFile = new DefaultInputFile("foo", "src/foo.xoo").setAbsolutePath(new File(baseDir, "src/foo.xoo").getAbsolutePath());
+ fs.add(inputFile);
+
+ BlameResult result = mock(BlameResult.class);
+ CommandExecutor commandExecutor = mock(CommandExecutor.class);
+
+ when(commandExecutor.execute(any(Command.class), any(StreamConsumer.class), any(StreamConsumer.class), anyLong())).thenAnswer(new Answer<Integer>() {
+
+ @Override
+ public Integer answer(InvocationOnMock invocation) throws Throwable {
+ StreamConsumer outConsumer = (StreamConsumer) invocation.getArguments()[1];
+ List<String> lines = FileUtils.readLines(new File("src/test/resources/blame-with-uncomitted-changes.xml"), "UTF-8");
+ for (String line : lines) {
+ outConsumer.consumeLine(line);
+ }
+ return 0;
+ }
+ });
+
+ thrown.expect(IllegalStateException.class);
+ thrown.expectMessage("Unable to blame file src/foo.xoo. No blame info at line 2. Is file commited?");
+
+ new SvnBlameCommand(commandExecutor, mock(SvnConfiguration.class)).blame(fs, Arrays.<InputFile>asList(inputFile), result);
+ }
+
+ @Test
public void testExecutionError() throws IOException {
File source = new File(baseDir, "src/foo.xoo");
FileUtils.write(source, "sample content");
diff --git a/plugins/sonar-svn-plugin/src/test/resources/blame-with-uncomitted-changes.xml b/plugins/sonar-svn-plugin/src/test/resources/blame-with-uncomitted-changes.xml
new file mode 100644
index 00000000000..76fcdc4b98e
--- /dev/null
+++ b/plugins/sonar-svn-plugin/src/test/resources/blame-with-uncomitted-changes.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blame>
+<target
+ path="pom.xml">
+<entry
+ line-number="1">
+<commit
+ revision="9491">
+<author>simon.brandhof</author>
+<date>2009-04-18T10:29:59.077093Z</date>
+</commit>
+</entry>
+<entry
+ line-number="2">
+</entry>
+<entry
+ line-number="3">
+<commit
+ revision="10558">
+<author>david</author>
+<date>2009-08-31T22:32:17.361675Z</date>
+</commit>
+</entry>
+</target>
+</blame>