From bbc7ea5b1e879bd1aafd1e011f780deebd6fdf8e Mon Sep 17 00:00:00 2001 From: Robert Shade Date: Mon, 17 Sep 2018 11:31:18 -0400 Subject: [PATCH 1/6] Fix JENKINS-41704: Fix linking owner of persisted results. --- .../util/AbstractCppcheckBuildAction.java | 17 +++++++++++++++-- .../plugins/cppcheck/CppcheckBuildAction.java | 7 +++++++ .../plugins/cppcheck/CppcheckResult.java | 4 ++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java b/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java index a77891b..2e102cc 100644 --- a/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java +++ b/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java @@ -24,9 +24,10 @@ import hudson.model.*; import org.kohsuke.stapler.StaplerProxy; +import jenkins.model.RunAction2; -public abstract class AbstractCppcheckBuildAction extends Actionable implements Action, HealthReportingAction, StaplerProxy { - protected Run owner; +public abstract class AbstractCppcheckBuildAction extends Actionable implements RunAction2, HealthReportingAction, StaplerProxy { + protected transient Run owner; protected AbstractCppcheckBuildAction(Run owner) { this.owner = owner; @@ -49,4 +50,16 @@ public T getPreviousResult() { public Run getOwner() { return owner; } + + public void setOwner(Run owner) { + this.owner = owner; + } + + public void onAttached(Run r) { + setOwner(r); + } + + public void onLoad(Run r) { + setOwner(r); + } } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java index e442151..0c16d0b 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java @@ -123,4 +123,11 @@ private Object readResolve() { public Collection getProjectActions() { return this.projectActions; } + + @Override + public void setOwner(Run owner) { + super.setOwner(owner); + + this.result.setOwner(owner); + } } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java index 58df0da..1f67de3 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java @@ -119,6 +119,10 @@ public CppcheckStatistics getStatistics() { return owner; } + public void setOwner(Run owner) { + this.owner = owner; + } + public CppcheckSourceContainer getCppcheckSourceContainer() { return lazyLoadSourceContainer(); } From a826b1d8de38c140b33b39969be096b558e73bc9 Mon Sep 17 00:00:00 2001 From: Robert Shade Date: Thu, 20 Sep 2018 14:07:36 -0400 Subject: [PATCH 2/6] Fix JENKINS-41704: Handle issues with obtaining a graph configuration --- .../plugins/cppcheck/CppcheckBuildAction.java | 29 ++-- .../cppcheck/CppcheckProjectAction.java | 152 +++++++----------- .../plugins/cppcheck/CppcheckResult.java | 2 +- .../util/AbstractCppcheckProjectAction.java | 20 +-- 4 files changed, 89 insertions(+), 114 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java index 0c16d0b..c59ebc5 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import com.thalesgroup.hudson.plugins.cppcheck.util.AbstractCppcheckBuildAction; @@ -17,6 +18,8 @@ import org.jenkinsci.plugins.cppcheck.config.CppcheckConfigSeverityEvaluation; import org.jenkinsci.plugins.cppcheck.util.CppcheckBuildHealthEvaluator; +import javax.annotation.Nonnull; + /** * @author Gregory Boissinot */ @@ -24,9 +27,9 @@ public class CppcheckBuildAction extends AbstractCppcheckBuildAction implements public static final String URL_NAME = "cppcheckResult"; - private CppcheckResult result; + private final CppcheckResult result; + private final CppcheckConfig config; - private List projectActions; /** * The health report percentage. * @@ -34,15 +37,14 @@ public class CppcheckBuildAction extends AbstractCppcheckBuildAction implements */ private int healthReportPercentage; - public CppcheckBuildAction(Run owner, CppcheckResult result, CppcheckConfig config, + public CppcheckBuildAction(@Nonnull Run owner, @Nonnull CppcheckResult result, @Nonnull CppcheckConfig config, int healthReportPercentage) { super(owner); + this.result = result; + this.config = config; this.healthReportPercentage = healthReportPercentage; - - List projectActions = new ArrayList<>(); - projectActions.add(new CppcheckProjectAction(owner, config.getConfigGraph())); - this.projectActions = projectActions; + } public String getIconFileName() { @@ -65,6 +67,10 @@ public CppcheckResult getResult() { return this.result; } + public CppcheckConfig getConfig() { + return this.config; + } + Run getBuild() { return this.owner; } @@ -121,11 +127,16 @@ private Object readResolve() { @Override public Collection getProjectActions() { - return this.projectActions; + + if (this.owner == null) { + return Collections.emptySet(); + } else { + return Collections.singleton(new CppcheckProjectAction(owner.getParent())); + } } @Override - public void setOwner(Run owner) { + public synchronized void setOwner(Run owner) { super.setOwner(owner); this.result.setOwner(owner); diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java index f97757f..48c95d6 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.Calendar; +import javax.annotation.Nonnull; import hudson.model.AbstractProject; import hudson.model.Job; import hudson.model.Run; @@ -21,77 +22,38 @@ * @author Gregory Boissinot */ public class CppcheckProjectAction extends AbstractCppcheckProjectAction { - /** Cppcheck graph configuration. */ - private final CppcheckConfigGraph configGraph; public String getSearchUrl() { return getUrlName(); } - public CppcheckProjectAction(final Run run, - CppcheckConfigGraph configGraph) { - super(run); - this.configGraph = configGraph; - } - private boolean isRunCompleted(Run run) { - if (run == null) { - return false; - } - - if (run.isBuilding()) { - return false; - } - - if (run.getResult() == Result.SUCCESS || run.getResult() == Result.UNSTABLE) { - return true; - } - - return false; + public CppcheckProjectAction(@Nonnull final Job job) { + super(job); } - + + @Override public Run getLastFinishedBuild() { - // get the very last build - no matter of its result or buildstate and search towards previous builds until the first successful or unstable result was found. - Run prevCompletedRun = run.getPreviousBuild(); - - Run lastRun = prevCompletedRun; - if (lastRun != null) - { - while(lastRun != null && lastRun.getNextBuild() != null) { - lastRun = lastRun.getNextBuild(); - } - } - else - { - return prevCompletedRun; - } - - while(lastRun != null) { - if (isRunCompleted(lastRun)) { - return lastRun; - - } - lastRun = lastRun.getPreviousBuild(); - } - return null; - } + Run lastBuild = getJob().getLastBuild(); + while (lastBuild != null + && (lastBuild.isBuilding() || lastBuild.getAction(CppcheckBuildAction.class) == null)) + { + lastBuild = lastBuild.getPreviousBuild(); + } - public final Run getProject() { - CppcheckBuildAction lastAction = getLastFinishedBuildAction(); - return (lastAction != null) ? lastAction.getOwner() : null; - } - - public Run getRun() { - return super.run; + return lastBuild; } - /** - * Get build action of the last finished build. - * - * @return the build action or null - */ - public CppcheckBuildAction getLastFinishedBuildAction() { - Run lastBuild = getLastFinishedBuild(); - return (lastBuild != null) ? lastBuild.getAction(CppcheckBuildAction.class) : null; + + @Override + public Run getLastResultBuild() { + for (Run b = getJob().getLastBuild(); b != null; b = b.getPreviousBuiltBuild()) + { + CppcheckBuildAction r = b.getAction(CppcheckBuildAction.class); + + if (r != null) + return b; + } + return null; } public final boolean isDisplayGraph() { @@ -101,36 +63,24 @@ public final boolean isDisplayGraph() { return false; } - //Affect previous - b = b.getPreviousBuild(); - if (b != null) { - - for (; b != null; b = b.getPreviousBuild()) { - if (b.getResult().isWorseOrEqualTo(Result.FAILURE)) { - continue; - } - CppcheckBuildAction action = b.getAction(CppcheckBuildAction.class); - if (action == null || action.getResult() == null) { - continue; - } - CppcheckResult result = action.getResult(); - if (result == null) - continue; - - return true; - } - } - return false; - } + // Affect previous + for (b = b.getPreviousBuild(); b != null; b = b.getPreviousBuild()) + { + if (b.getResult() == null || b.getResult().isWorseOrEqualTo(Result.FAILURE)) + continue; - public Integer getLastResultBuild() { - Run b = getLastFinishedBuild(); - if (b != null) { - return b.getNumber(); - } - return null; - } + CppcheckBuildAction action = b.getAction(CppcheckBuildAction.class); + if (action == null || + action.getResult() == null || + action.getConfig() == null || + action.getConfig().getConfigGraph() == null) + continue; + return true; + } + + return false; + } public String getDisplayName() { return Messages.cppcheck_CppcheckResults(); @@ -153,17 +103,29 @@ public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException return; } - Graph g = new CppcheckGraph(lastBuild, getDataSetBuilder().build(), - Messages.cppcheck_NumberOfErrors(), - configGraph.getXSize(), - configGraph.getYSize()); + Run lastBuildWithResult = getLastResultBuild(); + CppcheckBuildAction lastAction = lastBuildWithResult.getAction(CppcheckBuildAction.class); + CppcheckConfigGraph configGraph = (lastAction != null) ? + ((lastAction.getConfig() != null) ? + lastAction.getConfig().getConfigGraph() : null) : null; + + if (configGraph == null) { + rsp.sendRedirect2(req.getContextPath() + "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/images/headless.png"); + return; + } + + Graph g = new CppcheckGraph(lastBuild, getDataSetBuilder(configGraph).build(), Messages.cppcheck_NumberOfErrors(), + configGraph.getXSize(), configGraph.getYSize()); g.doPng(req, rsp); } - private DataSetBuilder getDataSetBuilder() { + private DataSetBuilder getDataSetBuilder(CppcheckConfigGraph configGraph) { DataSetBuilder dsb = new DataSetBuilder(); + if (configGraph == null) + return dsb; + Run lastBuild = getLastFinishedBuild(); CppcheckBuildAction lastAction = lastBuild.getAction(CppcheckBuildAction.class); @@ -171,7 +133,7 @@ private DataSetBuilder getDataSetBuilder // numBuildsInGraph <= 1 means unlimited for (CppcheckBuildAction a = lastAction; - a != null && (configGraph.getNumBuildsInGraph() <= 1 || numBuilds < configGraph.getNumBuildsInGraph()); + (a != null) && (configGraph.getNumBuildsInGraph() <= 1 || numBuilds < configGraph.getNumBuildsInGraph()); a = a.getPreviousResult(), ++numBuilds) { ChartUtil.NumberOnlyBuildLabel label = new ChartUtil.NumberOnlyBuildLabel(a.getOwner()); diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java index 1f67de3..82a8727 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java @@ -119,7 +119,7 @@ public CppcheckStatistics getStatistics() { return owner; } - public void setOwner(Run owner) { + public synchronized void setOwner(Run owner) { this.owner = owner; } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java index 1157b41..aa8d2ec 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java @@ -1,27 +1,29 @@ package org.jenkinsci.plugins.cppcheck.util; import hudson.model.Actionable; +import hudson.model.ProminentProjectAction; +import hudson.model.Job; import hudson.model.Run; -import hudson.model.Action; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import java.io.IOException; +import javax.annotation.Nonnull; /** * @author Gregory Boissinot */ -public abstract class AbstractCppcheckProjectAction extends Actionable implements Action { +public abstract class AbstractCppcheckProjectAction extends Actionable implements ProminentProjectAction { - protected final Run run; + protected final transient Job job; - public AbstractCppcheckProjectAction(Run run) { - this.run = run; + public AbstractCppcheckProjectAction(@Nonnull Job job) { + this.job = job; } - public Run getRun() { - return run; + @Nonnull public Job getJob() { + return job; } public String getIconFileName() { @@ -34,12 +36,12 @@ public String getSearchUrl() { protected abstract Run getLastFinishedBuild(); - protected abstract Integer getLastResultBuild(); + protected abstract Run getLastResultBuild(); public abstract void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException; public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException { - Integer buildNumber = getLastResultBuild(); + Integer buildNumber = (getLastResultBuild() != null) ? getLastResultBuild().getNumber() : null; if (buildNumber == null) { rsp.sendRedirect2("nodata"); } else { From a0abce0d5038f00cea37ba8f19bad4dc82f665f0 Mon Sep 17 00:00:00 2001 From: Robert Shade Date: Mon, 24 Sep 2018 21:11:58 -0400 Subject: [PATCH 3/6] Findbugs fix --- .../java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java index 82a8727..5eb6133 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java @@ -115,7 +115,7 @@ public CppcheckStatistics getStatistics() { return statistics; } - public Run getOwner() { + public synchronized Run getOwner() { return owner; } From 6ace432cb1b6e8d06f67a864aa3fba8f46dfa644 Mon Sep 17 00:00:00 2001 From: Marco Steffan Date: Sat, 10 Aug 2019 10:43:28 +0200 Subject: [PATCH 4/6] Change dependencies to support Java 11 --- pom.xml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 7f99824..d71cd31 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.jenkins-ci.plugins plugin - 3.9 + 3.43 cppcheck @@ -48,15 +48,14 @@ UTF-8 1.6 1.6 - 2.2.1 - 2.2.1.1 + 2.3.0 2.1 5.0 4.12 1.8.5 2.0 2.60.3 - 7 + 8 @@ -80,16 +79,12 @@ structs 1.7 - - javax.xml.bind - jaxb-api - ${jaxb.api.version} - + - com.sun.xml.bind - jaxb-impl - ${jaxb.impl.version} + io.jenkins.plugins + jaxb + ${jaxb.version} From 52e4da4b4cc3ab08b5800e2fd5b989d6d00eadf8 Mon Sep 17 00:00:00 2001 From: Marco Steffan Date: Sat, 17 Aug 2019 10:41:32 +0200 Subject: [PATCH 5/6] [maven-release-plugin] prepare release cppcheck-1.25 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d71cd31..37fe008 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ cppcheck hpi Jenkins Cppcheck Plug-in - 1.25-SNAPSHOT + 1.25 http://wiki.jenkins-ci.org/display/JENKINS/Cppcheck+Plugin @@ -41,7 +41,7 @@ scm:git:git://github.com/jenkinsci/cppcheck-plugin.git scm:git:git@github.com:jenkinsci/cppcheck-plugin.git https://github.com/jenkinsci/cppcheck-plugin - HEAD + cppcheck-1.25 From 0d98b79243e50e994975e31e9157747cd2664f7c Mon Sep 17 00:00:00 2001 From: Marco Steffan Date: Sat, 17 Aug 2019 10:41:53 +0200 Subject: [PATCH 6/6] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 37fe008..32e45ba 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ cppcheck hpi Jenkins Cppcheck Plug-in - 1.25 + 1.26-SNAPSHOT http://wiki.jenkins-ci.org/display/JENKINS/Cppcheck+Plugin @@ -41,7 +41,7 @@ scm:git:git://github.com/jenkinsci/cppcheck-plugin.git scm:git:git@github.com:jenkinsci/cppcheck-plugin.git https://github.com/jenkinsci/cppcheck-plugin - cppcheck-1.25 + HEAD