]> source.dussan.org Git - jgit.git/commitdiff
Set commit time to ZipArchiveEntry 16/91116/6
authorNaoki Takezoe <takezoe@gmail.com>
Thu, 29 Dec 2016 04:47:17 +0000 (13:47 +0900)
committerMatthias Sohn <matthias.sohn@sap.com>
Sat, 18 Feb 2017 09:47:27 +0000 (10:47 +0100)
Archived zip files for a same commit have different MD5 hash because
mdate and mdate in the header of zip entries are not specified. In
this case, Commons Compress sets an archived time.

In the original git implementation, it's set a commit time:
https://github.com/git/git/blob/e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44/archive.c#L378

By this fix, archive command sets the commit time to ZipArchiveEntry
when RevCommit is given as an archiving target.

Change-Id: I30dd8710e910cdf42d57742f8709e9803930a123
Signed-off-by: Naoki Takezoe <takezoe@gmail.com>
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
org.eclipse.jgit.archive/META-INF/MANIFEST.MF
org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TarFormat.java
org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/Tbz2Format.java
org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TgzFormat.java
org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/TxzFormat.java
org.eclipse.jgit.archive/src/org/eclipse/jgit/archive/ZipFormat.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ArchiveCommandTest.java
org.eclipse.jgit/.settings/.api_filters
org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java

index b477de5f07c885f44cb1707350b474c759d3909e..53c9b595c27bf0e46f24d5df5daebfb4e2f38ef2 100644 (file)
@@ -15,6 +15,7 @@ Import-Package: org.apache.commons.compress.archivers;version="[1.4,2.0)",
  org.eclipse.jgit.api;version="[4.7.0,4.8.0)",
  org.eclipse.jgit.lib;version="[4.7.0,4.8.0)",
  org.eclipse.jgit.nls;version="[4.7.0,4.8.0)",
+ org.eclipse.jgit.revwalk;version="[4.7.0,4.8.0)",
  org.eclipse.jgit.util;version="[4.7.0,4.8.0)",
  org.osgi.framework;version="[1.3.0,2.0.0)"
 Bundle-ActivationPolicy: lazy
