private void compareWithReference()

in src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java [153:231]


    private void compareWithReference(Map<Artifact, String> artifacts, File referenceBuildinfo)
            throws MojoExecutionException {
        Properties actual = BuildInfoWriter.loadOutputProperties(buildinfoFile);
        Properties reference = BuildInfoWriter.loadOutputProperties(referenceBuildinfo);

        int ok = 0;
        List<String> okFilenames = new ArrayList<>();
        List<String> koFilenames = new ArrayList<>();
        List<String> diffoscopes = new ArrayList<>();
        File referenceDir = referenceBuildinfo.getParentFile();
        for (Map.Entry<Artifact, String> entry : artifacts.entrySet()) {
            Artifact artifact = entry.getKey();
            String prefix = entry.getValue();

            String[] checkResult = checkArtifact(artifact, prefix, reference, actual, referenceDir);
            String filename = checkResult[0];
            String diffoscope = checkResult[1];

            if (diffoscope == null) {
                ok++;
                okFilenames.add(filename);
            } else {
                koFilenames.add(filename);
                diffoscopes.add(diffoscope);
            }
        }

        int ko = artifacts.size() - ok;
        int missing = reference.size() / 3 /* 3 property keys par file: filename, length and checksums.sha512 */;

        if (ko + missing > 0) {
            getLog().error("Reproducible Build output summary: "
                    + MessageUtils.buffer().success(ok + " files ok")
                    + ", " + MessageUtils.buffer().failure(ko + " different")
                    + ((missing == 0) ? "" : (", " + MessageUtils.buffer().failure(missing + " missing"))));
            getLog().error("see "
                    + MessageUtils.buffer()
                            .project("diff " + relative(referenceBuildinfo) + " " + relative(buildinfoFile))
                            .toString());
            getLog().error("see also https://maven.apache.org/guides/mini/guide-reproducible-builds.html");
        } else {
            getLog().info("Reproducible Build output summary: "
                    + MessageUtils.buffer().success(ok + " files ok"));
        }

        // save .compare file
        File buildcompare = new File(
                buildinfoFile.getParentFile(), buildinfoFile.getName().replaceFirst(".buildinfo$", ".buildcompare"));
        try (PrintWriter p = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(buildcompare), StandardCharsets.UTF_8)))) {
            p.println("version=" + project.getVersion());
            p.println("ok=" + ok);
            p.println("ko=" + ko);
            p.println("okFiles=\"" + StringUtils.join(okFilenames.iterator(), " ") + '"');
            p.println("koFiles=\"" + StringUtils.join(koFilenames.iterator(), " ") + '"');
            Properties ref = PropertyUtils.loadOptionalProperties(referenceBuildinfo);
            String v = ref.getProperty("java.version");
            if (v != null) {
                p.println("reference_java_version=\"" + v + '"');
            }
            v = ref.getProperty("os.name");
            if (v != null) {
                p.println("reference_os_name=\"" + v + '"');
            }
            for (String diffoscope : diffoscopes) {
                p.print("# ");
                p.println(diffoscope);
            }
            getLog().info("Reproducible Build output comparison saved to " + buildcompare);
        } catch (IOException e) {
            throw new MojoExecutionException("Error creating file " + buildcompare, e);
        }

        copyAggregateToRoot(buildcompare);

        if (ko + missing > 0) {
            throw new MojoExecutionException("Build artifacts are different from reference");
        }
    }