refactor `IvyDependencyUpdateChecker`

This commit is contained in:
Eric Milles 2025-09-04 10:03:34 -05:00
parent af6502084f
commit 3a865956d8
Failed to extract signature
4 changed files with 106 additions and 112 deletions

View File

@ -17,8 +17,6 @@
*/
package org.apache.ivy.ant;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
@ -30,61 +28,98 @@ import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.resolve.IvyNode;
import org.apache.ivy.core.resolve.ResolveOptions;
import org.apache.tools.ant.BuildException;
import static org.apache.ivy.util.StringUtils.splitToArray;
public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
private String revisionToCheck = "latest.integration";
private boolean download = false;
private boolean checkIfChanged = false;
private boolean showTransitive = false;
private String revisionToCheck = "latest.integration";
public boolean isDownload() {
return download;
}
public void setDownload(boolean download) {
this.download = download;
}
public boolean isCheckIfChanged() {
return checkIfChanged;
}
public void setCheckIfChanged(boolean checkIfChanged) {
this.checkIfChanged = checkIfChanged;
}
public boolean isShowTransitive() {
return showTransitive;
}
public void setShowTransitive(boolean showTransitive) {
this.showTransitive = showTransitive;
}
public String getRevisionToCheck() {
return revisionToCheck;
}
public void setRevisionToCheck(String revisionToCheck) {
this.revisionToCheck = revisionToCheck;
}
//--------------------------------------------------------------------------
@Override
public void doExecute() throws BuildException {
prepareAndCheck();
ModuleDescriptor originalModuleDescriptor = getResolvedReport().getModuleDescriptor();
// clone module descriptor
DefaultModuleDescriptor latestModuleDescriptor = new DefaultModuleDescriptor(
originalModuleDescriptor.getModuleRevisionId(),
originalModuleDescriptor.getStatus(), originalModuleDescriptor.getPublicationDate());
// copy configurations
for (Configuration configuration : originalModuleDescriptor.getConfigurations()) {
latestModuleDescriptor.addConfiguration(configuration);
}
// clone dependency and add new one with the requested revisionToCheck
for (DependencyDescriptor dependencyDescriptor : originalModuleDescriptor.getDependencies()) {
ModuleRevisionId upToDateMrid = ModuleRevisionId.newInstance(
dependencyDescriptor.getDependencyRevisionId(), revisionToCheck);
latestModuleDescriptor.addDependency(dependencyDescriptor.clone(upToDateMrid));
}
// resolve
ResolveOptions resolveOptions = new ResolveOptions();
resolveOptions.setCheckIfChanged(checkIfChanged);
resolveOptions.setConfs(splitToArray(getConf()));
resolveOptions.setDownload(isDownload());
resolveOptions.setLog(getLog());
resolveOptions.setConfs(splitToArray(getConf()));
resolveOptions.setCheckIfChanged(checkIfChanged);
ResolveReport latestReport;
try {
latestReport = getIvyInstance().getResolveEngine().resolve(latestModuleDescriptor,
resolveOptions);
ResolveReport latestReport = getIvyInstance().getResolveEngine()
.resolve(createModuleDescriptorForRevisionToCheck(), resolveOptions);
displayDependencyUpdates(getResolvedReport(), latestReport);
if (showTransitive) {
displayNewDependencyOnLatest(getResolvedReport(), latestReport);
displayMissingDependencyOnLatest(getResolvedReport(), latestReport);
}
} catch (ParseException | IOException e) {
} catch (Exception e) {
throw new BuildException("impossible to resolve dependencies:\n\t" + e, e);
}
}
private ModuleDescriptor createModuleDescriptorForRevisionToCheck() {
ModuleDescriptor moduleDescriptor = getResolvedReport().getModuleDescriptor();
// clone module descriptor
DefaultModuleDescriptor latestModuleDescriptor = new DefaultModuleDescriptor(
moduleDescriptor.getModuleRevisionId(), moduleDescriptor.getStatus(), moduleDescriptor.getPublicationDate());
// copy configurations
for (Configuration configuration : moduleDescriptor.getConfigurations()) {
latestModuleDescriptor.addConfiguration(configuration);
}
// clone direct dependencies with the requested revisionToCheck
for (DependencyDescriptor dependencyDescriptor : moduleDescriptor.getDependencies()) {
ModuleRevisionId upToDateMrid = ModuleRevisionId.newInstance(
dependencyDescriptor.getDependencyRevisionId(), revisionToCheck);
latestModuleDescriptor.addDependency(dependencyDescriptor.clone(upToDateMrid));
}
return latestModuleDescriptor;
}
private void displayDependencyUpdates(ResolveReport originalReport, ResolveReport latestReport) {
@ -118,8 +153,7 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
}
}
private void displayMissingDependencyOnLatest(ResolveReport originalReport,
ResolveReport latestReport) {
private void displayMissingDependencyOnLatest(ResolveReport originalReport, ResolveReport latestReport) {
List<ModuleRevisionId> listOfMissingDependencyOnLatest = new ArrayList<>();
for (IvyNode originalDependency : originalReport.getDependencies()) {
boolean dependencyFound = false;
@ -141,8 +175,7 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
}
}
private void displayNewDependencyOnLatest(ResolveReport originalReport,
ResolveReport latestReport) {
private void displayNewDependencyOnLatest(ResolveReport originalReport, ResolveReport latestReport) {
List<ModuleRevisionId> listOfNewDependencyOnLatest = new ArrayList<>();
for (IvyNode latest : latestReport.getDependencies()) {
boolean dependencyFound = false;
@ -162,36 +195,4 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
}
}
}
public String getRevisionToCheck() {
return revisionToCheck;
}
public void setRevisionToCheck(String revisionToCheck) {
this.revisionToCheck = revisionToCheck;
}
public boolean isDownload() {
return download;
}
public void setDownload(boolean download) {
this.download = download;
}
public boolean isShowTransitive() {
return showTransitive;
}
public void setShowTransitive(boolean showTransitive) {
this.showTransitive = showTransitive;
}
public boolean isCheckIfChanged() {
return checkIfChanged;
}
public void setCheckIfChanged(boolean checkIfChanged) {
this.checkIfChanged = checkIfChanged;
}
}

