Drop dependency by ArchiveCommand.Format interface on commons-compress

Otherwise, anyone trying to implement a new format would have to
depend on commons-compress, even if using a different underlying
library to write the archive.

Change-Id: I301a1997e3b48aa7e32d693fd8f4b2d436c9b3a7
This commit is contained in:
Jonathan Nieder 2013-05-23 16:53:57 -07:00
parent d8177d6e19
commit cfc15dd9dc
3 changed files with 27 additions and 18 deletions

View File

@ -42,13 +42,13 @@
*/
package org.eclipse.jgit.pgm.archive;
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.GitCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
@ -103,7 +103,7 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
*
* Usage:
* Repository repo = git.getRepository();
* ArchiveOutputStream out = format.createArchiveOutputStream(System.out);
* T out = format.createArchiveOutputStream(System.out);
* try {
* for (...) {
* format.putEntry(out, path, mode, repo.open(objectId));
@ -112,9 +112,9 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
* out.close();
* }
*/
public static interface Format {
ArchiveOutputStream createArchiveOutputStream(OutputStream s);
void putEntry(ArchiveOutputStream out, String path, FileMode mode,
public static interface Format<T extends Closeable> {
T createArchiveOutputStream(OutputStream s);
void putEntry(T out, String path, FileMode mode,
ObjectLoader loader) throws IOException;
}
@ -143,16 +143,20 @@ public String getFormat() {
}
}
private static final ConcurrentMap<String, Format> formats =
new ConcurrentHashMap<String, Format>();
/**
* Available archival formats (corresponding to values for
* the --format= option)
*/
private static final ConcurrentMap<String, Format<?>> formats =
new ConcurrentHashMap<String, Format<?>>();
static {
formats.put("zip", new ZipFormat());
formats.put("tar", new TarFormat());
}
private static Format lookupFormat(String formatName) throws UnsupportedFormatException {
Format fmt = formats.get(formatName);
private static Format<?> lookupFormat(String formatName) throws UnsupportedFormatException {
Format<?> fmt = formats.get(formatName);
if (fmt == null)
throw new UnsupportedFormatException(formatName);
return fmt;
@ -180,14 +184,10 @@ public void release() {
walk.release();
}
/**
* @return the stream to which the archive has been written
*/
@Override
public OutputStream call() throws GitAPIException {
private <T extends Closeable>
OutputStream writeArchive(Format<T> fmt) throws GitAPIException {
final MutableObjectId idBuf = new MutableObjectId();
final Format fmt = lookupFormat(format);
final ArchiveOutputStream outa = fmt.createArchiveOutputStream(out);
final T outa = fmt.createArchiveOutputStream(out);
final ObjectReader reader = walk.getObjectReader();
try {
@ -217,6 +217,15 @@ public OutputStream call() throws GitAPIException {
return out;
}
/**
* @return the stream to which the archive has been written
*/
@Override
public OutputStream call() throws GitAPIException {
final Format<?> fmt = lookupFormat(format);
return writeArchive(fmt);
}
/**
* @param tree
* the tag, commit, or tree object to produce an archive for

View File

@ -52,7 +52,7 @@
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectLoader;
class TarFormat implements ArchiveCommand.Format {
class TarFormat implements ArchiveCommand.Format<ArchiveOutputStream> {
public ArchiveOutputStream createArchiveOutputStream(OutputStream s) {
return new TarArchiveOutputStream(s);
}

View File

@ -51,7 +51,7 @@
import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectLoader;
class ZipFormat implements ArchiveCommand.Format {
class ZipFormat implements ArchiveCommand.Format<ArchiveOutputStream> {
public ArchiveOutputStream createArchiveOutputStream(OutputStream s) {
return new ZipArchiveOutputStream(s);
}