archive: Add --format option that switches between formats
Prepare for .tar support. Change-Id: Ieb07702da1a54b41ae764fbb425f70826907b593 Improved-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
7123cbf470
commit
345ab401ce
|
@ -6,7 +6,8 @@ Bundle-Version: 2.2.0.qualifier
|
|||
Bundle-Vendor: %provider_name
|
||||
Bundle-Localization: plugin
|
||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||
Import-Package: org.apache.commons.compress.archivers.zip;version="[1.3,2.0)",
|
||||
Import-Package: org.apache.commons.compress.archivers;version="[1.3,2.0)",
|
||||
org.apache.commons.compress.archivers.zip;version="[1.3,2.0)",
|
||||
org.eclipse.jgit.api;version="[2.2.0,2.3.0)",
|
||||
org.eclipse.jgit.api.errors;version="[2.2.0,2.3.0)",
|
||||
org.eclipse.jgit.awtui;version="[2.2.0,2.3.0)",
|
||||
|
|
|
@ -71,6 +71,7 @@ mergeMadeBy=Merge made by the ''{0}'' strategy.
|
|||
mergedSquashed=Squash commit -- not updating HEAD\nAutomatic merge went well; stopped before committing as requested
|
||||
metaVar_DAG=DAG
|
||||
metaVar_KEY=KEY
|
||||
metaVar_archiveFormat=format
|
||||
metaVar_arg=ARG
|
||||
metaVar_author=AUTHOR
|
||||
metaVar_base=base
|
||||
|
@ -196,6 +197,7 @@ usage_addFileContentsToTheIndex=Add file contents to the index
|
|||
usage_alterTheDetailShown=alter the detail shown
|
||||
usage_approveDestructionOfRepository=approve destruction of repository
|
||||
usage_archive=zip up files from the named tree
|
||||
usage_archiveFormat=archive format. Currently supported formats: 'zip'
|
||||
usage_blameLongRevision=show long revision
|
||||
usage_blameRange=annotate only the given range
|
||||
usage_blameRawTimestamp=show raw timestamp
|
||||
|
|
|
@ -45,8 +45,14 @@
|
|||
|
||||
import java.lang.String;
|
||||
import java.lang.System;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.EnumMap;
|
||||
import java.util.Map;
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.apache.commons.compress.archivers.ArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.ArchiveOutputStream;
|
||||
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
||||
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
|
||||
import org.eclipse.jgit.lib.FileMode;
|
||||
|
@ -58,18 +64,23 @@
|
|||
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
|
||||
import org.eclipse.jgit.treewalk.TreeWalk;
|
||||
import org.kohsuke.args4j.Argument;
|
||||
import org.kohsuke.args4j.Option;
|
||||
|
||||
@Command(common = true, usage = "usage_archive")
|
||||
class Archive extends TextBuiltin {
|
||||
@Argument(index = 0, metaVar = "metaVar_treeish")
|
||||
private AbstractTreeIterator tree;
|
||||
|
||||
@Option(name = "--format", metaVar = "metaVar_archiveFormat", usage = "usage_archiveFormat")
|
||||
private Format format = Format.ZIP;
|
||||
|
||||
@Override
|
||||
protected void run() throws Exception {
|
||||
final TreeWalk walk = new TreeWalk(db);
|
||||
final ObjectReader reader = walk.getObjectReader();
|
||||
final MutableObjectId idBuf = new MutableObjectId();
|
||||
final ZipArchiveOutputStream out = new ZipArchiveOutputStream(outs);
|
||||
final Archiver fmt = formats.get(format);
|
||||
final ArchiveOutputStream out = fmt.createArchiveOutputStream(outs);
|
||||
|
||||
if (tree == null)
|
||||
throw die(CLIText.get().treeIsRequired);
|
||||
|
@ -87,25 +98,57 @@ protected void run() throws Exception {
|
|||
continue;
|
||||
|
||||
walk.getObjectId(idBuf, 0);
|
||||
final ZipArchiveEntry entry = new ZipArchiveEntry(name);
|
||||
final ObjectLoader loader = reader.open(idBuf);
|
||||
entry.setSize(loader.getSize());
|
||||
|
||||
if (mode == FileMode.REGULAR_FILE)
|
||||
; // ok
|
||||
else if (mode == FileMode.EXECUTABLE_FILE ||
|
||||
mode == FileMode.SYMLINK)
|
||||
entry.setUnixMode(mode.getBits());
|
||||
else
|
||||
System.err.println(MessageFormat.format( //
|
||||
CLIText.get().archiveEntryModeIgnored, //
|
||||
name));
|
||||
|
||||
out.putArchiveEntry(entry);
|
||||
loader.copyTo(out);
|
||||
out.closeArchiveEntry();
|
||||
fmt.putEntry(name, mode, reader.open(idBuf), out);
|
||||
}
|
||||
|
||||
out.close();
|
||||
}
|
||||
|
||||
static private void warnArchiveEntryModeIgnored(String name) {
|
||||
System.err.println(MessageFormat.format( //
|
||||
CLIText.get().archiveEntryModeIgnored, //
|
||||
name));
|
||||
}
|
||||
|
||||
public enum Format {
|
||||
ZIP
|
||||
};
|
||||
|
||||
private static interface Archiver {
|
||||
ArchiveOutputStream createArchiveOutputStream(OutputStream s);
|
||||
void putEntry(String path, FileMode mode, //
|
||||
ObjectLoader loader, ArchiveOutputStream out) //
|
||||
throws IOException;
|
||||
}
|
||||
|
||||
private static final Map<Format, Archiver> formats;
|
||||
static {
|
||||
Map<Format, Archiver> fmts = new EnumMap<Format, Archiver>(Format.class);
|
||||
fmts.put(Format.ZIP, new Archiver() {
|
||||
@Override
|
||||
public ArchiveOutputStream createArchiveOutputStream(OutputStream s) {
|
||||
return new ZipArchiveOutputStream(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putEntry(String path, FileMode mode, //
|
||||
ObjectLoader loader, ArchiveOutputStream out) //
|
||||
throws IOException {
|
||||
final ZipArchiveEntry entry = new ZipArchiveEntry(path);
|
||||
|
||||
if (mode == FileMode.REGULAR_FILE)
|
||||
; // ok
|
||||
else if (mode == FileMode.EXECUTABLE_FILE ||
|
||||
mode == FileMode.SYMLINK)
|
||||
entry.setUnixMode(mode.getBits());
|
||||
else
|
||||
warnArchiveEntryModeIgnored(path);
|
||||
entry.setSize(loader.getSize());
|
||||
out.putArchiveEntry(entry);
|
||||
loader.copyTo(out);
|
||||
out.closeArchiveEntry();
|
||||
}
|
||||
});
|
||||
formats = fmts;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -139,6 +139,7 @@ public static String formatLine(String line) {
|
|||
/***/ public String mergeMadeBy;
|
||||
/***/ public String mergedSquashed;
|
||||
/***/ public String metaVar_KEY;
|
||||
/***/ public String metaVar_archiveFormat;
|
||||
/***/ public String metaVar_arg;
|
||||
/***/ public String metaVar_author;
|
||||
/***/ public String metaVar_bucket;
|
||||
|
|
Loading…
Reference in New Issue