Skip to content

Commit

Permalink
rework - repos now have 'resolve' tag by default
Browse files Browse the repository at this point in the history
- this commit partly reverts previous commit
- repos now get the 'resolve' tag by default if not specified
- .bndrun: empty -runrepos will be populated with all repos having the 'resolve' tag
- .bndrun: resolution consider all repos having the 'resolve' tag. that means you can exclude a repo from resolution by manually assigning it a different tag (e.g. to exclude the baseline repo from resolution, you should give the baseline-repo e.g. the tag 'baseline' and make sure it does NOT have the 'resolve' tag

Signed-off-by: Christoph Rueger <[email protected]>
  • Loading branch information
chrisrueger committed May 10, 2024
1 parent dd36fe1 commit b9a574f
Show file tree
Hide file tree
Showing 13 changed files with 118 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ public abstract class BaseRepository implements Repository, Tagged {
private final PromiseFactory promiseFactory = new PromiseFactory(
PromiseFactory.inlineExecutor());

private static final String DEFAULT_TAG = "all";
private static final Set<String> DEFAULT_TAGS = Set.of(DEFAULT_TAG);

static {
Requirement requireAll = ResourceUtils.createWildcardRequirement();
Expand Down Expand Up @@ -250,6 +248,6 @@ public RequirementBuilder addAttribute(String name, Object value) {

@Override
public Set<String> getTags() {
return DEFAULT_TAGS;
return Tagged.DEFAULT_REPO_TAGS;
}
}
14 changes: 14 additions & 0 deletions biz.aQute.bndlib/src/aQute/bnd/service/Registry.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
package aQute.bnd.service;

import static aQute.bnd.service.Tagged.matchesTags;

import java.util.List;
import java.util.stream.Collectors;

/**
* A registry for objects.
*/
public interface Registry {
<T> List<T> getPlugins(Class<T> c);

default <T> List<T> getPlugins(Class<T> c, String... tags) {

if (tags == null || tags.length == 0) {
return getPlugins(c);
}

return getPlugins(c).stream()
.filter(repo -> matchesTags(repo, tags))
.collect(Collectors.toList());
}

<T> T getPlugin(Class<T> c);
}
39 changes: 35 additions & 4 deletions biz.aQute.bndlib/src/aQute/bnd/service/Tagged.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,60 @@
package aQute.bnd.service;

import static aQute.bnd.service.Tagged.RepoTags.resolve;
import static java.util.stream.Collectors.toCollection;

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;

/**
* Allows to add tags to implementing classes. Originally intended for tagging
* repositories.
*/
public interface Tagged {


enum RepoTags {
/**
* tag for repos which should be used for Resolving bundles. This is
* also the default tag for all repos which not have specified tags
* (also for bc reasons) Also see {@link Tagged#DEFAULT_REPO_TAGS}
*/
resolve
// add more if neded e.g. relase, baseline
}

/**
* Each repo has by default the tag {@link RepoTags#resolve} if not tags are
* set at the repo definition in build.bnd That means it is consider
*/
Set<String> DEFAULT_REPO_TAGS = Set.of(resolve.name());

/**
* @return a non-null list of tags.
*/
Set<String> getTags();

static Set<String> toTags(String csvTags) {
static Set<String> toTags(String csvTags, Set<String> defaultTags) {
if (csvTags == null || csvTags.isBlank()) {
return Set.of("all"); // default
return defaultTags; // default
}

return Arrays.stream(csvTags.split(","))
.map(String::trim)
.collect(Collectors.toCollection(LinkedHashSet::new));
.collect(toCollection(LinkedHashSet::new));
}

static <T> boolean matchesTags(T obj, String... tags) {
if (obj instanceof Tagged tagged) {
Set<String> taggedTags = tagged.getTags();
for (String tag : tags) {
if (taggedTags.contains(tag)) {
return true;
}
}
}
return false;
}

}
2 changes: 1 addition & 1 deletion biz.aQute.bndlib/src/aQute/lib/deployer/FileRepo.java
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,6 @@ public void setIndex(boolean b) {

@Override
public Set<String> getTags() {
return Tagged.toTags(tags);
return Tagged.toTags(tags, Tagged.DEFAULT_REPO_TAGS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,7 @@ public void close() {}

@Override
public Set<String> getTags() {
return Tagged.toTags(tags);
return Tagged.toTags(tags, Tagged.DEFAULT_REPO_TAGS);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,6 @@ private Archive trySources(String bsn, Version version) throws Exception {

@Override
public Set<String> getTags() {
return Tagged.toTags(configuration.tags());
return Tagged.toTags(configuration.tags(), Tagged.DEFAULT_REPO_TAGS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1078,6 +1078,6 @@ public boolean isRemote() {

@Override
public Set<String> getTags() {
return Tagged.toTags(configuration.tags());
return Tagged.toTags(configuration.tags(), Tagged.DEFAULT_REPO_TAGS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,6 @@ private void status(String s) {

@Override
public Set<String> getTags() {
return Tagged.toTags(config.tags());
return Tagged.toTags(config.tags(), Tagged.DEFAULT_REPO_TAGS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public String title(Object... target) throws Exception {

@Override
public Set<String> getTags() {
return Tagged.toTags(config.tags());
return Tagged.toTags(config.tags(), Tagged.DEFAULT_REPO_TAGS);
}

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package aQute.bnd.repository.maven.provider;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.File;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.osgi.service.repository.Repository;

import aQute.bnd.build.Workspace;
import aQute.bnd.service.Tagged;
import aQute.bnd.service.Tagged.RepoTags;
import aQute.bnd.test.jupiter.InjectTemporaryDirectory;
import aQute.http.testservers.HttpTestServer.Config;
import aQute.lib.io.IO;
Expand Down Expand Up @@ -57,6 +64,37 @@ public void testEnv() throws Exception {
assertNotNull(workspace);
assertNotNull(repo);
System.out.println(workspace.getBase());

// check repo tags
// repos should have the 'resolve' tag by default if no tag is specified
List<Repository> repos = workspace.getPlugins(Repository.class);
List<Repository> resolveRepos = workspace.getPlugins(Repository.class, RepoTags.resolve.name());
assertEquals(repos, resolveRepos);

Repository repo = repos.get(0);
assertTrue(repo instanceof Tagged);
assertEquals(1, ((Tagged) repo).getTags()
.size());
assertEquals(RepoTags.resolve.name(), new ArrayList<>(((Tagged) repo).getTags()).get(0));

}

@Test
public void testRepoWithDifferentTag() throws Exception {
// similar as testEnv()
// but override the tag with a different one and repeat the tests
config(Map.of("tags", "foo"));

List<Repository> resolveRepos = workspace.getPlugins(Repository.class, RepoTags.resolve.name());
assertTrue(resolveRepos.isEmpty());

List<Repository> repos = workspace.getPlugins(Repository.class);
Repository repo = repos.get(0);
assertTrue(repo instanceof Tagged);
assertEquals(1, ((Tagged) repo).getTags()
.size());
assertEquals("foo", new ArrayList<>(((Tagged) repo).getTags()).get(0));

}

void config(Map<String, String> override) throws Exception {
Expand All @@ -74,7 +112,12 @@ void config(Map<String, String> override) throws Exception {
sb.format(" name=test; \\\n", MavenBndRepository.class.getName());
sb.format(" local=%s; \\\n", config.get("local"));
sb.format(" releaseUrl=%s; \\\n", config.get("releaseUrl"));
sb.format(" index=%s\n", config.get("index"));
sb.format(" index=%s; \\\n", config.get("index"));

String tags = config.get("tags");
if (tags != null && !tags.isBlank()) {
sb.format(" tags=%s\n", tags);
}

build.getParentFile()
.mkdirs();
Expand Down
29 changes: 7 additions & 22 deletions biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package biz.aQute.resolve;

import static aQute.bnd.service.Tagged.RepoTags.resolve;

import java.io.File;
import java.io.InputStream;
import java.net.URI;
Expand Down Expand Up @@ -54,9 +56,7 @@
import aQute.bnd.service.Registry;
import aQute.bnd.service.RepositoryPlugin;
import aQute.bnd.service.Strategy;
import aQute.bnd.service.Tagged;
import aQute.bnd.service.resolve.hook.ResolverHook;
import aQute.lib.collections.MultiMap;
import aQute.lib.converter.Converter;
import aQute.lib.strings.Strings;
import aQute.lib.utf8properties.UTF8Properties;
Expand Down Expand Up @@ -362,7 +362,6 @@ private Processor loadRepositories() throws Exception {

// Map the repository names...

MultiMap<String, Repository> reposTagMap = new MultiMap<>();
Map<String, Repository> repoNameMap = new HashMap<>(allRepos.size());
for (Repository repo : allRepos) {
String name;
Expand All @@ -373,28 +372,14 @@ private Processor loadRepositories() throws Exception {
}
repoNameMap.put(name, repo);

// tags
if (repo instanceof Tagged taggedRepo) {
Set<String> tags = taggedRepo.getTags();
for (String tag : tags) {
reposTagMap.add(tag, repo);
}
}
}

// Create the result list
orderedRepositories = new ArrayList<>();
for (String repoName : repoNames.keySet()) {
// tags prefixed with '@' e.g. '@baseline'
if (repoName.startsWith("@")) {
List<Repository> repos = reposTagMap.get(repoName.substring(1));
if (repos != null)
orderedRepositories.addAll(repos);
} else {
Repository repo = repoNameMap.get(repoName);
if (repo != null)
orderedRepositories.add(repo);
}
Repository repo = repoNameMap.get(repoName);
if (repo != null)
orderedRepositories.add(repo);
}
}

Expand All @@ -420,12 +405,12 @@ private List<Repository> getAllRepos() {
List<Repository> allRepos;
if (project != null && !project.isStandalone()) {
allRepos = project.getWorkspace()
.getPlugins(Repository.class);
.getPlugins(Repository.class, resolve.name());
allRepos.removeIf(WorkspaceRepositoryMarker.class::isInstance);
WorkspaceResourcesRepository wr = new WorkspaceResourcesRepository(project.getWorkspace());
allRepos.add(wr);
} else {
allRepos = registry.getPlugins(Repository.class);
allRepos = registry.getPlugins(Repository.class, resolve.name());
}
return allRepos;
}
Expand Down
12 changes: 6 additions & 6 deletions bndtools.core/_plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -839,7 +839,7 @@
helpUrl="https://bnd.bndtools.org/plugins/filerepo.html">
<property name="name" type="string"
description="Name of the repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release,resolve)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="location" type="string"
description="Local directory path" />
<property name="readonly" type="boolean" default="false" />
Expand All @@ -850,7 +850,7 @@
helpUrl="https://bnd.bndtools.org/plugins/osgirepo.html">
<property name="name" type="string"
description="Name of the repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release,resolve)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="locations" type="string"
description="Index locations (comma-separated list of URLs)" />
<property name="cache" type="string"
Expand All @@ -863,7 +863,7 @@
helpUrl="https://bnd.bndtools.org/plugins/localindexrepo.html">
<property name="name" type="string"
description="Name of the repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release,resolve)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="local" type="string"
description="Local directory path" />
<property name="phase" type="string"
Expand Down Expand Up @@ -902,7 +902,7 @@
helpUrl="https://bnd.bndtools.org/plugins/maven.html"
rank="10">
<property name="name" type="string" description="The name of this repository" default="Maven Repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="releaseUrl" type="string" description="The urls to the remote release repository." default="https://repo.maven.apache.org/maven2/" />
<property name="stagingUrl" type="string" description="The url of the staging release repository." />
<property name="snapshotUrl" type="string" description="The urls to the remote snapshot repository." default="https://repository.apache.org/snapshots/" />
Expand All @@ -922,7 +922,7 @@
name="P2Repository"
helpUrl="https://bnd.bndtools.org/plugins/p2repo.html">
<property name="name" type="string" description="The name of this repository" default="P2Repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release,resolve)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="url" type="string" description="The URL to either the P2 repository (a directory) or an Eclipse target platform. Required." />
<property name="location" type="string" description="The location to store the index file. Default: 'cnf/cache/p2-index-reponame/index.xml.gz'" />
</plugin>
Expand All @@ -932,7 +932,7 @@
name="Maven POM Repository"
helpUrl="https://bnd.bndtools.org/plugins/pomrepo.html">
<property name="name" type="string" description="The name of the repo. Required." default="Maven POM Repository" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. baseline,release,resolve)" />
<property name="tags" type="string" description="Comma separated list of tags. (e.g. resolve, baseline, release)" default="resolve" />
<property name="releaseUrl" type="string" description="The url to the remote release repository. Can be a comma separated list of urls." default="https://repo.maven.apache.org/maven2/" />
<property name="snapshotUrl" type="string" description="The url to the remote snapshot repository. If this is not specified, it falls back to the release repository or just local if this is also not specified. Can be a comma separated list of urls." default="https://repository.apache.org/snapshots/" />
<property name="local" type="string" description="The path to the local repository" default="~/.m2/repository" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package bndtools.editor.project;

import static aQute.bnd.service.Tagged.RepoTags.resolve;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
Expand Down Expand Up @@ -30,7 +32,7 @@ class RepositoriesEditModel {
RepositoriesEditModel(BndEditModel model) {
this.model = model;
this.pluginOrder = model.getWorkspace()
.getPlugins(Repository.class);
.getPlugins(Repository.class, resolve.name());
this.standalone = model.getStandaloneLinks();
this.runrepos = model.getRunRepos();
this.ignoreStandalone = model.getIgnoreStandalone();
Expand All @@ -44,6 +46,7 @@ class RepositoriesEditModel {
List<Repository> remains = new ArrayList<>(pluginOrder);

for (String name : runrepos) {

Repository r = find(name);
if (r != null) {
actualOrder.add(r);
Expand All @@ -55,6 +58,7 @@ class RepositoriesEditModel {
}
}


private Repository find(String sought) {
for (Repository r : pluginOrder) {
String name = toName(r);
Expand Down

0 comments on commit b9a574f

Please sign in to comment.