Search in sources :

Example 16 with Info

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);
                }
            }
        }
    }
}
Also used : Parameters(aQute.bnd.header.Parameters) Diff(aQute.bnd.service.diff.Diff) Formatter(java.util.Formatter) RepositoryPlugin(aQute.bnd.service.RepositoryPlugin) Instructions(aQute.bnd.osgi.Instructions) Baseline(aQute.bnd.differ.Baseline) BundleInfo(aQute.bnd.differ.Baseline.BundleInfo) Info(aQute.bnd.differ.Baseline.Info) InfoRepository(aQute.bnd.service.repository.InfoRepository) BundleInfo(aQute.bnd.differ.Baseline.BundleInfo) Version(aQute.bnd.version.Version) Jar(aQute.bnd.osgi.Jar) ResourceDescriptor(aQute.bnd.service.repository.SearchableRepository.ResourceDescriptor)

Example 17 with Info

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");
    }
}
Also used : Processor(aQute.bnd.osgi.Processor) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) Reporter(aQute.service.reporter.Reporter) MojoFailureException(org.apache.maven.plugin.MojoFailureException) Instructions(aQute.bnd.osgi.Instructions) Info(aQute.bnd.differ.Baseline.Info) Baseline(aQute.bnd.differ.Baseline) Artifact(org.apache.maven.artifact.Artifact) Date(java.util.Date) InvalidVersionSpecificationException(org.apache.maven.artifact.versioning.InvalidVersionSpecificationException) ArtifactNotFoundException(org.apache.maven.artifact.resolver.ArtifactNotFoundException) ArtifactResolutionException(org.apache.maven.artifact.resolver.ArtifactResolutionException) IOException(java.io.IOException) MojoExecutionException(org.apache.maven.plugin.MojoExecutionException) MojoFailureException(org.apache.maven.plugin.MojoFailureException) OverConstrainedVersionException(org.apache.maven.artifact.versioning.OverConstrainedVersionException) ArtifactMetadataRetrievalException(org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException) DiffPluginImpl(aQute.bnd.differ.DiffPluginImpl) Jar(aQute.bnd.osgi.Jar) SimpleDateFormat(java.text.SimpleDateFormat)

Example 18 with Info

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;
}
Also used : Diff(aQute.bnd.service.diff.Diff) Baseline(aQute.bnd.differ.Baseline) Info(aQute.bnd.differ.Baseline.Info)

Example 19 with Info

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());
            }
        }
    }
}
Also used : RepositoryPlugin(aQute.bnd.service.RepositoryPlugin) Baseline(aQute.bnd.differ.Baseline) Info(aQute.bnd.differ.Baseline.Info)

Example 20 with Info

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);
}
Also used : ColumnWeightData(org.eclipse.jface.viewers.ColumnWeightData) Composite(org.eclipse.swt.widgets.Composite) TreeColumnLayout(org.eclipse.jface.layout.TreeColumnLayout) TreeViewer(org.eclipse.jface.viewers.TreeViewer) Baseline(aQute.bnd.differ.Baseline) Info(aQute.bnd.differ.Baseline.Info) TreeViewerColumn(org.eclipse.jface.viewers.TreeViewerColumn) ColumnLabelProvider(org.eclipse.jface.viewers.ColumnLabelProvider) TreeColumn(org.eclipse.swt.widgets.TreeColumn)

Aggregations

Info (aQute.bnd.differ.Baseline.Info)22 Baseline (aQute.bnd.differ.Baseline)16 BundleInfo (aQute.bnd.differ.Baseline.BundleInfo)13 Jar (aQute.bnd.osgi.Jar)13 DiffPluginImpl (aQute.bnd.differ.DiffPluginImpl)10 Processor (aQute.bnd.osgi.Processor)8 Builder (aQute.bnd.osgi.Builder)5 ProjectBuilder (aQute.bnd.build.ProjectBuilder)4 Diff (aQute.bnd.service.diff.Diff)4 Version (aQute.bnd.version.Version)4 Instructions (aQute.bnd.osgi.Instructions)3 MultiMap (aQute.lib.collections.MultiMap)3 Parameters (aQute.bnd.header.Parameters)2 RepositoryPlugin (aQute.bnd.service.RepositoryPlugin)2 File (java.io.File)2 Formatter (java.util.Formatter)2 Map (java.util.Map)2 Manifest (java.util.jar.Manifest)2 Attrs (aQute.bnd.header.Attrs)1 Analyzer (aQute.bnd.osgi.Analyzer)1