@ -46,6 +46,7 @@ import java.io.File;
import java.io.FileInputStream ;
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.net.URI ;
import java.net.URI ;
import java.net.URISyntaxException ;
import java.net.URISyntaxException ;
import java.nio.channels.FileChannel ;
import java.nio.channels.FileChannel ;
@ -114,6 +115,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
private String branch ;
private String branch ;
private PersonIdent author ;
private PersonIdent author ;
private RemoteReader callback ;
private RemoteReader callback ;
private InputStream inputStream ;
private List < Project > bareProjects ;
private List < Project > bareProjects ;
private Git git ;
private Git git ;
@ -249,6 +251,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
private static class XmlManifest extends DefaultHandler {
private static class XmlManifest extends DefaultHandler {
private final RepoCommand command ;
private final RepoCommand command ;
private final InputStream inputStream ;
private final String filename ;
private final String filename ;
private final String baseUrl ;
private final String baseUrl ;
private final Map < String , String > remotes ;
private final Map < String , String > remotes ;
@ -259,8 +262,10 @@ public class RepoCommand extends GitCommand<RevCommit> {
private String defaultRevision ;
private String defaultRevision ;
private Project currentProject ;
private Project currentProject ;
XmlManifest ( RepoCommand command , String filename , String baseUrl , String groups ) {
XmlManifest ( RepoCommand command , InputStream inputStream ,
String filename , String baseUrl , String groups ) {
this . command = command ;
this . command = command ;
this . inputStream = inputStream ;
this . filename = filename ;
this . filename = filename ;
this . baseUrl = baseUrl ;
this . baseUrl = baseUrl ;
remotes = new HashMap < String , String > ( ) ;
remotes = new HashMap < String , String > ( ) ;
@ -288,16 +293,13 @@ public class RepoCommand extends GitCommand<RevCommit> {
throw new IOException ( JGitText . get ( ) . noXMLParserAvailable ) ;
throw new IOException ( JGitText . get ( ) . noXMLParserAvailable ) ;
}
}
xr . setContentHandler ( this ) ;
xr . setContentHandler ( this ) ;
final FileInputStream in = new FileInputStream ( filename ) ;
try {
try {
xr . parse ( new InputSource ( in ) ) ;
xr . parse ( new InputSource ( inputStream ) ) ;
} catch ( SAXException e ) {
} catch ( SAXException e ) {
IOException error = new IOException ( MessageFormat . format (
IOException error = new IOException (
RepoText . get ( ) . errorParsingManifestFile , filename ) ) ;
RepoText . get ( ) . errorParsingManifestFile ) ;
error . initCause ( e ) ;
error . initCause ( e ) ;
throw error ;
throw error ;
} finally {
in . close ( ) ;
}
}
}
}
@ -346,8 +348,11 @@ public class RepoCommand extends GitCommand<RevCommit> {
@Override
@Override
public void endDocument ( ) throws SAXException {
public void endDocument ( ) throws SAXException {
if ( defaultRemote = = null ) {
if ( defaultRemote = = null ) {
if ( filename ! = null )
throw new SAXException ( MessageFormat . format (
throw new SAXException ( MessageFormat . format (
RepoText . get ( ) . errorNoDefault , filename ) ) ;
RepoText . get ( ) . errorNoDefaultFilename , filename ) ) ;
else
throw new SAXException ( RepoText . get ( ) . errorNoDefault ) ;
}
}
final String remoteUrl ;
final String remoteUrl ;
try {
try {
@ -406,7 +411,9 @@ public class RepoCommand extends GitCommand<RevCommit> {
}
}
/ * *
/ * *
* Set path to the manifest XML file
* Set path to the manifest XML file .
*
* Calling { @link # setInputStream } will ignore the path set here .
*
*
* @param path
* @param path
* ( with < code > / < / code > as separator )
* ( with < code > / < / code > as separator )
@ -417,6 +424,20 @@ public class RepoCommand extends GitCommand<RevCommit> {
return this ;
return this ;
}
}
/ * *
* Set the input stream to the manifest XML .
*
* Setting inputStream will ignore the path set .
* It will be closed in { @link # call } .
*
* @param inputStream
* @return this command
* /
public RepoCommand setInputStream ( final InputStream inputStream ) {
this . inputStream = inputStream ;
return this ;
}
/ * *
/ * *
* Set base URI of the pathes inside the XML
* Set base URI of the pathes inside the XML
*
*
@ -496,11 +517,22 @@ public class RepoCommand extends GitCommand<RevCommit> {
@Override
@Override
public RevCommit call ( ) throws GitAPIException {
public RevCommit call ( ) throws GitAPIException {
try {
checkCallable ( ) ;
checkCallable ( ) ;
if ( path = = null | | path . length ( ) = = 0 )
throw new IllegalArgumentException ( JGitText . get ( ) . pathNotConfigured ) ;
if ( uri = = null | | uri . length ( ) = = 0 )
if ( uri = = null | | uri . length ( ) = = 0 )
throw new IllegalArgumentException ( JGitText . get ( ) . uriNotConfigured ) ;
throw new IllegalArgumentException (
JGitText . get ( ) . uriNotConfigured ) ;
if ( inputStream = = null ) {
if ( path = = null | | path . length ( ) = = 0 )
throw new IllegalArgumentException (
JGitText . get ( ) . pathNotConfigured ) ;
try {
inputStream = new FileInputStream ( path ) ;
} catch ( IOException e ) {
throw new IllegalArgumentException (
JGitText . get ( ) . pathNotConfigured ) ;
}
}
if ( repo . isBare ( ) ) {
if ( repo . isBare ( ) ) {
bareProjects = new ArrayList < Project > ( ) ;
bareProjects = new ArrayList < Project > ( ) ;
@ -511,12 +543,21 @@ public class RepoCommand extends GitCommand<RevCommit> {
} else
} else
git = new Git ( repo ) ;
git = new Git ( repo ) ;
XmlManifest manifest = new XmlManifest ( this , path , uri , groups ) ;
XmlManifest manifest = new XmlManifest (
this , inputStream , path , uri , groups ) ;
try {
try {
manifest . read ( ) ;
manifest . read ( ) ;
} catch ( IOException e ) {
} catch ( IOException e ) {
throw new ManifestErrorException ( e ) ;
throw new ManifestErrorException ( e ) ;
}
}
} finally {
try {
if ( inputStream ! = null )
inputStream . close ( ) ;
} catch ( IOException e ) {
// Just ignore it, it's not important.
}
}
if ( repo . isBare ( ) ) {
if ( repo . isBare ( ) ) {
DirCache index = DirCache . newInCore ( ) ;
DirCache index = DirCache . newInCore ( ) ;