use of aQute.bnd.differ.Baseline.Info in project bnd by bndtools.
the class ProjectBuilder method doBaseline.
/**
* Compare this builder's JAR with a baseline
*
* @throws Exception
*/
@Override
public void doBaseline(Jar dot) throws Exception {
String diffignore = project.getProperty(Constants.DIFFIGNORE);
logger.debug("ignore headers & paths {}", diffignore);
differ.setIgnore(diffignore);
Instructions diffpackages = new Instructions(new Parameters(project.getProperty(Constants.DIFFPACKAGES), this));
logger.debug("diffpackages {}", diffpackages);
try (Jar fromRepo = getBaselineJar()) {
if (fromRepo == null) {
logger.debug("No baseline jar {}", getProperty(Constants.BASELINE));
return;
}
Version newer = new Version(getVersion());
Version older = new Version(fromRepo.getVersion());
if (!getBsn().equals(fromRepo.getBsn())) {
error("The symbolic name of this project (%s) is not the same as the baseline: %s", getBsn(), fromRepo.getBsn());
return;
}
if (newer.getWithoutQualifier().equals(older.getWithoutQualifier())) {
RepositoryPlugin rr = getBaselineRepo();
if (rr instanceof InfoRepository) {
ResourceDescriptor descriptor = ((InfoRepository) rr).getDescriptor(getBsn(), older);
if (descriptor != null && descriptor.phase != Phase.STAGING) {
error("Baselining %s against same version %s but the repository says the older repository version is not the required %s but is instead %s", getBsn(), getVersion(), Phase.STAGING, descriptor.phase);
return;
}
}
}
logger.debug("baseline {}-{} against: {}", getBsn(), getVersion(), fromRepo.getName());
Baseline baseliner = new Baseline(this, differ);
Set<Info> infos = baseliner.baseline(dot, fromRepo, diffpackages);
if (infos.isEmpty())
logger.debug("no deltas");
StringBuffer sb = new StringBuffer();
try (Formatter f = new Formatter(sb, Locale.US)) {
for (Info info : infos) {
if (!info.mismatch) {
continue;
}
sb.setLength(0);
Diff packageDiff = info.packageDiff;
f.format("Baseline mismatch for package %s, %s change. Current is %s, repo is %s, suggest %s or %s%n%#S", packageDiff.getName(), packageDiff.getDelta(), info.newerVersion, ((info.olderVersion != null) && info.olderVersion.equals(Version.LOWEST)) ? '-' : info.olderVersion, ((info.suggestedVersion != null) && info.suggestedVersion.compareTo(info.newerVersion) <= 0) ? "ok" : info.suggestedVersion, (info.suggestedIfProviders == null) ? "-" : info.suggestedIfProviders, packageDiff);
SetLocation l = error("%s", f.toString());
l.header(Constants.BASELINE);
fillInLocationForPackageInfo(l.location(), packageDiff.getName());
if (getPropertiesFile() != null)
l.file(getPropertiesFile().getAbsolutePath());
l.details(info);
}
BundleInfo binfo = baseliner.getBundleInfo();
if (binfo.mismatch) {
sb.setLength(0);
f.format("The bundle version (%s/%s) is too low, must be at least %s%n%#S", binfo.olderVersion, binfo.newerVersion, binfo.suggestedVersion, baseliner.getDiff());
SetLocation error = error("%s", f.toString());
error.context("Baselining");
error.header(Constants.BUNDLE_VERSION);
error.details(binfo);
FileLine fl = getHeader(Pattern.compile("^" + Constants.BUNDLE_VERSION, Pattern.MULTILINE));
if (fl != null) {
error.file(fl.file.getAbsolutePath());
error.line(fl.line);
error.length(fl.length);
}
}
}
}
}
use of aQute.bnd.differ.Baseline.Info in project felix by apache.
the class AbstractBaselinePlugin method execute.
protected void execute(Object context) throws MojoExecutionException, MojoFailureException {
if (skip) {
getLog().info("Skipping Baseline execution");
return;
}
if (!supportedProjectTypes.contains(project.getArtifact().getType())) {
getLog().info("Skipping Baseline (project type " + project.getArtifact().getType() + " not supported)");
return;
}
// get the bundles that have to be compared
final Jar currentBundle = getCurrentBundle();
if (currentBundle == null) {
getLog().info("Not generating Baseline report as there is no bundle generated by the project");
return;
}
final Artifact previousArtifact = getPreviousArtifact();
final Jar previousBundle;
if (previousArtifact != null) {
previousBundle = openJar(previousArtifact.getFile());
} else {
previousBundle = null;
}
if (previousBundle == null) {
getLog().info("Not generating Baseline report as there is no previous version of the library to compare against");
return;
}
// preparing the filters
final Instructions packageFilters;
if (filters == null || filters.length == 0) {
packageFilters = new Instructions();
} else {
packageFilters = new Instructions(Arrays.asList(filters));
}
String generationDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'").format(new Date());
final Reporter reporter = new Processor();
final Info[] infos;
try {
final Set<Info> infoSet = new Baseline(reporter, new DiffPluginImpl()).baseline(currentBundle, previousBundle, packageFilters);
infos = infoSet.toArray(new Info[infoSet.size()]);
Arrays.sort(infos, new InfoComparator());
} catch (final Exception e) {
throw new MojoExecutionException("Impossible to calculate the baseline", e);
} finally {
closeJars(currentBundle, previousBundle);
}
try {
// go!
context = this.init(context);
startBaseline(context, generationDate, project.getArtifactId(), project.getVersion(), previousArtifact.getVersion());
for (final Info info : infos) {
DiffMessage diffMessage = null;
if (info.suggestedVersion != null) {
if (info.newerVersion.compareTo(info.suggestedVersion) > 0) {
diffMessage = new DiffMessage("Excessive version increase", DiffMessage.Type.warning);
reporter.warning("%s: %s; detected %s, suggested %s", info.packageName, diffMessage, info.newerVersion, info.suggestedVersion);
} else if (info.newerVersion.compareTo(info.suggestedVersion) < 0) {
diffMessage = new DiffMessage("Version increase required", DiffMessage.Type.error);
reporter.error("%s: %s; detected %s, suggested %s", info.packageName, diffMessage, info.newerVersion, info.suggestedVersion);
}
}
switch(info.packageDiff.getDelta()) {
case UNCHANGED:
if (info.newerVersion.compareTo(info.suggestedVersion) != 0) {
diffMessage = new DiffMessage("Version has been increased but analysis detected no changes", DiffMessage.Type.warning);
reporter.warning("%s: %s; detected %s, suggested %s", info.packageName, diffMessage, info.newerVersion, info.suggestedVersion);
}
break;
case REMOVED:
diffMessage = new DiffMessage("Package removed", DiffMessage.Type.info);
reporter.trace("%s: %s ", info.packageName, diffMessage);
break;
case CHANGED:
case MICRO:
case MINOR:
case MAJOR:
case ADDED:
default:
// ok
break;
}
startPackage(context, info.mismatch, info.packageName, getShortDelta(info.packageDiff.getDelta()), StringUtils.lowerCase(String.valueOf(info.packageDiff.getDelta())), info.newerVersion, info.olderVersion, info.suggestedVersion, diffMessage, info.attributes);
if (Delta.REMOVED != info.packageDiff.getDelta()) {
doPackageDiff(context, info.packageDiff);
}
endPackage(context);
}
endBaseline(context);
} finally {
this.close(context);
}
// check if it has to fail if some error has been detected
boolean fail = false;
if (!reporter.isOk()) {
for (String errorMessage : reporter.getErrors()) {
getLog().error(errorMessage);
}
if (failOnError) {
fail = true;
}
}
if (!reporter.getWarnings().isEmpty()) {
for (String warningMessage : reporter.getWarnings()) {
getLog().warn(warningMessage);
}
if (failOnWarning) {
fail = true;
}
}
getLog().info(String.format("Baseline analysis complete, %s error(s), %s warning(s)", reporter.getErrors().size(), reporter.getWarnings().size()));
if (fail) {
throw new MojoFailureException("Baseline failed, see generated report");
}
}
use of aQute.bnd.differ.Baseline.Info in project bndtools by bndtools.
the class InfoLabelProvider method getImage.
@Override
public Image getImage(Object element) {
if (element instanceof Baseline) {
Diff apiDiff = ((Baseline) element).getDiff() != null ? ((Baseline) element).getDiff().get("<api>") : // $NON-NLS-1$
null;
if (apiDiff == null) {
apiDiff = ((Baseline) element).getDiff();
}
return BundleTreeImages.resolveImage("bundle", // $NON-NLS-1$
apiDiff.getDelta().toString().toLowerCase(), null, null);
}
if (element instanceof Info) {
Info tree = (Info) element;
// $NON-NLS-1$
String type = "package";
String delta = "changed" + '_' + // $NON-NLS-1$
tree.packageDiff.getDelta().toString().toLowerCase();
// $NON-NLS-1$
String impExp = "export";
return BundleTreeImages.resolveImage(type, delta, impExp, null);
}
return null;
}
use of aQute.bnd.differ.Baseline.Info in project bndtools by bndtools.
the class ReleaseHelper method initializeProjectDiffs.
public static void initializeProjectDiffs(List<ProjectDiff> projects) {
String[] repos = getReleaseRepositories();
for (ProjectDiff projectDiff : projects) {
RepositoryPlugin repoPlugin = ReleaseHelper.getReleaseRepo(projectDiff.getProject());
String repo;
if (repoPlugin != null) {
repo = repoPlugin.getName();
} else {
repo = null;
}
if (repo == null) {
if (repos.length > 0) {
repo = repos[0];
} else {
repo = "";
}
}
projectDiff.setReleaseRepository(repo);
projectDiff.setDefaultReleaseRepository(repo);
for (Baseline baseline : projectDiff.getBaselines()) {
if (ReleaseUtils.needsRelease(baseline)) {
projectDiff.setRelease(true);
projectDiff.setReleaseRequired(true);
if (!baseline.getNewerVersion().equals(baseline.getSuggestedVersion())) {
projectDiff.setVersionUpdateRequired(true);
continue;
}
for (Info info : baseline.getPackageInfos()) {
if (!info.newerVersion.equals(info.suggestedVersion)) {
projectDiff.setVersionUpdateRequired(true);
break;
}
}
} else {
baseline.setSuggestedVersion(baseline.getOlderVersion());
}
}
}
}
use of aQute.bnd.differ.Baseline.Info in project bndtools by bndtools.
the class BundleTree method createInfoViewer.
private void createInfoViewer(Composite container) {
infoViewerComposite = new Composite(container, SWT.NONE);
infoViewerComposite.setLayoutData(createFillGridData());
TreeColumnLayout layout = new TreeColumnLayout();
infoViewerComposite.setLayout(layout);
infoViewer = new TreeViewer(infoViewerComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
infoViewer.setUseHashlookup(true);
infoViewer.getTree().setHeaderVisible(true);
TreeViewerColumn treeViewerColumn = new TreeViewerColumn(infoViewer, SWT.NONE);
TreeColumn treeColumn = treeViewerColumn.getColumn();
layout.setColumnData(treeColumn, new ColumnWeightData(450, 180, true));
treeColumn.setText(Messages.bundleAndPackageName);
treeViewerColumn.setLabelProvider(new InfoLabelProvider());
treeViewerColumn = new TreeViewerColumn(infoViewer, SWT.NONE);
treeColumn = treeViewerColumn.getColumn();
layout.setColumnData(treeColumn, new ColumnWeightData(80, 80, true));
treeColumn.setText(Messages.version2);
treeViewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Baseline) {
return ((Baseline) element).getOlderVersion().getWithoutQualifier().toString();
}
if (element instanceof Info) {
return ((Info) element).olderVersion.toString();
}
// $NON-NLS-1$
return "";
}
});
treeViewerColumn = new TreeViewerColumn(infoViewer, SWT.NONE);
treeColumn = treeViewerColumn.getColumn();
layout.setColumnData(treeColumn, new ColumnWeightData(80, 80, true));
treeColumn.setText(Messages.newVersion);
treeViewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Baseline) {
return ((Baseline) element).getSuggestedVersion().toString();
}
if (element instanceof Info) {
// $NON-NLS-1$
return ((Info) element).suggestedVersion != null ? ((Info) element).suggestedVersion.toString() : "";
}
// $NON-NLS-1$
return "";
}
});
treeViewerColumn.setEditingSupport(new InlineComboEditingSupport(infoViewer));
infoViewer.setContentProvider(infoTreeViewerProvider);
infoViewer.setAutoExpandLevel(2);
}
Aggregations