From 5e6d2ff0b10951d3f33b75beb07cb99302401a74 Mon Sep 17 00:00:00 2001 From: Arshan Dabirsiaghi Date: Sat, 23 Nov 2024 13:22:51 -0500 Subject: [PATCH] dont throw an exception if maven deps cant be found --- .../io/codemodder/DefaultCodemodExecutor.java | 10 ++++- .../DefaultCodemodExecutorTest.java | 42 +++++++++++++++++-- .../plugins/maven/MavenProvider.java | 3 +- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/framework/codemodder-base/src/main/java/io/codemodder/DefaultCodemodExecutor.java b/framework/codemodder-base/src/main/java/io/codemodder/DefaultCodemodExecutor.java index 75c3afed2..1e3e31026 100644 --- a/framework/codemodder-base/src/main/java/io/codemodder/DefaultCodemodExecutor.java +++ b/framework/codemodder-base/src/main/java/io/codemodder/DefaultCodemodExecutor.java @@ -15,6 +15,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; @@ -184,7 +185,14 @@ public CodeTFResult execute(final List filePaths) { Collection deps = projectProviders.stream() .flatMap( - provider -> provider.getAllDependencies(projectDir, filePath).stream()) + provider -> { + try { + return provider.getAllDependencies(projectDir, filePath).stream(); + } catch (Exception e) { + log.error("Problem getting dependencies for file {}", filePath, e); + return Stream.empty(); + } + }) .toList(); CodemodInvocationContext context = diff --git a/framework/codemodder-base/src/test/java/io/codemodder/DefaultCodemodExecutorTest.java b/framework/codemodder-base/src/test/java/io/codemodder/DefaultCodemodExecutorTest.java index eb93ce252..b33a4382b 100644 --- a/framework/codemodder-base/src/test/java/io/codemodder/DefaultCodemodExecutorTest.java +++ b/framework/codemodder-base/src/test/java/io/codemodder/DefaultCodemodExecutorTest.java @@ -146,7 +146,7 @@ public DependencyUpdateResult updateDependencies( } @Override - public Collection getAllDependencies(Path projectDir, Path file) { + public Collection getAllDependencies(final Path projectDir, final Path file) { return List.of(); } } @@ -158,7 +158,41 @@ void it_generates_single_codemod_codetf() { // should have just 1 entry because we only scanned javaFile1 List changeset = result.getChangeset(); - assertThat(changeset.size()).isEqualTo(1); + assertThat(changeset).hasSize(1); + assertThat(changeset.get(0)).satisfies(DefaultCodemodExecutorTest::isJavaFile1ChangedCorrectly); + } + + @Test + void it_works_despite_fail_prefetching_all_deps() { + FakeDepsProvider depsProvider = + new FakeDepsProvider() { + @Override + public Collection getAllDependencies( + final Path projectDir, final Path file) { + throw new RuntimeException("failed to prefetch deps"); + } + }; + + executor = + new DefaultCodemodExecutor( + repoDir, + includesEverything, + beforeAfterCodemod, + List.of(depsProvider), + List.of(), + fileCache, + javaParserFacade, + encodingDetector, + -1, + -1, + -1); + + CodeTFResult result = executor.execute(List.of(javaFile1)); + assertThat(result).satisfies(DefaultCodemodExecutorTest::hasBeforeAfterCodemodMetadata); + + // should have just 1 entry because we only scanned javaFile1 + List changeset = result.getChangeset(); + assertThat(changeset).hasSize(1); assertThat(changeset.get(0)).satisfies(DefaultCodemodExecutorTest::isJavaFile1ChangedCorrectly); } @@ -241,7 +275,7 @@ public CodeTFChange onChangeCreated( // confirm the change was updated by the provider List changeset = result.getChangeset(); - assertThat(changeset.size()).isEqualTo(1); + assertThat(changeset).hasSize(1); CodeTFChangesetEntry entry = changeset.get(0); assertThat(entry.getChanges().get(0).getDescription()).isEqualTo("hi " + javaFile1.toString()); assertThat(entry.getChanges().get(0).getProperties()).hasSize(1); @@ -256,7 +290,7 @@ void it_generates_all_files_codemod_codetf() { // should have 2 entries for both javaFile1 and javaFile3 List changeset = result.getChangeset(); - assertThat(changeset.size()).isEqualTo(2); + assertThat(changeset).hasSize(2); assertThat(changeset.get(0)).satisfies(DefaultCodemodExecutorTest::isJavaFile1ChangedCorrectly); assertThat(changeset.get(1)).satisfies(DefaultCodemodExecutorTest::isJavaFile3ChangedCorrectly); } diff --git a/plugins/codemodder-plugin-maven/src/main/java/io/codemodder/plugins/maven/MavenProvider.java b/plugins/codemodder-plugin-maven/src/main/java/io/codemodder/plugins/maven/MavenProvider.java index 16448cfa4..646f5dbf3 100644 --- a/plugins/codemodder-plugin-maven/src/main/java/io/codemodder/plugins/maven/MavenProvider.java +++ b/plugins/codemodder-plugin-maven/src/main/java/io/codemodder/plugins/maven/MavenProvider.java @@ -143,8 +143,9 @@ public Collection getAllDependencies(final Path projectDir, final return pomOperator.getAllFoundDependencies(); } catch (Exception e) { - throw new DependencyUpdateException("Failure when retrieving dependencies", e); + LOG.warn("Not all Maven dependencies could be found", e); } + return Collections.emptyList(); } private static final Logger LOG = LoggerFactory.getLogger(MavenProvider.class);