### Eclipse Workspace Patch 1.0 #P HUDSON_1_343 Index: core/src/main/resources/hudson/tasks/ArtifactArchiver/config.properties =================================================================== --- core/src/main/resources/hudson/tasks/ArtifactArchiver/config.properties (revision 6100) +++ core/src/main/resources/hudson/tasks/ArtifactArchiver/config.properties (working copy) @@ -21,3 +21,4 @@ # THE SOFTWARE. lastBuildOnly=Discard all but the last successful/stable artifact to save disk space +zipAll=Compress all artifacts into one zip file \ No newline at end of file Index: core/src/main/java/hudson/tasks/ArtifactArchiver.java =================================================================== --- core/src/main/java/hudson/tasks/ArtifactArchiver.java (revision 7306) +++ core/src/main/java/hudson/tasks/ArtifactArchiver.java (working copy) @@ -23,26 +23,29 @@ */ package hudson.tasks; +import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.Util; -import hudson.Extension; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; -import hudson.model.Result; import hudson.model.Hudson; +import hudson.model.Result; +import hudson.util.DirScanner; import hudson.util.FormValidation; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.AncestorInPath; -import org.kohsuke.stapler.QueryParameter; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import net.sf.json.JSONObject; +import org.kohsuke.stapler.AncestorInPath; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.StaplerRequest; + /** * Copies the artifacts into an archive directory. * @@ -65,14 +68,24 @@ */ private final boolean latestOnly; + /** + * Compress all artifacts in archive directory + */ + private final boolean zip; + private static final Boolean allowEmptyArchive = Boolean.getBoolean(ArtifactArchiver.class.getName()+".warnOnEmpty"); - @DataBoundConstructor public ArtifactArchiver(String artifacts, String excludes, boolean latestOnly) { + this(artifacts,excludes,latestOnly,false); + } + + @DataBoundConstructor + public ArtifactArchiver(String artifacts, String excludes, boolean latestOnly, boolean zip) { this.artifacts = artifacts.trim(); this.excludes = Util.fixEmptyAndTrim(excludes); this.latestOnly = latestOnly; + this.zip = zip; } public String getArtifacts() { @@ -87,6 +100,10 @@ return latestOnly; } + public boolean isZip() { + return zip; + } + private void listenerWarnOrError(BuildListener listener, String message) { if (allowEmptyArchive) { listener.getLogger().println(String.format("WARN: %s", message)); @@ -114,20 +131,28 @@ } String artifacts = build.getEnvironment(listener).expand(this.artifacts); - if(ws.copyRecursiveTo(artifacts,excludes,new FilePath(dir))==0) { - if(build.getResult().isBetterOrEqualTo(Result.UNSTABLE)) { - // If the build failed, don't complain that there was no matching artifact. - // The build probably didn't even get to the point where it produces artifacts. - listenerWarnOrError(listener, Messages.ArtifactArchiver_NoMatchFound(artifacts)); - String msg = ws.validateAntFileMask(artifacts); - if(msg!=null) - listenerWarnOrError(listener, msg); - } - if (!allowEmptyArchive) { - build.setResult(Result.FAILURE); - } - return true; - } + + int nArtif = 0; + if (zip) { + File zipFile = new File(dir, build.getParent().getDisplayName() + "_N" + build.getNumber() + "_" + build.getTime().toString() + ".zip"); + nArtif = ws.zip(new FileOutputStream(zipFile), new DirScanner.Glob(artifacts, excludes)); + } else { + nArtif = ws.copyRecursiveTo(artifacts,excludes,new FilePath(dir)); + } + if(nArtif==0) { + if(build.getResult().isBetterOrEqualTo(Result.UNSTABLE)) { + // If the build failed, don't complain that there was no matching artifact. + // The build probably didn't even get to the point where it produces artifacts. + listenerWarnOrError(listener, Messages.ArtifactArchiver_NoMatchFound(artifacts)); + String msg = ws.validateAntFileMask(artifacts); + if(msg!=null) + listenerWarnOrError(listener, msg); + } + if (!allowEmptyArchive) { + build.setResult(Result.FAILURE); + } + return true; + } } catch (IOException e) { Util.displayIOException(e,listener); e.printStackTrace(listener.error( Index: core/src/main/resources/hudson/tasks/ArtifactArchiver/config.jelly =================================================================== --- core/src/main/resources/hudson/tasks/ArtifactArchiver/config.jelly (revision 6100) +++ core/src/main/resources/hudson/tasks/ArtifactArchiver/config.jelly (working copy) @@ -34,5 +34,9 @@ + + + + \ No newline at end of file