Skip to content

Commit

Permalink
Merge pull request #6104 from chrisrueger/mvn-editor
Browse files Browse the repository at this point in the history
Repository Browser: Add context menu action "Update Revisions :: To higher MICRO / MINOR / MAJOR revision"
  • Loading branch information
chrisrueger committed May 7, 2024
2 parents df00b2a + 2f87393 commit e7ce501
Show file tree
Hide file tree
Showing 7 changed files with 327 additions and 150 deletions.
168 changes: 25 additions & 143 deletions biz.aQute.bnd/src/aQute/bnd/main/MbrCommand.java
@@ -1,15 +1,11 @@
package aQute.bnd.main;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Expand All @@ -19,13 +15,14 @@
import aQute.bnd.osgi.Instructions;
import aQute.bnd.osgi.Processor;
import aQute.bnd.repository.maven.provider.MavenBndRepository;
import aQute.bnd.repository.maven.provider.MbrUpdater;
import aQute.bnd.repository.maven.provider.MbrUpdater.MavenVersionResult;
import aQute.bnd.repository.maven.provider.MbrUpdater.Scope;
import aQute.bnd.version.MavenVersion;
import aQute.bnd.version.Version;
import aQute.lib.collections.MultiMap;
import aQute.lib.getopt.Arguments;
import aQute.lib.getopt.Description;
import aQute.lib.getopt.Options;
import aQute.lib.io.IO;
import aQute.lib.json.JSONCodec;
import aQute.lib.justif.Justif;
import aQute.maven.api.Archive;
Expand Down Expand Up @@ -114,13 +111,6 @@ public void _verify(VerifyOptions options) throws Exception {
format("Multiple archives for a single program", revisions);
}

enum Scope {
micro,
minor,
major,
all
}

