Return-Path:
X-Original-To: apmail-ant-notifications-archive@minotaur.apache.org
Delivered-To: apmail-ant-notifications-archive@minotaur.apache.org
Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
by minotaur.apache.org (Postfix) with SMTP id 47D55118E8
for ;
Sun, 21 Sep 2014 09:08:41 +0000 (UTC)
Received: (qmail 35980 invoked by uid 500); 21 Sep 2014 09:08:41 -0000
Delivered-To: apmail-ant-notifications-archive@ant.apache.org
Received: (qmail 35935 invoked by uid 500); 21 Sep 2014 09:08:41 -0000
Mailing-List: contact notifications-help@ant.apache.org; run by ezmlm
Precedence: bulk
List-Help:
List-Unsubscribe:
List-Post:
List-Id:
Reply-To: dev@ant.apache.org
Delivered-To: mailing list notifications@ant.apache.org
Received: (qmail 35926 invoked by uid 99); 21 Sep 2014 09:08:40 -0000
Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org)
(140.211.11.114)
by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 21 Sep 2014 09:08:40 +0000
Received: by tyr.zones.apache.org (Postfix, from userid 65534)
id 9B438A1D1E5; Sun, 21 Sep 2014 09:08:40 +0000 (UTC)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
From: bodewig@apache.org
To: notifications@ant.apache.org
Message-Id: <50b0ae63898d4545aa9075c27c86a587@git.apache.org>
X-Mailer: ASF-Git Admin Mailer
Subject: git commit: port fix for COMPRESS-289 from Commons Compress
Date: Sun, 21 Sep 2014 09:08:40 +0000 (UTC)
Repository: ant
Updated Branches:
refs/heads/master c89d650a9 -> 6d98fbb95
port fix for COMPRESS-289 from Commons Compress
Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/6d98fbb9
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/6d98fbb9
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/6d98fbb9
Branch: refs/heads/master
Commit: 6d98fbb958f80d5539d053f57019155a88119035
Parents: c89d650
Author: Stefan Bodewig
Authored: Sun Sep 21 11:08:22 2014 +0200
Committer: Stefan Bodewig
Committed: Sun Sep 21 11:08:22 2014 +0200
----------------------------------------------------------------------
WHATSNEW | 5 ++++
.../org/apache/tools/tar/TarOutputStream.java | 29 +++++++++++++++-----
2 files changed, 27 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant/blob/6d98fbb9/WHATSNEW
----------------------------------------------------------------------
diff --git a/WHATSNEW b/WHATSNEW
index 0f052c9..43fb6a5 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -32,6 +32,11 @@ Fixed bugs:
a NullPointerException when using FTP.
Bugzilla Report 56873
+ * Long-Name and -link or PAX-header entries in TAR archives
+ always had the current time as last modfication time, creating
+ archives that are different at the byte level each time an
+ archive was built.
+
Other changes:
--------------
http://git-wip-us.apache.org/repos/asf/ant/blob/6d98fbb9/src/main/org/apache/tools/tar/TarOutputStream.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/tar/TarOutputStream.java b/src/main/org/apache/tools/tar/TarOutputStream.java
index 03c8769..8162634 100644
--- a/src/main/org/apache/tools/tar/TarOutputStream.java
+++ b/src/main/org/apache/tools/tar/TarOutputStream.java
@@ -28,6 +28,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.nio.ByteBuffer;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -273,12 +274,12 @@ public class TarOutputStream extends FilterOutputStream {
}
Map paxHeaders = new HashMap();
final String entryName = entry.getName();
- boolean paxHeaderContainsPath = handleLongName(entryName, paxHeaders, "path",
+ boolean paxHeaderContainsPath = handleLongName(entry, entryName, paxHeaders, "path",
TarConstants.LF_GNUTYPE_LONGNAME, "file name");
final String linkName = entry.getLinkName();
- boolean paxHeaderContainsLinkPath = linkName != null
- && handleLongName(linkName, paxHeaders, "linkpath",
+ boolean paxHeaderContainsLinkPath = linkName != null && linkName.length() > 0
+ && handleLongName(entry, linkName, paxHeaders, "linkpath",
TarConstants.LF_GNUTYPE_LONGLINK, "link name");
if (bigNumberMode == BIGNUMBER_POSIX) {
@@ -299,7 +300,7 @@ public class TarOutputStream extends FilterOutputStream {
}
if (paxHeaders.size() > 0) {
- writePaxHeaders(entryName, paxHeaders);
+ writePaxHeaders(entry, entryName, paxHeaders);
}
entry.writeEntryHeader(recordBuf, encoding,
@@ -465,7 +466,8 @@ public class TarOutputStream extends FilterOutputStream {
/**
* Writes a PAX extended header with the given map as contents.
*/
- void writePaxHeaders(String entryName,
+ void writePaxHeaders(TarEntry entry,
+ String entryName,
Map headers) throws IOException {
String name = "./PaxHeaders.X/" + stripTo7Bits(entryName);
if (name.length() >= TarConstants.NAMELEN) {
@@ -478,6 +480,7 @@ public class TarOutputStream extends FilterOutputStream {
}
TarEntry pex = new TarEntry(name,
TarConstants.LF_PAX_EXTENDED_HEADER_LC);
+ transferModTime(entry, pex);
StringWriter w = new StringWriter();
for (Map.Entry h : headers.entrySet()) {
@@ -537,7 +540,8 @@ public class TarOutputStream extends FilterOutputStream {
TarConstants.MAXSIZE);
addPaxHeaderForBigNumber(paxHeaders, "gid", entry.getGroupId(),
TarConstants.MAXID);
- addPaxHeaderForBigNumber(paxHeaders, "mtime", entry.getModTime().getTime() / 1000,
+ addPaxHeaderForBigNumber(paxHeaders, "mtime",
+ entry.getModTime().getTime() / 1000,
TarConstants.MAXSIZE);
addPaxHeaderForBigNumber(paxHeaders, "uid", entry.getUserId(),
TarConstants.MAXID);
@@ -594,6 +598,7 @@ public class TarOutputStream extends FilterOutputStream {
* it truncates the name if longFileMode is TRUNCATE
*
*
+ * @param entry entry the name belongs to
* @param name the name to write
* @param paxHeaders current map of pax headers
* @param paxHeaderName name of the pax header to write
@@ -601,7 +606,7 @@ public class TarOutputStream extends FilterOutputStream {
* @param fieldName the name of the field
* @return whether a pax header has been written.
*/
- private boolean handleLongName(String name,
+ private boolean handleLongName(TarEntry entry , String name,
Map paxHeaders,
String paxHeaderName, byte linkType, String fieldName)
throws IOException {
@@ -619,6 +624,7 @@ public class TarOutputStream extends FilterOutputStream {
new TarEntry(TarConstants.GNU_LONGLINK, linkType);
longLinkEntry.setSize(len + 1); // +1 for NUL
+ transferModTime(entry, longLinkEntry);
putNextEntry(longLinkEntry);
write(encodedName.array(), encodedName.arrayOffset(), len);
write(0); // NUL terminator
@@ -631,4 +637,13 @@ public class TarOutputStream extends FilterOutputStream {
}
return false;
}
+
+ private void transferModTime(TarEntry from, TarEntry to) {
+ Date fromModTime = from.getModTime();
+ long fromModTimeSeconds = fromModTime.getTime() / 1000;
+ if (fromModTimeSeconds < 0 || fromModTimeSeconds > TarConstants.MAXSIZE) {
+ fromModTime = new Date(0);
+ }
+ to.setModTime(fromModTime);
+ }
}