From a66e60a98620c5ba9cd3d9fc8f97f268229589e6 Mon Sep 17 00:00:00 2001 From: Yasuhiro Takagi Date: Sat, 29 Apr 2017 20:35:10 +0900 Subject: [PATCH] ArchiveCommand: Create prefix entry with commit time The cgit archive command creates a prefix (root) directory entry in the archive file. That entry's time is set to the commit time. This patch makes jgit's behavior consistent with with cgit: prefix: hoge/ -> creates prefix directory "hoge/" entry. prefix: hoge//// -> creates prefix directory "hoge/" entry. prefix: hoge/foo -> does not create prefix directory entry, but for each file/directory entry, prefix is added. Change-Id: I2610e40ce37972c5f7456fdca6337e7fb07176e5 Signed-off-by: Yasuhiro Takagi --- .../tst/org/eclipse/jgit/pgm/ArchiveTest.java | 8 ++++---- .../src/org/eclipse/jgit/api/ArchiveCommand.java | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java index 18c49ea286..6f32bfaa52 100644 --- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ArchiveTest.java @@ -348,7 +348,7 @@ public class ArchiveTest extends CLIRepositoryTestCase { commitBazAndFooSlashBar(); byte[] result = CLIGitCommand.executeRaw( "git archive --prefix=x/ --format=zip master", db).outBytes(); - String[] expect = { "x/baz", "x/foo/", "x/foo/bar" }; + String[] expect = { "x/", "x/baz", "x/foo/", "x/foo/bar" }; String[] actual = listZipEntries(result); Arrays.sort(expect); @@ -361,7 +361,7 @@ public class ArchiveTest extends CLIRepositoryTestCase { commitBazAndFooSlashBar(); byte[] result = CLIGitCommand.executeRaw( "git archive --prefix=x/ --format=tar master", db).outBytes(); - String[] expect = { "x/baz", "x/foo/", "x/foo/bar" }; + String[] expect = { "x/", "x/baz", "x/foo/", "x/foo/bar" }; String[] actual = listTarEntries(result); Arrays.sort(expect); @@ -380,7 +380,7 @@ public class ArchiveTest extends CLIRepositoryTestCase { commitFoo(); byte[] result = CLIGitCommand.executeRaw( "git archive --prefix=x// --format=zip master", db).outBytes(); - String[] expect = { "x//foo" }; + String[] expect = { "x/", "x//foo" }; assertArrayEquals(expect, listZipEntries(result)); } @@ -389,7 +389,7 @@ public class ArchiveTest extends CLIRepositoryTestCase { commitFoo(); byte[] result = CLIGitCommand.executeRaw( "git archive --prefix=x// --format=tar master", db).outBytes(); - String[] expect = { "x//foo" }; + String[] expect = { "x/", "x//foo" }; assertArrayEquals(expect, listTarEntries(result)); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java index 0d18eb3d07..7ea8e73b36 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java @@ -403,6 +403,12 @@ public class ArchiveCommand extends GitCommand { if (!paths.isEmpty()) walk.setFilter(PathFilterGroup.createFromStrings(paths)); + // Put base directory into archive + if (pfx.endsWith("/")) { //$NON-NLS-1$ + fmt.putEntry(outa, tree, pfx.replaceAll("[/]+$", "/"), //$NON-NLS-1$ //$NON-NLS-2$ + FileMode.TREE, null); + } + while (walk.next()) { String name = pfx + walk.getPathString(); FileMode mode = walk.getFileMode(0); -- 2.39.5