index d56cb35d9d9004902b1ad56a2e54a8a66857e5d4..900f024bfc051fb6a1dafa02e5bd4ae51eaf4921 100644 (file)
@@ -57,6 +57,7 @@ import org.apache.commons.compress.archivers.tar.TarConstants;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.archive.internal.ArchiveText;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 
 /**
@@ -84,9 +85,21 @@ public final class TarFormat extends BaseFormat implements
                return applyFormatOptions(out, o);
        }
 
+       @Deprecated
+       @Override
        public void putEntry(ArchiveOutputStream out,
                        String path, FileMode mode, ObjectLoader loader)
                        throws IOException {
+               putEntry(out, null, path, mode,loader);
+       }
+
+       /**
+        * @since 4.7
+        */
+       @Override
+       public void putEntry(ArchiveOutputStream out,
+                       ObjectId tree, String path, FileMode mode, ObjectLoader loader)
+                       throws IOException {
                if (mode == FileMode.SYMLINK) {
                        final TarArchiveEntry entry = new TarArchiveEntry(
                                        path, TarConstants.LF_SYMLINK);
index f3ab4da43ab8e9c98ba5bbba3290c11c87c7d2b8..bba0293637a7345bb02ab51095291f75bf0906fc 100644 (file)
@@ -53,6 +53,7 @@ import org.apache.commons.compress.archivers.ArchiveOutputStream;
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 
 /**
@@ -80,10 +81,22 @@ public final class Tbz2Format extends BaseFormat implements
                return tarFormat.createArchiveOutputStream(out, o);
        }
 
+       @Deprecated
+       @Override
        public void putEntry(ArchiveOutputStream out,
                        String path, FileMode mode, ObjectLoader loader)
                        throws IOException {
-               tarFormat.putEntry(out, path, mode, loader);
+               putEntry(out, null, path, mode,loader);
+       }
+
+       /**
+        * @since 4.7
+        */
+       @Override
+       public void putEntry(ArchiveOutputStream out,
+                       ObjectId tree, String path, FileMode mode, ObjectLoader loader)
+                       throws IOException {
+               tarFormat.putEntry(out, tree, path, mode, loader);
        }
 
        public Iterable<String> suffixes() {
index 06f09a48870230c177f8a88a507cd73a2fcb8d32..b6bf3ff665ef71337fea58bca4c8dfb3a2253ba4 100644 (file)
@@ -53,6 +53,7 @@ import org.apache.commons.compress.archivers.ArchiveOutputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 
 /**
@@ -80,10 +81,22 @@ public final class TgzFormat extends BaseFormat implements
                return tarFormat.createArchiveOutputStream(out, o);
        }
 
+       @Deprecated
+       @Override
        public void putEntry(ArchiveOutputStream out,
                        String path, FileMode mode, ObjectLoader loader)
                        throws IOException {
-               tarFormat.putEntry(out, path, mode, loader);
+               putEntry(out, null, path, mode,loader);
+       }
+
+       /**
+        * @since 4.7
+        */
+       @Override
+       public void putEntry(ArchiveOutputStream out,
+                       ObjectId tree, String path, FileMode mode, ObjectLoader loader)
+                       throws IOException {
+               tarFormat.putEntry(out, tree, path, mode, loader);
        }
 
        public Iterable<String> suffixes() {
index 14839353d49dbc9046941657d518940392a430e9..76d934f21ccc01390a11f14fbb8838e3a653cdb8 100644 (file)
@@ -53,6 +53,7 @@ import org.apache.commons.compress.archivers.ArchiveOutputStream;
 import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 
 /**
@@ -80,10 +81,22 @@ public final class TxzFormat extends BaseFormat implements
                return tarFormat.createArchiveOutputStream(out, o);
        }
 
+       @Deprecated
+       @Override
        public void putEntry(ArchiveOutputStream out,
                        String path, FileMode mode, ObjectLoader loader)
                        throws IOException {
-               tarFormat.putEntry(out, path, mode, loader);
+               putEntry(out, null, path, mode,loader);
+       }
+
+       /**
+        * @since 4.7
+        */
+       @Override
+       public void putEntry(ArchiveOutputStream out,
+                       ObjectId tree, String path, FileMode mode, ObjectLoader loader)
+                       throws IOException {
+               tarFormat.putEntry(out, tree, path, mode, loader);
        }
 
        public Iterable<String> suffixes() {
index 0e1b2536f23e1fa556f187ccce617c2a45251a39..dfbf2ee62d78ba1b8802e78896fdb25999123436 100644 (file)
@@ -56,7 +56,9 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.eclipse.jgit.api.ArchiveCommand;
 import org.eclipse.jgit.archive.internal.ArchiveText;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.revwalk.RevCommit;
 
 /**
  * PKWARE's ZIP format.
@@ -80,9 +82,21 @@ public final class ZipFormat extends BaseFormat implements
                return applyFormatOptions(new ZipArchiveOutputStream(s), o);
        }
 
+       @Deprecated
+       @Override
        public void putEntry(ArchiveOutputStream out,
                        String path, FileMode mode, ObjectLoader loader)
                        throws IOException {
+               putEntry(out, null, path, mode,loader);
+       }
+
+       /**
+        * @since 4.7
+        */
+       @Override
+       public void putEntry(ArchiveOutputStream out,
+                       ObjectId tree, String path, FileMode mode, ObjectLoader loader)
+                       throws IOException {
                // ZipArchiveEntry detects directories by checking
                // for '/' at the end of the filename.
                if (path.endsWith("/") && mode != FileMode.TREE) //$NON-NLS-1$
@@ -92,6 +106,12 @@ public final class ZipFormat extends BaseFormat implements
                        path = path + "/"; //$NON-NLS-1$
 
                final ZipArchiveEntry entry = new ZipArchiveEntry(path);
+
+               if(tree instanceof RevCommit){
+                       long commitTime = ((RevCommit) tree).getCommitTime();
+                       entry.setTime(commitTime);
+               }
+
                if (mode == FileMode.TREE) {
                        out.putArchiveEntry(entry);
                        out.closeArchiveEntry();
index fc8df42e2694d87d3a2a707702911234aa9f1491..54d58eca4617c0ea6ad09262c0d814299217a996 100644 (file)
@@ -57,6 +57,7 @@ import java.util.Map;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.util.StringUtils;
@@ -203,12 +204,14 @@ public class ArchiveCommandTest extends RepositoryTestCase {
                private final List<String> SUFFIXES = Collections
                                .unmodifiableList(Arrays.asList(".mck"));
 
+               @Override
                public MockOutputStream createArchiveOutputStream(OutputStream s)
                                throws IOException {
                        return createArchiveOutputStream(s,
                                        Collections.<String, Object> emptyMap());
                }
 
+               @Override
                public MockOutputStream createArchiveOutputStream(OutputStream s,
                                Map<String, Object> o) throws IOException {
                        for (Map.Entry<String, Object> p : o.entrySet()) {
@@ -224,11 +227,18 @@ public class ArchiveCommandTest extends RepositoryTestCase {
                        return new MockOutputStream();
                }
 
+               @Override
                public void putEntry(MockOutputStream out, String path, FileMode mode, ObjectLoader loader) {
+                       putEntry(out, null, path, mode, loader);
+               }
+
+               @Override
+               public void putEntry(MockOutputStream out, ObjectId tree, String path, FileMode mode, ObjectLoader loader) {
                        String content = mode != FileMode.TREE ? new String(loader.getBytes()) : null;
                        entries.put(path, content);
                }
 
+               @Override
                public Iterable<String> suffixes() {
                        return SUFFIXES;
                }
index fa8a9cf9a8b2e9792b5395cd6b3202135423f844..418fed6127c524c7ee8b84def5b85ff8b644cb2c 100644 (file)
@@ -1,5 +1,13 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.jgit" version="2">
+    <resource path="src/org/eclipse/jgit/api/ArchiveCommand.java" type="org.eclipse.jgit.api.ArchiveCommand$Format">
+        <filter comment="OSGi semver allows to break implementors in minor releases" id="403804204">
+            <message_arguments>
+                <message_argument value="org.eclipse.jgit.api.ArchiveCommand.Format"/>
+                <message_argument value="putEntry(T, ObjectId, String, FileMode, ObjectLoader)"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="src/org/eclipse/jgit/transport/http/HttpConnection.java" type="org.eclipse.jgit.transport.http.HttpConnection">
         <filter comment="OSGi semantic versioning rules allow to break implementors in minor releases" id="403767336">
             <message_arguments>
index 8543bd5f6a1136cf4b6401c5f2fa8714d8cc4394..6c7dca5c2e357da5ddda91e0a8f751fcc3f64a66 100644 (file)
@@ -162,8 +162,8 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
                 * @param out
                 *            archive object from createArchiveOutputStream
                 * @param path
-                *            full filename relative to the root of the archive
-                *            (with trailing '/' for directories)
+                *            full filename relative to the root of the archive (with
+                *            trailing '/' for directories)
                 * @param mode
                 *            mode (for example FileMode.REGULAR_FILE or
                 *            FileMode.SYMLINK)
@@ -171,9 +171,36 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
                 *            blob object with data for this entry (null for
                 *            directories)
                 * @throws IOException
-                *            thrown by the underlying output stream for I/O errors
+                *             thrown by the underlying output stream for I/O errors
+                * @deprecated use
+                *             {@link #putEntry(Closeable, ObjectId, String, FileMode, ObjectLoader)}
+                *             instead
                 */
+               @Deprecated
                void putEntry(T out, String path, FileMode mode,
+                                         ObjectLoader loader) throws IOException;
+
+               /**
+                * Write an entry to an archive.
+                *
+                * @param out
+                *            archive object from createArchiveOutputStream
+                * @param tree
+                *            the tag, commit, or tree object to produce an archive for
+                * @param path
+                *            full filename relative to the root of the archive (with
+                *            trailing '/' for directories)
+                * @param mode
+                *            mode (for example FileMode.REGULAR_FILE or
+                *            FileMode.SYMLINK)
+                * @param loader
+                *            blob object with data for this entry (null for
+                *            directories)
+                * @throws IOException
+                *             thrown by the underlying output stream for I/O errors
+                * @since 4.7
+                */
+               void putEntry(T out, ObjectId tree, String path, FileMode mode,
                                ObjectLoader loader) throws IOException;
 
                /**
@@ -389,11 +416,11 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
                                                mode = FileMode.TREE;
 
                                        if (mode == FileMode.TREE) {
-                                               fmt.putEntry(outa, name + "/", mode, null); //$NON-NLS-1$
+                                               fmt.putEntry(outa, tree, name + "/", mode, null); //$NON-NLS-1$
                                                continue;
                                        }
                                        walk.getObjectId(idBuf, 0);
-                                       fmt.putEntry(outa, name, mode, reader.open(idBuf));
+                                       fmt.putEntry(outa, tree, name, mode, reader.open(idBuf));
                                }
                                outa.close();
                                return out;