From 80abb986406e1147126c9241ba754abdf0f3f523 Mon Sep 17 00:00:00 2001 From: Sam Van Oort Date: Mon, 24 Aug 2015 23:37:43 +0200 Subject: [PATCH 1/8] Merge PR #1788: Make plugin manager pluggable Squashed commit of the following: commit f2c6ad272fe9bd3b93e21001be63694f2b8841ec Author: Sam Van Oort Date: Thu Aug 20 18:28:09 2015 -0400 After much discussion, just remove the helper method to let a plugin manager override easily get instance of the PluginManager commit a96f933d8dcd1bf2f02b216ccf0a6517bb649121 Author: Sam Van Oort Date: Thu Aug 20 16:59:07 2015 -0400 Add javadocs and restrict access on the PluginManagerStaplerOverride getManager method commit 7e1facf887ab1b3219b116cac42a785c99b2a635 Author: Sam Van Oort Date: Thu Aug 20 12:50:47 2015 -0400 Simplify plugin manager test using @TestExtension commit b9f2841f6d3453a2b9a38ec3d90247ce8020add3 Author: Sam Van Oort Date: Thu Aug 20 10:32:49 2015 -0400 Modify the Since version for pluginmanager overrides commit 3af45ce579310f157f4cc3ee128a14a33bd4e480 Author: Sam Van Oort Date: Thu Aug 20 10:28:14 2015 -0400 Add test for PluginManagerStaplerOverride commit 786409456590026cb2c4f56f687bae71d05990d8 Author: Sam Van Oort Date: Mon Aug 17 20:59:33 2015 -0400 Changes from review, mostly comments and rename of class commit 1c23f086eced9fb46a7c643174a50f71bc64ec37 Author: Sam Van Oort Date: Mon Aug 17 12:58:07 2015 -0400 Cleanup for PluginManager extensibility/UI overrides commit e105a13bcf9324c87d896ddc04ae03f905dd0f0a Author: Sam Van Oort Date: Fri Aug 14 15:23:07 2015 -0400 Different approach to plugin manager UX pluggability, using Extension and StaplerOverridable commit 81f21fba08a170a0f11bb88b769d6b8c69e4d1c0 Author: Sam Van Oort Date: Thu Aug 13 21:32:45 2015 -0400 Initial round of changes to allow overriding PluginManager This includes renaming the setTarget method to setUIProxy and defining an interface to retain APIs Fields have not been mapped through yet as that is still in progress Also, an AbstractStaplerUIProxy has been defined to delegate Stapler bound calls to the pluginManager commit eeef666de718ddfca04895108f5015eb13729e5e Author: Sam Van Oort Date: Wed Aug 5 17:40:50 2015 -0400 Make plugin manager pluggable --- core/src/main/java/hudson/PluginManager.java | 13 +++++- .../hudson/PluginManagerStaplerOverride.java | 28 +++++++++++++ .../core/PluginManagerOverrideTest.java | 41 +++++++++++++++++++ .../BasicPluginManagerOverride/newview.jelly | 6 +++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/hudson/PluginManagerStaplerOverride.java create mode 100644 test/src/main/java/hudson/core/PluginManagerOverrideTest.java create mode 100644 test/src/main/resources/hudson/core/PluginManagerOverrideTest/BasicPluginManagerOverride/newview.jelly diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 443716eed586..423f0e41be0b 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -71,6 +71,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.StaplerOverridable; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; @@ -128,7 +129,7 @@ * @author Kohsuke Kawaguchi */ @ExportedBean -public abstract class PluginManager extends AbstractModelObject implements OnMaster { +public abstract class PluginManager extends AbstractModelObject implements OnMaster, StaplerOverridable { /** * All discovered plugins. */ @@ -215,6 +216,16 @@ public Api getApi() { return new Api(this); } + /** + * Find all registered overrides (intended to allow overriding/adding views) + * @return List of extensions + * @since 1.626 + */ + @Override + public Collection getOverrides() { + return PluginManagerStaplerOverride.all(); + } + /** * Called immediately after the construction. * This is a separate method so that code executed from here will see a valid value in diff --git a/core/src/main/java/hudson/PluginManagerStaplerOverride.java b/core/src/main/java/hudson/PluginManagerStaplerOverride.java new file mode 100644 index 000000000000..c53f9ed6ae68 --- /dev/null +++ b/core/src/main/java/hudson/PluginManagerStaplerOverride.java @@ -0,0 +1,28 @@ +package hudson; + +import jenkins.model.Jenkins; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Extension point for selectively overriding parts of the {@link PluginManager} views + * Anything extending this and registered with an @Extension can replace existing views and define new views. + * + * It is also possible to add/modify API calls coming via Stapler, but this requires caution. + * + * In both cases, this is simply done by defining a resource or method that matches the existing one + * + * @author Sam Van Oort + * @since 1.626 + */ +public abstract class PluginManagerStaplerOverride implements ExtensionPoint { + + /** + * Return all implementations of this extension point + * @return All implementations of this extension point + */ + public static @Nonnull ExtensionList all() { + return ExtensionList.lookup(PluginManagerStaplerOverride.class); + } +} diff --git a/test/src/main/java/hudson/core/PluginManagerOverrideTest.java b/test/src/main/java/hudson/core/PluginManagerOverrideTest.java new file mode 100644 index 000000000000..7cf367477830 --- /dev/null +++ b/test/src/main/java/hudson/core/PluginManagerOverrideTest.java @@ -0,0 +1,41 @@ +package hudson.core; + +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.PluginManagerStaplerOverride; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; + +import static org.junit.Assert.*; + + +/** + * Verify that the PluginManagerStaplerOverride extensions register and allow safely modifying PluginManager views + * @author Sam Van Oort + */ +public class PluginManagerOverrideTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void testViewOverrides() throws Exception { + // Verify extension registered correctly and comes back in overrides + assertEquals(1,PluginManagerStaplerOverride.all().size()); + assertTrue(PluginManagerStaplerOverride.all().get(0) instanceof BasicPluginManagerOverride); + + // Verify we can load untouched resources + JenkinsRule.WebClient client = j.createWebClient(); + assertEquals(200, client.goTo("self/pluginManager/available").getWebResponse().getStatusCode()); + + // Verify new view loads + HtmlPage p = j.createWebClient().goTo("self/pluginManager/newview"); + assertEquals("LoremIpsum", p.getElementById("dummyElement").getTextContent()); + } + + /** Micro-implementation simply to allow adding a view resource */ + @TestExtension("testViewOverrides") + public static class BasicPluginManagerOverride extends PluginManagerStaplerOverride { + } +} diff --git a/test/src/main/resources/hudson/core/PluginManagerOverrideTest/BasicPluginManagerOverride/newview.jelly b/test/src/main/resources/hudson/core/PluginManagerOverrideTest/BasicPluginManagerOverride/newview.jelly new file mode 100644 index 000000000000..e8c7438fe76a --- /dev/null +++ b/test/src/main/resources/hudson/core/PluginManagerOverrideTest/BasicPluginManagerOverride/newview.jelly @@ -0,0 +1,6 @@ + + + + +
LoremIpsum
+
\ No newline at end of file From 2c0d1a1fdb6484c2dbbd23443e7a351ec9d860f1 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Aug 2015 00:08:47 +0200 Subject: [PATCH 2/8] Fix at-since from PR #1788 --- core/src/main/java/hudson/PluginManager.java | 2 +- core/src/main/java/hudson/PluginManagerStaplerOverride.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 423f0e41be0b..623de0f13797 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -219,7 +219,7 @@ public Api getApi() { /** * Find all registered overrides (intended to allow overriding/adding views) * @return List of extensions - * @since 1.626 + * @since 1.627 */ @Override public Collection getOverrides() { diff --git a/core/src/main/java/hudson/PluginManagerStaplerOverride.java b/core/src/main/java/hudson/PluginManagerStaplerOverride.java index c53f9ed6ae68..2de4ef90eded 100644 --- a/core/src/main/java/hudson/PluginManagerStaplerOverride.java +++ b/core/src/main/java/hudson/PluginManagerStaplerOverride.java @@ -14,7 +14,7 @@ * In both cases, this is simply done by defining a resource or method that matches the existing one * * @author Sam Van Oort - * @since 1.626 + * @since 1.627 */ public abstract class PluginManagerStaplerOverride implements ExtensionPoint { From 03bd5959cb94a0e626c5ace910d14c3083a9db2c Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 24 Apr 2015 00:18:11 +0300 Subject: [PATCH 3/8] Revert "Revert "[JENKINS-10629] - Migrate the Tar archives handling code to commons-compress"" This reverts commit 8f1280a85c54ea6150b15c38303464ab23b32e92. --- core/pom.xml | 5 +++ core/src/main/java/hudson/FilePath.java | 32 ++++--------- .../org/apache/tools/tar/TarInputStream.java | 3 +- .../org/apache/tools/tar/TarOutputStream.java | 3 ++ .../main/java/hudson/util/io/TarArchiver.java | 45 ++++++------------- 5 files changed, 33 insertions(+), 55 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index ed8e8cd3083b..a230835039ab 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -276,6 +276,11 @@ THE SOFTWARE. commons-beanutils 1.8.3 + + org.apache.commons + commons-compress + 1.9 + javax.mail mail diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index ca137d2e1160..07fdc9d17ced 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -33,7 +33,6 @@ import hudson.model.Computer; import hudson.model.Item; import hudson.model.TaskListener; -import hudson.org.apache.tools.tar.TarInputStream; import hudson.os.PosixAPI; import hudson.os.PosixException; import hudson.remoting.Callable; @@ -70,7 +69,6 @@ import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; -import org.apache.tools.tar.TarEntry; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.kohsuke.stapler.Stapler; @@ -120,6 +118,8 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import jenkins.security.MasterToSlaveCallable; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; @@ -2268,12 +2268,15 @@ private Integer writeToTar(File baseDir, DirScanner scanner, OutputStream out) t /** * Reads from a tar stream and stores obtained files to the base dir. + * @since TODO supports large files > 10 GB, migration to commons-compress */ private void readFromTar(String name, File baseDir, InputStream in) throws IOException { - TarInputStream t = new TarInputStream(in); + TarArchiveInputStream t = new TarArchiveInputStream(in); + + // TarInputStream t = new TarInputStream(in); try { - TarEntry te; - while ((te = t.getNextEntry()) != null) { + TarArchiveEntry te; + while ((te = t.getNextTarEntry()) != null) { File f = new File(baseDir,te.getName()); if(te.isDirectory()) { mkdirs(f); @@ -2282,8 +2285,7 @@ private void readFromTar(String name, File baseDir, InputStream in) throws IOExc if (parent != null) mkdirs(parent); writing(f); - byte linkFlag = (Byte) LINKFLAG_FIELD.get(te); - if (linkFlag==TarEntry.LF_SYMLINK) { + if (te.isSymbolicLink()) { new FilePath(f).symlinkTo(te.getLinkName(), TaskListener.NULL); } else { IOUtils.copy(t,f); @@ -2300,8 +2302,6 @@ private void readFromTar(String name, File baseDir, InputStream in) throws IOExc } catch (InterruptedException e) { Thread.currentThread().interrupt(); // process this later throw new IOException("Failed to extract "+name,e); - } catch (IllegalAccessException e) { - throw new IOException("Failed to extract "+name,e); } finally { t.close(); } @@ -2725,20 +2725,6 @@ public int compare(String o1, String o2) { } }; - private static final Field LINKFLAG_FIELD = getTarEntryLinkFlagField(); - - private static Field getTarEntryLinkFlagField() { - try { - Field f = TarEntry.class.getDeclaredField("linkFlag"); - f.setAccessible(true); - return f; - } catch (SecurityException e) { - throw new AssertionError(e); - } catch (NoSuchFieldException e) { - throw new AssertionError(e); - } - } - /** * Gets the {@link FilePath} representation of the "~" directory * (User's home directory in the Unix sense) of the given channel. diff --git a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java index f2d10c1c3996..d7d8a5b54da3 100644 --- a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java +++ b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java @@ -37,8 +37,9 @@ * methods are provided to position at each successive entry in * the archive, and the read each entry as a normal input stream * using read(). - * + * @deprecated Use {@link org.apache.commons.compress.archivers.tar.TarArchiveInputStream} instead */ +@Deprecated public class TarInputStream extends FilterInputStream { // CheckStyle:VisibilityModifier OFF - bc diff --git a/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java b/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java index f23e44262847..48f4876bd45c 100644 --- a/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java +++ b/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java @@ -35,8 +35,11 @@ * The TarOutputStream writes a UNIX tar archive as an OutputStream. * Methods are provided to put entries, and then write their contents * by writing to this stream using write(). + * + * @deprecated Use {@link org.apache.commons.compress.archivers.tar.TarArchiveOutputStream} instead * */ +@Deprecated public class TarOutputStream extends FilterOutputStream { /** Fail if a long file name is required in the archive. */ public static final int LONGFILE_ERROR = 0; diff --git a/core/src/main/java/hudson/util/io/TarArchiver.java b/core/src/main/java/hudson/util/io/TarArchiver.java index 7e7a3dd4f0ec..00f75bee0748 100644 --- a/core/src/main/java/hudson/util/io/TarArchiver.java +++ b/core/src/main/java/hudson/util/io/TarArchiver.java @@ -37,6 +37,8 @@ import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import static org.apache.tools.tar.TarConstants.LF_SYMLINK; @@ -47,10 +49,10 @@ */ final class TarArchiver extends Archiver { private final byte[] buf = new byte[8192]; - private final TarOutputStream tar; + private final TarArchiveOutputStream tar; TarArchiver(OutputStream out) { - tar = new TarOutputStream(new BufferedOutputStream(out) { + tar = new TarArchiveOutputStream(new BufferedOutputStream(out) { // TarOutputStream uses TarBuffer internally, // which flushes the stream for each block. this creates unnecessary // data stream fragmentation, and flush request to a remote, which slows things down. @@ -58,13 +60,13 @@ final class TarArchiver extends Archiver { public void flush() throws IOException { // so don't do anything in flush } - }); - tar.setLongFileMode(TarOutputStream.LONGFILE_GNU); + }); + tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); } @Override public void visitSymlink(File link, String target, String relativePath) throws IOException { - TarEntry e = new TarEntry(relativePath, LF_SYMLINK); + TarArchiveEntry e = new TarArchiveEntry(relativePath, LF_SYMLINK); try { int mode = IOUtils.mode(link); if (mode != -1) { @@ -73,16 +75,11 @@ public void visitSymlink(File link, String target, String relativePath) throws I } catch (PosixException x) { // ignore } + + e.setLinkName(target); - try { - StringBuffer linkName = (StringBuffer) LINKNAME_FIELD.get(e); - linkName.setLength(0); - linkName.append(target); - } catch (IllegalAccessException x) { - throw new IOException("Failed to set linkName", x); - } - - tar.putNextEntry(e); + tar.putArchiveEntry(e); + tar.closeArchiveEntry(); entriesWritten++; } @@ -97,14 +94,14 @@ public void visit(File file, String relativePath) throws IOException { if(file.isDirectory()) relativePath+='/'; - TarEntry te = new TarEntry(relativePath); + TarArchiveEntry te = new TarArchiveEntry(relativePath); int mode = IOUtils.mode(file); if (mode!=-1) te.setMode(mode); te.setModTime(file.lastModified()); if(!file.isDirectory()) te.setSize(file.length()); - tar.putNextEntry(te); + tar.putArchiveEntry(te); if (!file.isDirectory()) { FileInputStream in = new FileInputStream(file); @@ -117,25 +114,11 @@ public void visit(File file, String relativePath) throws IOException { } } - tar.closeEntry(); + tar.closeArchiveEntry(); entriesWritten++; } public void close() throws IOException { tar.close(); } - - private static final Field LINKNAME_FIELD = getTarEntryLinkNameField(); - - private static Field getTarEntryLinkNameField() { - try { - Field f = TarEntry.class.getDeclaredField("linkName"); - f.setAccessible(true); - return f; - } catch (SecurityException e) { - throw new AssertionError(e); - } catch (NoSuchFieldException e) { - throw new AssertionError(e); - } - } } From 2ef29215c2b311a9d5c2e515268285b5623ce833 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 24 Apr 2015 00:18:32 +0300 Subject: [PATCH 4/8] Revert "Revert "FIXED JENKINS-10629] - Enable BigNumber mode to support archiving of files with size >8Gb"" This reverts commit ee57300963ca0137565f61fe314d459b627ad74b. --- core/src/main/java/hudson/util/io/TarArchiver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/util/io/TarArchiver.java b/core/src/main/java/hudson/util/io/TarArchiver.java index 00f75bee0748..4cfa5ce98759 100644 --- a/core/src/main/java/hudson/util/io/TarArchiver.java +++ b/core/src/main/java/hudson/util/io/TarArchiver.java @@ -61,6 +61,7 @@ public void flush() throws IOException { // so don't do anything in flush } }); + tar.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR); tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); } From 3e187a026408d5ca74202f7e26dd565cde2e87d0 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 23 Apr 2015 23:45:19 +0300 Subject: [PATCH 5/8] [FIXED JENKINS-10629] Unbroke stream with new tar implementation. Causes bytes lost and truncated tar archive. TarBuffer not used in TarArchiveOutputStream. --- .../main/java/hudson/util/io/TarArchiver.java | 10 +----- core/src/test/java/hudson/FilePathTest.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/util/io/TarArchiver.java b/core/src/main/java/hudson/util/io/TarArchiver.java index 4cfa5ce98759..600a16cba67f 100644 --- a/core/src/main/java/hudson/util/io/TarArchiver.java +++ b/core/src/main/java/hudson/util/io/TarArchiver.java @@ -52,15 +52,7 @@ final class TarArchiver extends Archiver { private final TarArchiveOutputStream tar; TarArchiver(OutputStream out) { - tar = new TarArchiveOutputStream(new BufferedOutputStream(out) { - // TarOutputStream uses TarBuffer internally, - // which flushes the stream for each block. this creates unnecessary - // data stream fragmentation, and flush request to a remote, which slows things down. - @Override - public void flush() throws IOException { - // so don't do anything in flush - } - }); + tar = new TarArchiveOutputStream(out); tar.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR); tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); } diff --git a/core/src/test/java/hudson/FilePathTest.java b/core/src/test/java/hudson/FilePathTest.java index 801e184906a8..43f48eafb9e1 100644 --- a/core/src/test/java/hudson/FilePathTest.java +++ b/core/src/test/java/hudson/FilePathTest.java @@ -659,4 +659,35 @@ private InputStream someZippedContent() throws IOException { // test conflict subdir src.moveAllChildrenTo(dst); } + + @Issue("JENKINS-10629") + @Test + public void testEOFbrokenFlush() throws IOException, InterruptedException { + final File srcFolder = temp.newFolder("src"); + // simulate magic structure with magic sizes: + // |- dir/pom.xml (2049) + // |- pom.xml (2049) + // \- small.tar (1537) + final File smallTar = new File(srcFolder, "small.tar"); + givenSomeContentInFile(smallTar, 1537); + final File dir = new File(srcFolder, "dir"); + dir.mkdirs(); + final File pomFile = new File(dir, "pom.xml"); + givenSomeContentInFile(pomFile, 2049); + FileUtils.copyFileToDirectory(pomFile, srcFolder); + + final File archive = temp.newFile("archive.tar"); + + // Compress archive + final FilePath tmpDirPath = new FilePath(srcFolder); + int tarred = tmpDirPath.tar(new FileOutputStream(archive), "**"); + assertEquals("One file should have been compressed", 3, tarred); + + // Decompress + final File dstFolder = temp.newFolder("dst"); + dstFolder.mkdirs(); + FilePath outDir = new FilePath(dstFolder); + // and now fail when flush is bad! + tmpDirPath.child("../" + archive.getName()).untar(outDir, TarCompression.NONE); + } } From bfa6d8be0cdb077b9fe9a341812e075e729f78ab Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 24 Aug 2015 03:06:37 +0300 Subject: [PATCH 6/8] Remove hardcode in tar test --- core/src/test/java/hudson/FilePathTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/hudson/FilePathTest.java b/core/src/test/java/hudson/FilePathTest.java index 43f48eafb9e1..daae3fcf6fc6 100644 --- a/core/src/test/java/hudson/FilePathTest.java +++ b/core/src/test/java/hudson/FilePathTest.java @@ -371,7 +371,7 @@ private void checkTarUntarRoundTrip(String filePrefix, long fileSize) throws Exc // Decompress FilePath outDir = new FilePath(temp.newFolder(filePrefix + "_out")); final FilePath outFile = outDir.child(tempFile.getName()); - tmpDirPath.child( filePrefix + ".tar").untar(outDir, TarCompression.NONE); + tmpDirPath.child(tarFile.getName()).untar(outDir, TarCompression.NONE); assertEquals("Result file after the roundtrip differs from the initial file", new FilePath(tempFile).digest(), outFile.digest()); } From 79bf40bc2d91ffd642cb9639422d4e3842bc068c Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Aug 2015 00:13:57 +0200 Subject: [PATCH 7/8] Noting #1788 --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index 219bed655b84..50483e607e0b 100644 --- a/changelog.html +++ b/changelog.html @@ -58,6 +58,9 @@
  • Race condition in triggers could cause various NullPointerExceptions. (issue 29790) +
  • + Allow plugins to augment or replace the plugin manager UI. + (PR 1788)

    What's new in 1.626 (2015/08/23)

    From 8e97fd1c5cd6e809fb1a4b9521af83862220686f Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 25 Aug 2015 01:17:07 +0300 Subject: [PATCH 8/8] commons-compress -> 1.10 --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index a230835039ab..41c9fec6696d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -279,7 +279,7 @@ THE SOFTWARE. org.apache.commons commons-compress - 1.9 + 1.10 javax.mail