@ -46,6 +46,8 @@ import java.io.Closeable;
import java.io.IOException ;
import java.io.IOException ;
import java.io.OutputStream ;
import java.io.OutputStream ;
import java.text.MessageFormat ;
import java.text.MessageFormat ;
import java.util.Collection ;
import java.util.Iterator ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.ConcurrentMap ;
import java.util.concurrent.ConcurrentMap ;
@ -151,6 +153,18 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
* /
* /
void putEntry ( T out , String path , FileMode mode ,
void putEntry ( T out , String path , FileMode mode ,
ObjectLoader loader ) throws IOException ;
ObjectLoader loader ) throws IOException ;
/ * *
* Filename suffixes representing this format ( e . g . ,
* { ".tar.gz" , ".tgz" } ) .
*
* The behavior is undefined when suffixes overlap ( if
* one format claims suffix ".7z" , no other format should
* take ".tar.7z" ) .
*
* @return this format ' s suffixes
* /
Iterable < String > suffixes ( ) ;
}
}
/ * *
/ * *
@ -199,6 +213,8 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
* An archival format with that name was already registered .
* An archival format with that name was already registered .
* /
* /
public static void registerFormat ( String name , Format < ? > fmt ) {
public static void registerFormat ( String name , Format < ? > fmt ) {
// TODO(jrn): Check that suffixes don't overlap.
if ( formats . putIfAbsent ( name , fmt ) ! = null )
if ( formats . putIfAbsent ( name , fmt ) ! = null )
throw new JGitInternalException ( MessageFormat . format (
throw new JGitInternalException ( MessageFormat . format (
JGitText . get ( ) . archiveFormatAlreadyRegistered ,
JGitText . get ( ) . archiveFormatAlreadyRegistered ,
@ -220,6 +236,16 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
name ) ) ;
name ) ) ;
}
}
private static Format < ? > formatBySuffix ( String filenameSuffix )
throws UnsupportedFormatException {
if ( filenameSuffix ! = null )
for ( Format < ? > fmt : formats . values ( ) )
for ( String sfx : fmt . suffixes ( ) )
if ( filenameSuffix . endsWith ( sfx ) )
return fmt ;
return lookupFormat ( "tar" ) ;
}
private static Format < ? > lookupFormat ( String formatName ) throws UnsupportedFormatException {
private static Format < ? > lookupFormat ( String formatName ) throws UnsupportedFormatException {
Format < ? > fmt = formats . get ( formatName ) ;
Format < ? > fmt = formats . get ( formatName ) ;
if ( fmt = = null )
if ( fmt = = null )
@ -229,7 +255,10 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
private OutputStream out ;
private OutputStream out ;
private ObjectId tree ;
private ObjectId tree ;
private String format = "tar" ;
private String format ;
/** Filename suffix, for automatically choosing a format. */
private String suffix ;
/ * *
/ * *
* @param repo
* @param repo
@ -282,7 +311,11 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
public OutputStream call ( ) throws GitAPIException {
public OutputStream call ( ) throws GitAPIException {
checkCallable ( ) ;
checkCallable ( ) ;
final Format < ? > fmt = lookupFormat ( format ) ;
final Format < ? > fmt ;
if ( format = = null )
fmt = formatBySuffix ( suffix ) ;
else
fmt = lookupFormat ( format ) ;
return writeArchive ( fmt ) ;
return writeArchive ( fmt ) ;
}
}
@ -300,6 +333,26 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
return this ;
return this ;
}
}
/ * *
* Set the intended filename for the produced archive .
* Currently the only effect is to determine the default
* archive format when none is specified with
* { @link # setFormat ( String ) } .
*
* @param filename
* intended filename for the archive
* /
public ArchiveCommand setFilename ( String filename ) {
int slash = filename . lastIndexOf ( '/' ) ;
int dot = filename . indexOf ( '.' , slash + 1 ) ;
if ( dot = = - 1 )
this . suffix = "" ;
else
this . suffix = filename . substring ( dot ) ;
return this ;
}
/ * *
/ * *
* @param out
* @param out
* the stream to which to write the archive
* the stream to which to write the archive
@ -312,7 +365,9 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
/ * *
/ * *
* @param fmt
* @param fmt
* archive format ( e . g . , "tar" or "zip" )
* archive format ( e . g . , "tar" or "zip" ) .
* null means to choose automatically based on
* the archive filename .
* @return this
* @return this
* /
* /
public ArchiveCommand setFormat ( String fmt ) {
public ArchiveCommand setFormat ( String fmt ) {