View File

@ -54,8 +54,8 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
dependencyUpdateChecker.setProject(project);
}
@After
public void tearDown() {
@After
public void tearDown() {
TestHelper.cleanCache();
}
@ -137,8 +137,7 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
*/
@Test(expected = BuildException.class)
public void testFailure() {
dependencyUpdateChecker
.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure.xml"));
dependencyUpdateChecker.execute();
}
@ -150,8 +149,7 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
expExc.expect(BuildException.class);
expExc.expectMessage("unknown");
dependencyUpdateChecker
.setFile(new File("test/java/org/apache/ivy/ant/ivy-simple.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-simple.xml"));
dependencyUpdateChecker.setConf("default,unknown");
dependencyUpdateChecker.execute();
}
@ -161,8 +159,7 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
*/
@Test(expected = BuildException.class)
public void testFailureOnBadDependencyIvyFile() {
dependencyUpdateChecker.setFile(new File(
"test/java/org/apache/ivy/ant/ivy-failure2.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure2.xml"));
dependencyUpdateChecker.execute();
}
@ -171,15 +168,13 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
*/
@Test(expected = BuildException.class)
public void testFailureOnBadStatusInDependencyIvyFile() {
dependencyUpdateChecker.setFile(new File(
"test/java/org/apache/ivy/ant/ivy-failure3.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure3.xml"));
dependencyUpdateChecker.execute();
}
@Test
public void testHaltOnFailure() {
dependencyUpdateChecker
.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-failure.xml"));
dependencyUpdateChecker.setHaltonfailure(false);
dependencyUpdateChecker.execute();
}
@ -190,10 +185,8 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
dependencyUpdateChecker.setConf("*,!default");
dependencyUpdateChecker.execute();
// assertTrue(getIvyFileInCache(ModuleRevisionId.newInstance("org1", "mod1.1", "2.0"))
// .exists());
// assertFalse(getIvyFileInCache(ModuleRevisionId.newInstance("org1", "mod1.2", "2.0"))
// .exists());
// assertTrue(getIvyFileInCache(ModuleRevisionId.newInstance("org1", "mod1.1", "2.0")).exists());
// assertFalse(getIvyFileInCache(ModuleRevisionId.newInstance("org1", "mod1.2", "2.0")).exists());
assertLogContaining("Dependencies updates available :");
assertLogContaining("All dependencies are up to date");
@ -213,8 +206,7 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
dependencyUpdateChecker.getProject().setProperty("ivy.dep.file", ivyFile.getAbsolutePath());
dependencyUpdateChecker.execute();
// assertTrue(getResolvedIvyFileInCache(
// ModuleRevisionId.newInstance("apache", "resolve-simple", "1.0")).exists());
// assertTrue(getResolvedIvyFileInCache(ModuleRevisionId.newInstance("apache", "resolve-simple", "1.0")).exists());
}
/**
@ -228,8 +220,7 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
"test/java/org/apache/ivy/ant/ivy-simple.xml");
dependencyUpdateChecker.execute();
// assertTrue(getResolvedIvyFileInCache(
// ModuleRevisionId.newInstance("apache", "resolve-simple", "1.0")).exists());
// assertTrue(getResolvedIvyFileInCache(ModuleRevisionId.newInstance("apache", "resolve-simple", "1.0")).exists());
assertLogContaining("Dependencies updates available :");
assertLogContaining("org1#mod1.2\t2.0 -> 2.2");
@ -237,26 +228,28 @@ public class IvyDependencyUpdateCheckerTest extends AntTaskTestCase {
@Test
public void testSimpleExtends() {
dependencyUpdateChecker.setFile(new File(
"test/java/org/apache/ivy/ant/ivy-extends-multiconf.xml"));
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-extends-multiconf.xml"));
dependencyUpdateChecker.execute();
assertEquals("1", dependencyUpdateChecker.getProject().getProperty("ivy.parents.count"));
assertEquals("apache",
dependencyUpdateChecker.getProject().getProperty("ivy.parent[0].organisation"));
assertEquals("resolve-simple",
dependencyUpdateChecker.getProject().getProperty("ivy.parent[0].module"));
assertEquals("1.0",
dependencyUpdateChecker.getProject().getProperty("ivy.parent[0].revision"));
assertNull(dependencyUpdateChecker.getProject().getProperty("ivy.parent[0].branch"));
assertLogContaining("Dependencies updates available :");
Project project = dependencyUpdateChecker.getProject();
assertEquals("1", project.getProperty("ivy.parents.count"));
assertEquals("apache", project.getProperty("ivy.parent[0].organisation"));
assertEquals("resolve-simple", project.getProperty("ivy.parent[0].module"));
assertEquals("1.0", project.getProperty("ivy.parent[0].revision"));
assertNull(project.getProperty("ivy.parent[0].branch"));
assertLogContaining("Dependencies updates available");
// ivy-extends-multiconf.xml declares org1:mod1.1:1.1
assertLogContaining("org1#mod1.1\t1.1 -> 2.0");
assertLogContaining("org1#mod1.1\t1.0 -> 2.0");
assertLogContaining("org1#mod1.2\t2.1 -> 2.2");
assertLogContaining("org2#mod2.1\t0.3 -> 0.7");
// inherited from parent
// ivy-multiconf.xml declares org1:mod1.1:2.0 -- no update available
assertLogNotContaining("org1#mod1.1\t2.0");
// ivy-multiconf.xml declares org1:mod1.2:2.0
assertLogContaining("org1#mod1.2\t2.0 -> 2.2");
// ivy-extends-multiconf.xml declares org2:mod2.1:0.3
assertLogContaining("org2#mod2.1\t0.3 -> 0.7");
// org2:mod2.1:0.3 ivy.xml declares org1:mod1.1:1.0
assertLogContaining("org1#mod1.1\t1.0 -> 2.0");
// org1:mod1.1:2.0 ivy.xml declares org1:mod1.2:2.1
assertLogContaining("org1#mod1.2\t2.1 -> 2.2");
}
}

View File

@ -15,13 +15,13 @@
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
under the License.
-->
<ivy-module version="2.0">
<ivy-module version="2.0">
<info organisation="apache" module="resolve-extends" revision="1.2" status="release">
<!-- <extends organisation="apache" module="resolve-simple" revision="1.0" location="./ivy-multiconf.xml"/> -->
<!-- description inherited from parent -->
<description>Demonstrates configuration-specific dependencies</description>
</info>
@ -37,10 +37,10 @@
</configurations>
<publications/>
<dependencies>
<!-- not in parent -->
<dependency org="org2" name="mod2.1" rev="0.3" conf="default"/>
<dependency org="org2" name="mod2.1" rev="0.3" conf="default->compile(default)"/>
<!-- overrides parent -->
<dependency org="org1" name="mod1.1" rev="1.1" conf="default,compile->default" transitive="false"/>
@ -49,4 +49,4 @@
<dependency org="org1" name="mod1.1" rev="2.0" transitive="false" conf="compile->default"/>
</dependencies>
</ivy-module>
</ivy-module>

View File

@ -14,9 +14,9 @@
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
under the License.
-->
<ivy-module version="2.0">
<ivy-module version="2.0">
<info module="resolve-extends">
<extends organisation="apache" module="resolve-simple" revision="latest.integration" location="./ivy-multiconf.xml"/>
@ -33,9 +33,9 @@
<dependencies>
<!-- not in parent -->
<dependency org="org2" name="mod2.1" rev="0.3" conf="default" />
<dependency org="org2" name="mod2.1" rev="0.3" conf="default->compile(default)" />
<!-- overrides parent -->
<dependency org="org1" name="mod1.1" rev="1.1" conf="default,compile->default" transitive="false" />
</dependencies>
</ivy-module>
</ivy-module>