Skip to content

Commit

Permalink
Merge branch 'master' into add-cypress-tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ckcherry23 committed Jan 22, 2024
2 parents 7695300 + 4ef7210 commit 643c6c5
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 110 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ RepoSense is a contribution analysis tool for Git repositories. It is particular
- [User Guide for the latest `master` (not yet released to users)](https://reposense.github.io/RepoSense)

---
### Our Contributors :
<a href="https://github.com/reposense/RepoSense/graphs/contributors">
<img src="https://contrib.rocks/image?repo=reposense/RepoSense" />
</a>

**Acknowledgements**: The web previews of RepoSense is powered by Netlify and Surge.

Expand Down
12 changes: 6 additions & 6 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

141 changes: 76 additions & 65 deletions src/main/java/reposense/parser/ArgsParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ public class ArgsParser {
private static final String MESSAGE_INVALID_CONFIG_JSON = "%s Ignoring the report config provided.";
private static final String MESSAGE_SINCE_D1_WITH_PERIOD = "You may be using --since d1 with the --period flag. "
+ "This may result in an incorrect date range being analysed.";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE =
"\"Since Date\" cannot be later than \"Until Date\".";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE =
"\"Since Date\" must not be later than today's date.";
private static final Path EMPTY_PATH = Paths.get("");
private static final Path DEFAULT_CONFIG_PATH = Paths.get(System.getProperty("user.dir")
+ File.separator + "config" + File.separator);
Expand Down Expand Up @@ -258,76 +262,78 @@ private static ArgumentParser getArgumentParser() {
* @throws ParseException if the given string arguments fails to parse to a {@link CliArguments} object.
*/
public static CliArguments parse(String[] args) throws HelpScreenException, ParseException {
ArgumentParser parser = getArgumentParser();
Namespace results;

try {
ArgumentParser parser = getArgumentParser();
Namespace results = parser.parseArgs(args);

Path configFolderPath = results.get(CONFIG_FLAGS[0]);
Path reportFolderPath = results.get(VIEW_FLAGS[0]);
Path outputFolderPath = results.get(OUTPUT_FLAGS[0]);
ZoneId zoneId = results.get(TIMEZONE_FLAGS[0]);
Path assetsFolderPath = results.get(ASSETS_FLAGS[0]);
List<String> locations = results.get(REPO_FLAGS[0]);
List<FileType> formats = FileType.convertFormatStringsToFileTypes(results.get(FORMAT_FLAGS[0]));
boolean isStandaloneConfigIgnored = results.get(IGNORE_CONFIG_FLAGS[0]);
boolean isFileSizeLimitIgnored = results.get(IGNORE_SIZELIMIT_FLAGS[0]);
boolean shouldIncludeLastModifiedDate = results.get(LAST_MODIFIED_DATE_FLAGS[0]);
boolean shouldPerformShallowCloning = results.get(SHALLOW_CLONING_FLAGS[0]);
boolean shouldFindPreviousAuthors = results.get(FIND_PREVIOUS_AUTHORS_FLAGS[0]);
boolean isTestMode = results.get(TEST_MODE_FLAG[0]);
int numCloningThreads = results.get(CLONING_THREADS_FLAG[0]);
int numAnalysisThreads = results.get(ANALYSIS_THREADS_FLAG[0]);

CliArguments.Builder cliArgumentsBuilder = new CliArguments.Builder()
.configFolderPath(configFolderPath)
.reportDirectoryPath(reportFolderPath)
.outputFilePath(outputFolderPath)
.zoneId(zoneId)
.assetsFilePath(assetsFolderPath)
.locations(locations)
.formats(formats)
.isStandaloneConfigIgnored(isStandaloneConfigIgnored)
.isFileSizeLimitIgnored(isFileSizeLimitIgnored)
.isLastModifiedDateIncluded(shouldIncludeLastModifiedDate)
.isShallowCloningPerformed(shouldPerformShallowCloning)
.isFindingPreviousAuthorsPerformed(shouldFindPreviousAuthors)
.numCloningThreads(numCloningThreads)
.numAnalysisThreads(numAnalysisThreads)
.isTestMode(isTestMode);

LogsManager.setLogFolderLocation(outputFolderPath);

if (locations == null && configFolderPath.equals(DEFAULT_CONFIG_PATH)) {
logger.info(MESSAGE_USING_DEFAULT_CONFIG_PATH);
}
results = parser.parseArgs(args);
} catch (HelpScreenException hse) {
throw hse;
} catch (ArgumentParserException ape) {
throw new ParseException(getArgumentParser().formatUsage() + ape.getMessage() + "\n");
}

Path configFolderPath = results.get(CONFIG_FLAGS[0]);
Path reportFolderPath = results.get(VIEW_FLAGS[0]);
Path outputFolderPath = results.get(OUTPUT_FLAGS[0]);
ZoneId zoneId = results.get(TIMEZONE_FLAGS[0]);
Path assetsFolderPath = results.get(ASSETS_FLAGS[0]);
List<String> locations = results.get(REPO_FLAGS[0]);
List<FileType> formats = FileType.convertFormatStringsToFileTypes(results.get(FORMAT_FLAGS[0]));
boolean isStandaloneConfigIgnored = results.get(IGNORE_CONFIG_FLAGS[0]);
boolean isFileSizeLimitIgnored = results.get(IGNORE_SIZELIMIT_FLAGS[0]);
boolean shouldIncludeLastModifiedDate = results.get(LAST_MODIFIED_DATE_FLAGS[0]);
boolean shouldPerformShallowCloning = results.get(SHALLOW_CLONING_FLAGS[0]);
boolean shouldFindPreviousAuthors = results.get(FIND_PREVIOUS_AUTHORS_FLAGS[0]);
boolean isTestMode = results.get(TEST_MODE_FLAG[0]);
int numCloningThreads = results.get(CLONING_THREADS_FLAG[0]);
int numAnalysisThreads = results.get(ANALYSIS_THREADS_FLAG[0]);

CliArguments.Builder cliArgumentsBuilder = new CliArguments.Builder()
.configFolderPath(configFolderPath)
.reportDirectoryPath(reportFolderPath)
.outputFilePath(outputFolderPath)
.zoneId(zoneId)
.assetsFilePath(assetsFolderPath)
.locations(locations)
.formats(formats)
.isStandaloneConfigIgnored(isStandaloneConfigIgnored)
.isFileSizeLimitIgnored(isFileSizeLimitIgnored)
.isLastModifiedDateIncluded(shouldIncludeLastModifiedDate)
.isShallowCloningPerformed(shouldPerformShallowCloning)
.isFindingPreviousAuthorsPerformed(shouldFindPreviousAuthors)
.numCloningThreads(numCloningThreads)
.numAnalysisThreads(numAnalysisThreads)
.isTestMode(isTestMode);

LogsManager.setLogFolderLocation(outputFolderPath);

if (locations == null && configFolderPath.equals(DEFAULT_CONFIG_PATH)) {
logger.info(MESSAGE_USING_DEFAULT_CONFIG_PATH);
}

addReportConfigToBuilder(cliArgumentsBuilder, results);
addAnalysisDatesToBuilder(cliArgumentsBuilder, results);
addReportConfigToBuilder(cliArgumentsBuilder, results);
addAnalysisDatesToBuilder(cliArgumentsBuilder, results);

boolean isViewModeOnly = reportFolderPath != null
&& !reportFolderPath.equals(EMPTY_PATH)
&& configFolderPath.equals(DEFAULT_CONFIG_PATH)
&& locations == null;
cliArgumentsBuilder.isViewModeOnly(isViewModeOnly);
boolean isViewModeOnly = reportFolderPath != null
&& !reportFolderPath.equals(EMPTY_PATH)
&& configFolderPath.equals(DEFAULT_CONFIG_PATH)
&& locations == null;
cliArgumentsBuilder.isViewModeOnly(isViewModeOnly);

boolean isAutomaticallyLaunching = reportFolderPath != null;
if (isAutomaticallyLaunching && !reportFolderPath.equals(EMPTY_PATH) && !isViewModeOnly) {
logger.info(String.format("Ignoring argument '%s' for --view.", reportFolderPath.toString()));
}
cliArgumentsBuilder.isAutomaticallyLaunching(isAutomaticallyLaunching);
boolean isAutomaticallyLaunching = reportFolderPath != null;
if (isAutomaticallyLaunching && !reportFolderPath.equals(EMPTY_PATH) && !isViewModeOnly) {
logger.info(String.format("Ignoring argument '%s' for --view.", reportFolderPath.toString()));
}
cliArgumentsBuilder.isAutomaticallyLaunching(isAutomaticallyLaunching);


boolean shouldPerformFreshCloning = isTestMode
? results.get(FRESH_CLONING_FLAG[0])
: DEFAULT_SHOULD_FRESH_CLONE;
cliArgumentsBuilder.isFreshClonePerformed(shouldPerformFreshCloning);
boolean shouldPerformFreshCloning = isTestMode
? results.get(FRESH_CLONING_FLAG[0])
: DEFAULT_SHOULD_FRESH_CLONE;
cliArgumentsBuilder.isFreshClonePerformed(shouldPerformFreshCloning);

return cliArgumentsBuilder.build();
} catch (HelpScreenException hse) {
throw hse;
} catch (ArgumentParserException ape) {
throw new ParseException(getArgumentParser().formatUsage() + ape.getMessage() + "\n");
}
return cliArgumentsBuilder.build();
}

/**
Expand Down Expand Up @@ -420,8 +426,13 @@ private static void addAnalysisDatesToBuilder(CliArguments.Builder builder, Name
? untilDate
: currentDate;

TimeUtil.verifySinceDateIsValid(sinceDate, currentDate);
TimeUtil.verifyDatesRangeIsCorrect(sinceDate, untilDate);
if (sinceDate.compareTo(currentDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);
}

if (sinceDate.compareTo(untilDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);
}

builder.sinceDate(sinceDate)
.isSinceDateProvided(isSinceDateProvided)
Expand Down
19 changes: 9 additions & 10 deletions src/main/java/reposense/parser/RepoConfigCsvParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,20 +114,19 @@ protected void processLine(List<RepoConfiguration> results, CSVRecord record) th

// If file diff limit is specified
if (fileSizeLimitStringList.size() > 0) {
String fileSizeLimitString = fileSizeLimitStringList.get(0).trim();
int parseValue;

if (isFileSizeLimitIgnored) {
logger.warning("Ignoring file size limit column since file size limit is ignored");
isFileSizeLimitOverriding = false;
} else if (!StringsUtil.isNumeric(fileSizeLimitString)
|| (parseValue = Integer.parseInt(fileSizeLimitString)) <= 0) {
logger.warning(String.format("Values in \"%s\" column should be positive integers.",
FILESIZE_LIMIT_HEADER[0]));
isFileSizeLimitOverriding = false;
} else {
String fileSizeLimitString = fileSizeLimitStringList.get(0).trim();
int parseValue;
if (!StringsUtil.isNumeric(fileSizeLimitString)
|| (parseValue = Integer.parseInt(fileSizeLimitString)) <= 0) {
logger.warning(String.format("Values in \"%s\" column should be positive integers.",
FILESIZE_LIMIT_HEADER[0]));
isFileSizeLimitOverriding = false;
} else {
fileSizeLimit = parseValue;
}
fileSizeLimit = parseValue;
}
}

Expand Down
29 changes: 0 additions & 29 deletions src/main/java/reposense/util/TimeUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import reposense.parser.ParseException;
import reposense.parser.SinceDateArgumentType;
import reposense.system.LogsManager;

Expand All @@ -23,10 +22,6 @@ public class TimeUtil {

// "uuuu" is used for year since "yyyy" does not work with ResolverStyle.STRICT
private static final DateTimeFormatter CLI_ARGS_DATE_FORMAT = DateTimeFormatter.ofPattern("d/M/uuuu HH:mm:ss");
private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE =
"\"Since Date\" cannot be later than \"Until Date\".";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE =
"\"Since Date\" must not be later than today's date.";

private static final String EARLIEST_VALID_DATE = "1970-01-01T00:00:00";
private static final String LATEST_VALID_DATE = "2099-12-31T23:59:59";
Expand Down Expand Up @@ -168,30 +163,6 @@ public static boolean isEqualToArbitraryFirstDateConverted(LocalDateTime dateTim
return dateTime.equals(getArbitraryFirstCommitDateConverted(zoneId));
}

/**
* Verifies that {@code sinceDate} is earlier than {@code untilDate}.
*
* @throws ParseException if {@code sinceDate} supplied is later than {@code untilDate}.
*/
public static void verifyDatesRangeIsCorrect(LocalDateTime sinceDate, LocalDateTime untilDate)
throws ParseException {
if (sinceDate.compareTo(untilDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);
}
}

/**
* Verifies that {@code sinceDate} is no later than the date of report generation, given by {@code currentDate}.
*
* @throws ParseException if {@code sinceDate} supplied is later than date of report generation.
*/
public static void verifySinceDateIsValid(LocalDateTime sinceDate, LocalDateTime currentDate)
throws ParseException {
if (sinceDate.compareTo(currentDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);
}
}

/**
* Extracts the first substring of {@code date} string that matches the {@code DATE_FORMAT_REGEX}.
*/
Expand Down
31 changes: 31 additions & 0 deletions src/test/java/reposense/parser/ArgsParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;

Expand Down Expand Up @@ -606,6 +607,36 @@ public void sinceDate_laterThanUntilDate_throwsParseException() {
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void sinceDate_laterThanCurrentDate_throwsParseException() {
LocalDateTime tomorrowDateTime = LocalDateTime.now()
.plusDays(1L);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String tomorrow = tomorrowDateTime.format(formatter);


String input = DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)
.build();
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void sinceDate_beforeUntilDateAndLaterThanCurrentDate_throwsParseException() {
LocalDateTime tomorrowDateTime = LocalDateTime.now()
.plusDays(1L);
LocalDateTime dayAfterDateTime = LocalDateTime.now()
.plusDays(2L);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String tomorrow = tomorrowDateTime.format(formatter);
String dayAfter = dayAfterDateTime.format(formatter);

String input = DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)
.addUntilDate(dayAfter)
.build();
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void period_withBothSinceDateAndUntilDate_throwsParseException() {
String input = DEFAULT_INPUT_BUILDER.addPeriod("18d")
Expand Down

0 comments on commit 643c6c5

Please sign in to comment.