diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index a3abe02d46..fdca5388ba 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -1879,7 +1879,7 @@ public final class FilePath implements Serializable { /** * Copies files according to a specified scanner to a target node. - * @param scanner a way of enumerating some files + * @param scanner a way of enumerating some files (must be serializable for possible delivery to remote side) * @param target the destination basedir * @param description a description of the fileset, for logging purposes * @return the number of files copied diff --git a/core/src/main/java/jenkins/model/StandardArtifactManager.java b/core/src/main/java/jenkins/model/StandardArtifactManager.java index 220f1dc2e9..480e68f451 100644 --- a/core/src/main/java/jenkins/model/StandardArtifactManager.java +++ b/core/src/main/java/jenkins/model/StandardArtifactManager.java @@ -53,17 +53,23 @@ public class StandardArtifactManager extends ArtifactManager { @Override public void archive(Run build, FilePath workspace, Launcher launcher, BuildListener listener, final Map artifacts) throws IOException, InterruptedException { File dir = getArtifactsDir(build); String description = "transfer of " + artifacts.size() + " files"; // TODO improve when just one file - workspace.copyRecursiveTo(new DirScanner() { - @Override public void scan(File dir, FileVisitor visitor) throws IOException { - for (Map.Entry entry : artifacts.entrySet()) { - String archivedPath = entry.getKey(); - assert archivedPath.indexOf('\\') == -1; - String workspacePath = entry.getValue(); - assert workspacePath.indexOf('\\') == -1; - scanSingle(new File(dir, workspacePath), archivedPath, visitor); - } + workspace.copyRecursiveTo(new ExplicitlySpecifiedDirScanner(artifacts), new FilePath(dir), description); + } + private static class ExplicitlySpecifiedDirScanner extends DirScanner { + private static final long serialVersionUID = 1; + private final Map artifacts; + ExplicitlySpecifiedDirScanner(Map artifacts) { + this.artifacts = artifacts; + } + @Override public void scan(File dir, FileVisitor visitor) throws IOException { + for (Map.Entry entry : artifacts.entrySet()) { + String archivedPath = entry.getKey(); + assert archivedPath.indexOf('\\') == -1; + String workspacePath = entry.getValue(); + assert workspacePath.indexOf('\\') == -1; + scanSingle(new File(dir, workspacePath), archivedPath, visitor); } - }, new FilePath(dir), description); + } } @Override public boolean deleteArtifacts(Run build) throws IOException, InterruptedException {