]> source.dussan.org Git - jgit.git/commitdiff
archive: Add --format option that switches between formats 17/9017/3
authorJonathan Nieder <jrn@google.com>
Tue, 4 Dec 2012 00:06:48 +0000 (16:06 -0800)
committerJonathan Nieder <jrn@google.com>
Tue, 4 Dec 2012 23:36:32 +0000 (15:36 -0800)
Prepare for .tar support.

Change-Id: Ieb07702da1a54b41ae764fbb425f70826907b593
Improved-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit.pgm/META-INF/MANIFEST.MF
org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/CLIText.properties
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Archive.java
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/CLIText.java

index 57b59afbc0ef59aaf62398ddd0d84de0ac202334..247f93cb2009855a80ad7d4995ac702d8ca97fd9 100644 (file)
@@ -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)",
index 2afaa12f9fa5a8f205db26087709c4ab060293b5..fe70e71329b589bed9c536fae5417dd83e68f578 100644 (file)
@@ -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
index cc2f287b2ad7d038ea49d8fc25c85da6426002a3..ad326382323b86605f6dce57bbb6c135fd4e0203 100644 (file)
@@ -45,8 +45,14 @@ package org.eclipse.jgit.pgm;
 
 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.pgm.TextBuiltin;
 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 @@ class Archive extends TextBuiltin {
                                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;
+       }
 }
index 2228555df5402989019ab90ab54bf0f8f81390d7..ecf5e8d3a313908425533e6a984cb90bd867c45e 100644 (file)
@@ -139,6 +139,7 @@ public class CLIText extends TranslationBundle {
        /***/ 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;