Search in sources :

Example 1 with Ignore

use of aQute.bnd.service.diff.Diff.Ignore in project bnd by bndtools.

the class Baseline method baseline.

public Set<Info> baseline(Tree n, Parameters nExports, Tree o, Parameters oExports, Instructions packageFilters) throws Exception {
    diff = n.diff(o);
    Diff apiDiff = diff.get("<api>");
    infos = Create.set();
    bsn = getBsn(n);
    newerVersion = getVersion(n);
    olderVersion = getVersion(o);
    boolean firstRelease = false;
    if (o.get("<manifest>") == null) {
        firstRelease = true;
        if (newerVersion.equals(Version.emptyVersion)) {
            newerVersion = Version.ONE;
        }
    }
    Delta highestDelta = Delta.UNCHANGED;
    for (Diff pdiff : apiDiff.getChildren()) {
        if (// Just packages
        pdiff.getType() != Type.PACKAGE)
            continue;
        if (pdiff.getName().startsWith("java."))
            continue;
        if (!packageFilters.matches(pdiff.getName()))
            continue;
        final Info info = new Info();
        infos.add(info);
        info.reason = getRootCauses(pdiff);
        info.packageDiff = pdiff;
        info.packageName = pdiff.getName();
        info.attributes = nExports.get(info.packageName);
        logger.debug("attrs for {} {}", info.packageName, info.attributes);
        info.newerVersion = getVersion(info.attributes);
        info.olderVersion = getVersion(oExports.get(info.packageName));
        if (pdiff.getDelta() == Delta.UNCHANGED) {
            info.suggestedVersion = info.olderVersion;
            // Fix previously released package containing version qualifier
            if (info.olderVersion.getQualifier() != null) {
                info.suggestedVersion = bump(Delta.MICRO, info.olderVersion, 1, 0);
                info.warning += "Found package version with qualifier. Bumping micro version";
            } else if (!info.newerVersion.equals(info.olderVersion)) {
                info.warning += "No difference but versions are not equal";
            }
        } else if (pdiff.getDelta() == Delta.REMOVED) {
            info.suggestedVersion = null;
        } else if (pdiff.getDelta() == Delta.ADDED) {
            info.suggestedVersion = info.newerVersion;
        } else {
            // We have an API change
            info.suggestedVersion = bump(pdiff.getDelta(), info.olderVersion, 1, 0);
            if (info.newerVersion.compareTo(info.suggestedVersion) < 0) {
                // our suggested version is smaller
                info.mismatch = true;
                // that an interface is a provider interface
                if (pdiff.getDelta() == Delta.MAJOR) {
                    info.providers = Create.set();
                    if (info.attributes != null)
                        info.providers.addAll(Processor.split(info.attributes.get(Constants.PROVIDER_TYPE_DIRECTIVE)));
                    // Calculate the new delta assuming we fix all the major
                    // interfaces
                    // by making them providers
                    Delta tryDelta = pdiff.getDelta(new Ignore() {

                        public boolean contains(Diff diff) {
                            if (diff.getType() == Type.INTERFACE && diff.getDelta() == Delta.MAJOR) {
                                info.providers.add(Descriptors.getShortName(diff.getName()));
                                return true;
                            }
                            return false;
                        }
                    });
                    if (tryDelta != Delta.MAJOR) {
                        info.suggestedIfProviders = bump(tryDelta, info.olderVersion, 1, 0);
                    }
                }
            }
        }
        Delta content;
        switch(pdiff.getDelta()) {
            case IGNORED:
            case UNCHANGED:
                content = Delta.UNCHANGED;
                break;
            case ADDED:
                content = Delta.MINOR;
                break;
            case // cannot happen
            CHANGED:
                content = Delta.MICRO;
                break;
            case MICRO:
                content = pdiff.getDelta();
                break;
            case MINOR:
                content = pdiff.getDelta();
                break;
            case MAJOR:
                content = pdiff.getDelta();
                break;
            case REMOVED:
            default:
                content = Delta.MAJOR;
                break;
        }
        if (content.compareTo(highestDelta) > 0) {
            highestDelta = content;
        }
    }
    // biggest semantic change
    if (firstRelease || !bsn.equals(getBsn(o))) {
        suggestedVersion = newerVersion;
    } else {
        suggestedVersion = bumpBundle(highestDelta, olderVersion, 1, 0);
        if (suggestedVersion.compareTo(newerVersion) < 0)
            suggestedVersion = newerVersion;
    }
    binfo.bsn = bsn;
    binfo.suggestedVersion = suggestedVersion;
    binfo.version = binfo.olderVersion = olderVersion;
    binfo.newerVersion = newerVersion;
    if (newerVersion.getWithoutQualifier().equals(olderVersion.getWithoutQualifier())) {
        if (getDiff().getDelta() == Delta.UNCHANGED)
            return infos;
    }
    // Ok, now our bundle version must be >= the suggestedVersion
    if (newerVersion.getWithoutQualifier().compareTo(getSuggestedVersion()) < 0) {
        binfo.mismatch = true;
        binfo.reason = getRootCauses(apiDiff);
    }
    return infos;
}
Also used : Ignore(aQute.bnd.service.diff.Diff.Ignore) Diff(aQute.bnd.service.diff.Diff) Delta(aQute.bnd.service.diff.Delta)

Aggregations

Delta (aQute.bnd.service.diff.Delta)1 Diff (aQute.bnd.service.diff.Diff)1 Ignore (aQute.bnd.service.diff.Diff.Ignore)1