diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-03 14:36:33 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-03 14:36:33 +0200 |
commit | af44423a58b896f43b8149b6ea746aeb4e1cd290 (patch) | |
tree | 7656f29845787ecb3eef9a824b72f40f8877e010 /plugins/sonar-svn-plugin | |
parent | a1634e27e30064ef2b6d507b0818e115ae1f5229 (diff) | |
download | sonarqube-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')
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> |