@Description("For each archive in the index, show the available higher versions")
@Arguments(arg = {
"archive-glob..."
Expand All @@ -139,8 +129,8 @@ public void _check(CheckOptions options) throws Exception {
List<MavenBndRepository> repos = getRepositories(options.repo());
List<Archive> archives = getArchives(repos, options._arguments());

MultiMap<Archive, MavenVersion> overlap = getUpdates(options.scope(Scope.all), repos, archives,
options.snapshotlike());
MultiMap<Archive, MavenVersion> overlap = MbrUpdater.getUpdates(options.scope(Scope.all), repos,
archives, options.snapshotlike());
format("Updates available", overlap);
}

Expand All @@ -157,79 +147,29 @@ public void _update(UpdateOptions options) throws Exception {
List<MavenBndRepository> repos = getRepositories(options.repo());
List<Archive> archives = getArchives(repos, options._arguments());

MultiMap<Archive, MavenVersion> updates = getUpdates(options.scope(Scope.all), repos, archives,
options.snapshotlike());
MultiMap<Archive, MavenVersion> updates = MbrUpdater.getUpdates(options.scope(Scope.all), repos,
archives, options.snapshotlike());

for (MavenBndRepository repo : repos) {
bnd.trace("repo %s", repo.getName());
Map<Archive, MavenVersion> content = new HashMap<>();

for (Archive archive : new TreeSet<>(repo.getArchives())) {
List<MavenVersion> list = updates.get(archive);
if (list == null || list.isEmpty()) {
content.put(archive, archive.revision.version);
} else {
MavenVersion version = list.get(list.size() - 1);
bnd.out.format(" %-70s %20s -> %s%n", archive.getRevision().program,
archive.getRevision().version, version);
content.put(archive, version);
}
}

MbrUpdater mbr = new MbrUpdater(repo);
Map<Archive, MavenVersionResult> content = mbr.calculateUpdateRevisions(updates);
logMavenUpdates(content);

if (!options.dry()) {
if (update(repo, content)) {
if (repo.getIndexFile()
.isFile()) {
bnd.trace("reading %s", repo.getIndexFile());
}
if (mbr.update(content)) {
bnd.trace("writing %s", repo.getIndexFile());
repo.refresh();
}
}
}
}

private boolean update(MavenBndRepository repo, Map<Archive, MavenVersion> translations) throws IOException {
boolean changes = false;
StringBuilder sb = new StringBuilder();
Iterator<String> lc;
if (repo.getIndexFile()
.isFile()) {
lc = IO.reader(repo.getIndexFile())
.lines()
.iterator();
bnd.trace("reading %s", repo.getIndexFile());
} else {
lc = Collections.emptyIterator();
}

for (Iterator<String> i = lc; i.hasNext();) {
String line = i.next()
.trim();
if (!line.startsWith("#") && !line.isEmpty()) {

Archive archive = Archive.valueOf(line);
if (archive != null) {
MavenVersion version = translations.get(archive);
if (version != null) {
if (!archive.revision.version.equals(version)) {
Archive updated = archive.update(version);
sb.append(updated)
.append("\n");
changes = true;
continue;
}
}
}
}
sb.append(line)
.append("\n");
}
if (!changes)
return false;

repo.getIndexFile()
.getParentFile()
.mkdirs();
bnd.trace("writing %s", repo.getIndexFile());
IO.store(sb.toString(), repo.getIndexFile());
return changes;
}

private List<MavenBndRepository> getRepositories(int[] repo) {
if (repo == null)
Expand Down Expand Up @@ -289,76 +229,18 @@ private List<Archive> getArchives(List<MavenBndRepository> repos, List<String> l
.collect(Collectors.toList());
}

private MultiMap<Archive, MavenVersion> getUpdates(Scope scope, List<MavenBndRepository> repos,
List<Archive> archives, boolean snapshotlike) throws Exception {
MultiMap<Archive, MavenVersion> overlap = new MultiMap<>();

for (Archive archive : archives) {
for (MavenBndRepository r : repos) {
if (r.getArchives()
.contains(archive)) {
MavenVersion version = archive.revision.version;
r.getRevisions(archive.revision.program)
.stream()
.map(revision -> revision.version)
.filter(snapshotlike ? x -> true : notSnapshotlikePredicate)
.filter(v -> v.compareTo(version) > 0)
.forEach(v -> {
overlap.add(archive, v);
});
}
}
}
overlap.entrySet()
private void logMavenUpdates(Map<Archive, MavenVersionResult> content) {
content.entrySet()
.forEach(e -> {
List<MavenVersion> filtered = filter(e.getValue(), e.getKey().revision.version.getOSGiVersion(), scope);
e.setValue(filtered);
});
return overlap;
}
Archive archive = e.getKey();
MavenVersionResult versionResult = e.getValue();

private List<MavenVersion> filter(List<MavenVersion> versions, Version current, Scope show) {

if (versions.isEmpty())
return versions;

MavenVersion major = null;
MavenVersion minor = null;
MavenVersion micro = null;

for (MavenVersion v : versions) {
major = v;
if (v.getOSGiVersion()
.getMajor() == current.getMajor()) {
minor = v;
if (v.getOSGiVersion()
.getMinor() == current.getMinor()) {
micro = v;
if (versionResult.mavenVersionAvailable()) {
bnd.out.format(" %-70s %20s -> %s%n", archive.getRevision().program, archive.getRevision().version,
versionResult.mavenVersion());
}
}
}

switch (show) {
default :
case all :
return versions;

case major :
return Collections.singletonList(major);

case minor :
if (minor == null)
return Collections.emptyList();
else
return Collections.singletonList(minor);

case micro :
if (micro == null)
return Collections.emptyList();
else
return Collections.singletonList(micro);

}
});
}

}
2 changes: 1 addition & 1 deletion biz.aQute.repository/bnd.bnd
Expand Up @@ -56,7 +56,7 @@ Export-Package: \
-builderignore: testresources, testdata

-fixupmessages.tag: "Export aQute.maven.provider,* private references \\[aQute.lib.tag\\]"
-fixupmessages.getopts: "Export aQute.bnd.repository.maven.provider,* private references \\[aQute.lib.getopt\\]"
-fixupmessages.lib: "Export aQute.bnd.repository.maven.provider,* private references \\[aQute.lib.collections, aQute.lib.getopt\\]"
-fixupmessages.configurable: "Export aQute.bnd.repository.osgi,* private references \\[aQute.configurable\\]"

-baseline: *
Expand Down
Expand Up @@ -827,7 +827,7 @@ public Map<String, Runnable> actions(Object... target) throws Exception {

switch (target.length) {
case 0 :
return null;
return actions.getRepoActions(registry.getPlugin(Clipboard.class));
case 1 :
return actions.getProgramActions((String) target[0]);
case 2 :
Expand Down
@@ -0,0 +1 @@
package aQute.bnd.repository.maven.provider;

0 comments on commit e7ce501

Please sign in to comment.