Added setInputStream to RepoCommand.

Sometimes an input stream is more useful than the filename of the xml manifest.

Change-Id: Icb09ac751b3d8d7eb14427ad1aac8cee0c371c5f
Signed-off-by: Yuxuan 'fishy' Wang <fishywang@google.com>
This commit is contained in:
Yuxuan 'fishy' Wang 2014-06-05 13:53:28 -07:00 committed by Dave Borowitz
parent c8ddac2a86
commit acd7ed5269
3 changed files with 74 additions and 31 deletions

View File

@ -1,6 +1,7 @@
copyFileFailed=Error occurred during execution of copyfile rule.
errorNoDefault=Error: no default remote in file {0}.
errorParsingManifestFile=Error occurred during parsing manifest file {0}.
errorNoDefault=Error: no default remote in manifest file.
errorNoDefaultFilename=Error: no default remote in manifest file {0}.
errorParsingManifestFile=Error occurred during parsing manifest file.
errorRemoteUnavailable=Error remote {0} is unavailable.
invalidManifest=Invalid manifest.
repoCommitMessage=Added repo manifest.

View File

@ -46,6 +46,7 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.channels.FileChannel;
@ -114,6 +115,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
private String branch;
private PersonIdent author;
private RemoteReader callback;
private InputStream inputStream;
private List<Project> bareProjects;
private Git git;
@ -249,6 +251,7 @@ void addCopyFile(CopyFile copyfile) {
private static class XmlManifest extends DefaultHandler {
private final RepoCommand command;
private final InputStream inputStream;
private final String filename;
private final String baseUrl;
private final Map<String, String> remotes;
@ -259,8 +262,10 @@ private static class XmlManifest extends DefaultHandler {
private String defaultRevision;
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.inputStream = inputStream;
this.filename = filename;
this.baseUrl = baseUrl;
remotes = new HashMap<String, String>();
@ -288,16 +293,13 @@ void read() throws IOException {
throw new IOException(JGitText.get().noXMLParserAvailable);
}
xr.setContentHandler(this);
final FileInputStream in = new FileInputStream(filename);
try {
xr.parse(new InputSource(in));
xr.parse(new InputSource(inputStream));
} catch (SAXException e) {
IOException error = new IOException(MessageFormat.format(
RepoText.get().errorParsingManifestFile, filename));
IOException error = new IOException(
RepoText.get().errorParsingManifestFile);
error.initCause(e);
throw error;
} finally {
in.close();
}
}
@ -346,8 +348,11 @@ public void endElement(
@Override
public void endDocument() throws SAXException {
if (defaultRemote == null) {
throw new SAXException(MessageFormat.format(
RepoText.get().errorNoDefault, filename));
if (filename != null)
throw new SAXException(MessageFormat.format(
RepoText.get().errorNoDefaultFilename, filename));
else
throw new SAXException(RepoText.get().errorNoDefault);
}
final String remoteUrl;
try {
@ -406,7 +411,9 @@ public RepoCommand(final Repository repo) {
}
/**
* 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
* (with <code>/</code> as separator)
@ -417,6 +424,20 @@ public RepoCommand setPath(final String path) {
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
*
@ -496,26 +517,46 @@ public RepoCommand setRemoteReader(final RemoteReader callback) {
@Override
public RevCommit call() throws GitAPIException {
checkCallable();
if (path == null || path.length() == 0)
throw new IllegalArgumentException(JGitText.get().pathNotConfigured);
if (uri == null || uri.length() == 0)
throw new IllegalArgumentException(JGitText.get().uriNotConfigured);
if (repo.isBare()) {
bareProjects = new ArrayList<Project>();
if (author == null)
author = new PersonIdent(repo);
if (callback == null)
callback = new DefaultRemoteReader();
} else
git = new Git(repo);
XmlManifest manifest = new XmlManifest(this, path, uri, groups);
try {
manifest.read();
} catch (IOException e) {
throw new ManifestErrorException(e);
checkCallable();
if (uri == null || uri.length() == 0)
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()) {
bareProjects = new ArrayList<Project>();
if (author == null)
author = new PersonIdent(repo);
if (callback == null)
callback = new DefaultRemoteReader();
} else
git = new Git(repo);
XmlManifest manifest = new XmlManifest(
this, inputStream, path, uri, groups);
try {
manifest.read();
} catch (IOException 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()) {

View File

@ -61,6 +61,7 @@ public static RepoText get() {
// @formatter:off
/***/ public String copyFileFailed;
/***/ public String errorNoDefault;
/***/ public String errorNoDefaultFilename;
/***/ public String errorParsingManifestFile;
/***/ public String errorRemoteUnavailable;
/***/ public String invalidManifest;