Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Draft] Introduce an Index-based Package Resolver #43717

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.directory.SingleFileProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.util.ProjectConstants;
import org.wso2.ballerinalang.util.RepoUtils;
import picocli.CommandLine;
Expand Down Expand Up @@ -177,8 +178,11 @@ public BuildCommand() {
@CommandLine.Option(names = "--dump-build-time", description = "calculate and dump build time", hidden = true)
private Boolean dumpBuildTime;

@CommandLine.Option(names = "--sticky", description = "stick to exact versions locked (if exists)")
private Boolean sticky;
@CommandLine.Option(
names = "--update-policy",
description = "update policy for dependency resolution. Options: ${COMPLETION-CANDIDATES}",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

@CommandLine.Option(names = "--target-dir", description = "target directory path")
private Path targetDir;
Expand Down Expand Up @@ -219,8 +223,8 @@ public void execute() {
return;
}

if (sticky == null) {
sticky = false;
if (updatePolicy == null) {
updatePolicy = UpdatePolicy.SOFT;
}

// load project
Expand Down Expand Up @@ -317,7 +321,7 @@ private BuildOptions constructBuildOptions() {
.setDumpRawGraphs(dumpRawGraphs)
.setListConflictedClasses(listConflictedClasses)
.setDumpBuildTime(dumpBuildTime)
.setSticky(sticky)
.setUpdatePolicy(updatePolicy)
.setConfigSchemaGen(configSchemaGen)
.setExportOpenAPI(exportOpenAPI)
.setExportComponentModel(exportComponentModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1200,7 +1200,7 @@ static String getLatestVersion(List<String> versions) {
* @param orgName org name of the dependent package
* @param packageName name of the dependent package
* @param version version of the dependent package
* @param buildOptions build options {sticky, offline}
* @param buildOptions build options
* @return true if the dependent package compilation has errors
*/
static boolean pullDependencyPackages(String orgName, String packageName, String version,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.directory.SingleFileProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.util.ProjectConstants;
import org.wso2.ballerinalang.util.RepoUtils;
import picocli.CommandLine;
Expand Down Expand Up @@ -65,9 +66,9 @@ public class GraphCommand implements BLauncherCmd {
"dependencies.")
private boolean offline;

@CommandLine.Option(names = "--sticky", description = "stick to exact versions locked (if exists)",
defaultValue = "false")
private boolean sticky;
@CommandLine.Option(names = "--update-policy", description = "update policy for dependency resolution",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

public GraphCommand() {
this.projectPath = Path.of(System.getProperty(ProjectConstants.USER_DIR));
Expand All @@ -91,6 +92,10 @@ public void execute() {
return;
}

if (updatePolicy == null) {
updatePolicy = UpdatePolicy.SOFT;
}

try {
loadProject();
} catch (ProjectException e) {
Expand Down Expand Up @@ -152,7 +157,7 @@ private BuildOptions constructBuildOptions() {
.setDumpGraph(dumpGraph)
.setDumpRawGraphs(this.dumpRawGraphs)
.setOffline(this.offline)
.setSticky(this.sticky);
.setUpdatePolicy(this.updatePolicy);

return buildOptionsBuilder.build();
}
Expand All @@ -173,7 +178,7 @@ public void printLongDesc(StringBuilder out) {

@Override
public void printUsage(StringBuilder out) {
out.append(" bal graph [--dump-raw-graph] [--offline] [--sticky] \\n\" +\n" +
out.append(" bal graph [--dump-raw-graph] [--offline] [--update-policy] \\n\" +\n" +
" \" [<ballerina-file | package-path>]");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.ballerina.projects.Project;
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.internal.ProjectDiagnosticErrorCode;
import io.ballerina.projects.util.ProjectConstants;
import io.ballerina.projects.util.ProjectUtils;
Expand Down Expand Up @@ -75,8 +76,11 @@ public class PackCommand implements BLauncherCmd {
@CommandLine.Option(names = "--dump-build-time", hidden = true, description = "calculate and dump build time")
private Boolean dumpBuildTime;

@CommandLine.Option(names = "--sticky", description = "stick to exact versions locked (if exists)")
private Boolean sticky;
@CommandLine.Option(
names = "--update-policy",
description = "update policy for dependency resolution. Options: ${COMPLETION-CANDIDATES}",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

@CommandLine.Option(names = "--target-dir", description = "target directory path")
private Path targetDir;
Expand Down Expand Up @@ -152,8 +156,8 @@ public void execute() {

Project project;

if (sticky == null) {
sticky = false;
if (updatePolicy == null) {
updatePolicy = UpdatePolicy.SOFT;
}

BuildOptions buildOptions = constructBuildOptions();
Expand Down Expand Up @@ -284,7 +288,7 @@ private BuildOptions constructBuildOptions() {
.setDumpGraph(dumpGraph)
.setDumpRawGraphs(dumpRawGraphs)
.setDumpBuildTime(dumpBuildTime)
.setSticky(sticky)
.setUpdatePolicy(updatePolicy)
.setConfigSchemaGen(configSchemaGen)
.setEnableCache(enableCache)
.disableSyntaxTreeCaching(disableSyntaxTreeCaching)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.SemanticVersion;
import io.ballerina.projects.Settings;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.internal.model.Proxy;
import io.ballerina.projects.internal.model.Repository;
import io.ballerina.projects.util.ProjectConstants;
import io.ballerina.projects.util.ProjectUtils;
import org.apache.commons.io.FileUtils;
import org.ballerinalang.central.client.CentralAPIClient;
import org.ballerinalang.central.client.CentralClientConstants;
import org.ballerinalang.central.client.exceptions.CentralClientException;
Expand Down Expand Up @@ -90,8 +90,11 @@ public class PullCommand implements BLauncherCmd {
@CommandLine.Option(names = "--repository")
private String repositoryName;

@CommandLine.Option(names = "--sticky", hidden = true, defaultValue = "true")
private boolean sticky;
@CommandLine.Option(
names = "--update-policy",
description = "update policy for dependency resolution. Options: ${COMPLETION-CANDIDATES}",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

@CommandLine.Option(names = "--offline", hidden = true)
private boolean offline;
Expand Down Expand Up @@ -136,6 +139,10 @@ public void execute() {

System.setProperty(CentralClientConstants.ENABLE_OUTPUT_STREAM, "true");

if (updatePolicy == null) {
updatePolicy = UpdatePolicy.SOFT;
}

String resourceName = argList.get(0);
String orgName;
String packageName;
Expand Down Expand Up @@ -324,7 +331,10 @@ private void pullFromMavenRepo(Settings settings, String orgName, String package
private boolean resolveDependencies(String orgName, String packageName, String version) {
CommandUtil.setPrintStream(errStream);
try {
BuildOptions buildOptions = BuildOptions.builder().setSticky(sticky).setOffline(offline).build();
BuildOptions buildOptions = BuildOptions.builder()
.setUpdatePolicy(updatePolicy)
.setOffline(offline)
.build();
boolean hasCompilationErrors = CommandUtil.pullDependencyPackages(
orgName, packageName, version, buildOptions, repositoryName);
if (hasCompilationErrors) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import io.ballerina.projects.ProjectKind;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.directory.SingleFileProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.internal.model.Target;
import io.ballerina.projects.util.ProjectConstants;
import io.ballerina.projects.util.ProjectUtils;
Expand All @@ -52,6 +53,7 @@

import static io.ballerina.cli.cmd.Constants.RUN_COMMAND;
import static io.ballerina.cli.launcher.LauncherUtils.createLauncherException;
import static io.ballerina.projects.environment.UpdatePolicy.SOFT;
import static io.ballerina.projects.util.ProjectUtils.isProjectUpdated;
import static io.ballerina.runtime.api.constants.RuntimeConstants.SYSTEM_PROP_BAL_DEBUG;

Expand Down Expand Up @@ -100,8 +102,11 @@ public class RunCommand implements BLauncherCmd {
"executable when run is used with a source file or a module.")
private Boolean remoteManagement;

@CommandLine.Option(names = "--sticky", description = "stick to exact versions locked (if exists)")
private Boolean sticky;
@CommandLine.Option(
names = "--update-policy",
description = "update policy for dependency resolution. Options: ${COMPLETION-CANDIDATES}",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

@CommandLine.Option(names = "--dump-graph", description = "Print the dependency graph.", hidden = true)
private boolean dumpGraph;
Expand Down Expand Up @@ -213,8 +218,8 @@ public void execute() {
}
}

if (sticky == null) {
sticky = false;
if (updatePolicy == null) {
updatePolicy = SOFT;
}

if (this.watch) {
Expand Down Expand Up @@ -346,7 +351,7 @@ private BuildOptions constructBuildOptions() {
.setTestReport(false)
.setObservabilityIncluded(observabilityIncluded)
.setRemoteManagement(remoteManagement)
.setSticky(sticky)
.setUpdatePolicy(updatePolicy)
.setDumpGraph(dumpGraph)
.setDumpRawGraphs(dumpRawGraphs)
.setConfigSchemaGen(configSchemaGen)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.directory.SingleFileProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.util.ProjectConstants;
import picocli.CommandLine;

Expand Down Expand Up @@ -182,8 +183,11 @@ public TestCommand() {
@CommandLine.Option(names = "--dump-build-time", description = "calculate and dump build time", hidden = true)
private Boolean dumpBuildTime;

@CommandLine.Option(names = "--sticky", description = "stick to exact versions locked (if exists)")
private Boolean sticky;
@CommandLine.Option(
names = "--update-policy",
description = "update policy for dependency resolution. Options: ${COMPLETION-CANDIDATES}",
defaultValue = "SOFT")
private UpdatePolicy updatePolicy;

@CommandLine.Option(names = "--target-dir", description = "target directory path")
private Path targetDir;
Expand Down Expand Up @@ -247,8 +251,8 @@ public void execute() {
}
}

if (sticky == null) {
sticky = false;
if (updatePolicy == null) {
updatePolicy = UpdatePolicy.SOFT;
}
if (isParallelExecution) {
this.outStream.println("WARNING: Running tests in parallel is an experimental feature");
Expand Down Expand Up @@ -420,7 +424,7 @@ private BuildOptions constructBuildOptions() {
.setTestReport(testReport)
.setObservabilityIncluded(observabilityIncluded)
.setDumpBuildTime(dumpBuildTime)
.setSticky(sticky)
.setUpdatePolicy(updatePolicy)
.setCloud(cloud)
.setDumpGraph(dumpGraph)
.setDumpRawGraphs(dumpRawGraphs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import io.ballerina.projects.SemanticVersion;
import io.ballerina.projects.directory.SingleFileProject;
import io.ballerina.projects.environment.ResolutionOptions;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.internal.PackageDiagnostic;
import io.ballerina.projects.internal.ProjectDiagnosticErrorCode;
import io.ballerina.projects.util.ProjectUtils;
Expand Down Expand Up @@ -297,8 +298,8 @@ private void printWarningForHigherDistribution(Project project) {
warning = "Detected an attempt to compile this package using Swan Lake Update "
+ currentVersionForDiagnostic +
". However, this package was built using Swan Lake Update " + prevVersionForDiagnostic + ".";
if (project.buildOptions().sticky()) {
warning += "\nHINT: Execute the bal command with --sticky=false";
if (project.buildOptions().updatePolicy().equals(UpdatePolicy.LOCKED)) {
warning += "\nHINT: Execute the bal command with --update-policy=SOFT/MEDIUM/HARD";
} else {
warning += " To ensure compatibility, the Dependencies.toml file will be updated with the " +
"latest versions that are compatible with Update " + currentVersionForDiagnostic + ".";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.ballerina.projects.BuildOptions;
import io.ballerina.projects.Project;
import io.ballerina.projects.directory.BuildProject;
import io.ballerina.projects.environment.UpdatePolicy;
import io.ballerina.projects.util.BuildToolUtils;
import org.ballerinalang.test.BCompileUtil;
import org.mockito.MockedStatic;
Expand Down Expand Up @@ -100,7 +101,7 @@ public void testOfflineToolResolution(String projectName, String outputFileName,
throws IOException {
Path projectPath = buildToolResources.resolve(projectName);
Project project = BuildProject.load(projectPath,
BuildOptions.builder().setOffline(true).setSticky(sticky).build());
BuildOptions.builder().setOffline(true).setUpdatePolicy(UpdatePolicy.HARD).build()); // TODO
RunBuildToolsTask runBuildToolsTask = new RunBuildToolsTask(printStream);
try (MockedStatic<BuildToolUtils> repoUtils = Mockito.mockStatic(
BuildToolUtils.class, Mockito.CALLS_REAL_METHODS)) {
Expand Down
4 changes: 4 additions & 0 deletions compiler/ballerina-lang/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ dependencies {
implementation libs.ow2.asm
implementation libs.commons.io
implementation libs.zafarkhaja.jsemver
implementation libs.jgit
implementation (libs.guava) {
exclude group: 'com.google.code.findbugs', module: 'jsr305'
}
testImplementation(libs.guru.nidi.graphviz) {
because("We use this library to execute package resolution tests")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
*/
package io.ballerina.projects;

import io.ballerina.projects.environment.UpdatePolicy;

import java.util.Objects;

/**
Expand Down Expand Up @@ -75,8 +77,8 @@ public boolean offlineBuild() {
return this.compilationOptions.offlineBuild();
}

public boolean sticky() {
return this.compilationOptions.sticky();
public UpdatePolicy updatePolicy() {
return this.compilationOptions.updatePolicy();
}

public boolean disableSyntaxTree() {
Expand Down Expand Up @@ -206,7 +208,7 @@ public BuildOptions acceptTheirs(BuildOptions theirOptions) {
buildOptionsBuilder.setDumpRawGraphs(compilationOptions.dumpRawGraphs);
buildOptionsBuilder.setCloud(compilationOptions.cloud);
buildOptionsBuilder.setListConflictedClasses(compilationOptions.listConflictedClasses);
buildOptionsBuilder.setSticky(compilationOptions.sticky);
buildOptionsBuilder.setUpdatePolicy(compilationOptions.updatePolicy);
buildOptionsBuilder.setConfigSchemaGen(compilationOptions.configSchemaGen);
buildOptionsBuilder.setExportOpenAPI(compilationOptions.exportOpenAPI);
buildOptionsBuilder.setExportComponentModel(compilationOptions.exportComponentModel);
Expand Down Expand Up @@ -314,8 +316,8 @@ public BuildOptionsBuilder setSkipTests(Boolean value) {
return this;
}

public BuildOptionsBuilder setSticky(Boolean value) {
compilationOptionsBuilder.setSticky(value);
public BuildOptionsBuilder setUpdatePolicy(UpdatePolicy updatePolicy) {
compilationOptionsBuilder.setUpdatePolicy(updatePolicy);
return this;
}

Expand Down
Loading
Loading