From: Duarte Meneses Date: Wed, 26 Jan 2022 21:56:47 +0000 (-0600) Subject: SONAR-15870 Xoo SCM should support relative dates X-Git-Tag: 9.4.0.54424~256 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ca4aa60e6e087819e2c1445ef49b8c5ab8e82b76;p=sonarqube.git SONAR-15870 Xoo SCM should support relative dates --- diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/scm/XooBlameCommand.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/scm/XooBlameCommand.java index de432850089..7ca8de85846 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/scm/XooBlameCommand.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/scm/XooBlameCommand.java @@ -65,30 +65,37 @@ public class XooBlameCommand extends BlameCommand { } private static List readFile(File inputStream) throws IOException { + Date now = new Date(); try (CSVParser csvParser = CSVFormat.RFC4180 .withIgnoreEmptyLines() .withIgnoreSurroundingSpaces() .parse(new FileReader(inputStream))) { List records = csvParser.getRecords(); return records.stream() - .map(XooBlameCommand::convertToBlameLine) + .map(r -> convertToBlameLine(now, r)) .collect(toList()); } } - private static BlameLine convertToBlameLine(CSVRecord csvRecord) { + private static BlameLine convertToBlameLine(Date now, CSVRecord csvRecord) { checkState(csvRecord.size() >= 3, "Not enough fields on line %s", csvRecord); String revision = trimToNull(csvRecord.get(0)); String author = trimToNull(csvRecord.get(1)); BlameLine blameLine = new BlameLine().revision(revision).author(author); String dateStr = trimToNull(csvRecord.get(2)); if (dateStr != null) { - Date dateTime = DateUtils.parseDateTimeQuietly(dateStr); - if (dateTime != null) { - blameLine.date(dateTime); - } else { - // Will throw an exception, when date is not in format "yyyy-MM-dd" - blameLine.date(DateUtils.parseDate(dateStr)); + // try to load a relative number of days + try { + int days = Integer.parseInt(dateStr); + blameLine.date(DateUtils.addDays(now, days)); + } catch (NumberFormatException e) { + Date dateTime = DateUtils.parseDateTimeQuietly(dateStr); + if (dateTime != null) { + blameLine.date(dateTime); + } else { + // Will throw an exception, when date is not in format "yyyy-MM-dd" + blameLine.date(DateUtils.parseDate(dateStr)); + } } } return blameLine; diff --git a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/scm/XooBlameCommandTest.java b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/scm/XooBlameCommandTest.java index 645bc7baca0..cf8cc068353 100644 --- a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/scm/XooBlameCommandTest.java +++ b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/scm/XooBlameCommandTest.java @@ -22,11 +22,15 @@ package org.sonar.xoo.scm; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.function.Predicate; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.mockito.ArgumentCaptor; import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.batch.fs.internal.TestInputFileBuilder; @@ -37,6 +41,8 @@ import org.sonar.api.utils.DateUtils; import org.sonar.xoo.Xoo; import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -79,6 +85,33 @@ public class XooBlameCommandTest { new BlameLine().revision("234").author("julien").date(DateUtils.parseDate("2014-12-24")))); } + @Test + public void testBlameWithRelativeDate() throws IOException { + File source = new File(baseDir, "src/foo.xoo"); + FileUtils.write(source, "sample content"); + File scm = new File(baseDir, "src/foo.xoo.scm"); + FileUtils.write(scm, "123,julien,-10\n234,julien,-10"); + DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/foo.xoo") + .setLanguage(Xoo.KEY) + .setModuleBaseDir(baseDir.toPath()) + .build(); + fs.add(inputFile); + BlameOutput result = mock(BlameOutput.class); + when(input.filesToBlame()).thenReturn(Arrays.asList(inputFile)); + + new XooBlameCommand().blame(input, result); + + Predicate datePredicate = argument -> { + Date approximate = DateUtils.addDays(new Date(), -10); + return argument.getTime() > approximate.getTime() - 5000 && argument.getTime() < approximate.getTime() + 5000; + }; + ArgumentCaptor> blameLinesCaptor = ArgumentCaptor.forClass(List.class); + verify(result).blameResult(eq(inputFile), blameLinesCaptor.capture()); + assertThat(blameLinesCaptor.getValue()) + .extracting(BlameLine::date) + .allMatch(datePredicate); + } + @Test public void blame_containing_author_with_comma() throws IOException { File source = new File(baseDir, "src/foo.xoo");