Skip to content

Commit

Permalink
Enable referenced repositories when resolving the target content
Browse files Browse the repository at this point in the history
Currently referenced repositories are ignored, that prevents sharing of
items that are already available in the referenced repository.

This enables searching references (if possible) to find IUs and
dependencies in these referenced repositories as well.

Fix #720
  • Loading branch information
laeubi committed Sep 21, 2023
1 parent dfb96f0 commit 27e3dcc
Showing 1 changed file with 28 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1008,14 +1008,17 @@ static IQueryable<IInstallableUnit> getQueryableMetadata(URI[] repos, IProgressM
}

int repoCount = repos.length;
SubMonitor subMonitor = SubMonitor.convert(monitor, repoCount);

SubMonitor subMonitor = SubMonitor.convert(monitor, repoCount * 2);

Set<IRepositoryReference> seen = new HashSet<>();
List<IMetadataRepository> result = new ArrayList<>(repoCount);
List<IMetadataRepository> additional = new ArrayList<>();
MultiStatus repoStatus = new MultiStatus(PDECore.PLUGIN_ID, 0, Messages.IUBundleContainer_ProblemsLoadingRepositories, null);
for (int i = 0; i < repoCount; ++i) {
try {
result.add(manager.loadRepository(repos[i], subMonitor.split(1)));
IMetadataRepository repository = manager.loadRepository(repos[i], subMonitor.split(1));
result.add(repository);
addReferences(repository, additional, seen, manager, subMonitor.split(1));
} catch (ProvisionException e) {
repoStatus.add(e.getStatus());
}
Expand All @@ -1024,12 +1027,33 @@ static IQueryable<IInstallableUnit> getQueryableMetadata(URI[] repos, IProgressM
if (result.size() != repos.length) {
throw new CoreException(repoStatus);
}
result.addAll(additional);
if (result.size() == 1) {
return result.get(0);
}
return QueryUtil.compoundQueryable(result);
}

private static void addReferences(IMetadataRepository repository, List<IMetadataRepository> result,
Set<IRepositoryReference> seen, IMetadataRepositoryManager manager, IProgressMonitor monitor) {
Collection<IRepositoryReference> references = repository.getReferences();
SubMonitor subMonitor = SubMonitor.convert(monitor, references.size() * 2);
for (IRepositoryReference reference : references) {
if (reference.getType() == IRepository.TYPE_METADATA && seen.add(reference)) {
try {
IMetadataRepository referencedRepository = manager.loadRepository(reference.getLocation(),
subMonitor.split(1));
result.add(referencedRepository);
addReferences(referencedRepository, result, seen, manager, subMonitor.split(1));
} catch (ProvisionException e) {
//if reference can't be loaded just ignore it here but log the error just in case the user wants to act on this
PDECore.log(e);
}
}
}

}

/**
* Used to resolve the contents of this container if the user is including all required software. The p2 planner is used
* to determine the complete set of IUs required to run the selected software. If all requirements are met, the bundles
Expand All @@ -1056,6 +1080,7 @@ private void resolveWithPlanner(ITargetDefinition target, IProgressMonitor monit
}

ProvisioningContext context = new ProvisioningContext(getAgent());
context.setProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES, Boolean.toString(true));
context.setMetadataRepositories(getMetadataRepositories(target));
context.setArtifactRepositories(getArtifactRepositories(target));

Expand Down

0 comments on commit 27e3dcc

Please sign in to comment.